1. ํ์ฌ ๋ก๊ทธ์ธ ์ฝ๋ ๋ถ์ ๋ฐ ๋ฌธ์ ์
ํ์ฌ ๊ตฌ๊ธ ์์
๋ก๊ทธ์ธ ์ฝ๋ ํ๋ฆ
ํ๋ก ํธ์์ ๊ตฌ๊ธ ๋ก๊ทธ์ธ url ์์ฒญ
http://localhost:8080/oath2/authorization/google
โ ๊ตฌ๊ธ ์ธ์ฆ ์๋ฒ ์ธ์ฆ โ ๊ตฌ๊ธ ๋ฆฌ์์ค ์๋ฒ ์ ๊ทผ โ ์ ์ ์ ๋ณด ์ ์ฅ ๋ฐ ํ ํฐ ์์ฑ โ ํ ํฐ์ redirect URL์ Query String์ผ๋ก ๋ฐ๊ธ
ํ์ฌ redirectUrl์ bidmarket.vercel.app/auth?token=~~ ์ผ๋ก ํ๋์ฝ๋ฉ ๋์ด์๋์ํ
- ํ์ฌ ์ํฉ์์ ํ ํฐ์ ์ฟ ํค์ http only ์ต์ ์ ์ค์ ์ ์ฅํ๊ณ ๋ฉ์ธํ์ด์ง๋ก ๋ฆฌ๋ค์ด๋ ํธ ์์ผ์ฃผ๊ณ ์ถ์
- ์ฐ์ ํ์ฌ ์ฝ๋๊ฐ ์ด๋ป๊ฒ ์๋ํ๋์ง ํ์ ํ ๊ฒ์
ํ์ฌ security ์ฝ๋ ๋ถ์
WebSecurityConfig
ํ์ผ
@Configuration @EnableWebSecurity public class WebSecurityConfig { ...์๋ต @Bean public SecurityFilterChain filterChain(Jwt jwt, HttpSecurity http, OAuth2AuthorizedClientRepository repository, OAuth2AuthenticationSuccessHandler handler ) throws Exception { http.authorizeRequests() ...์๋ต /** * OAuth2 ์ค์ */ .oauth2Login() .authorizationEndpoint() .authorizationRequestRepository(authorizationRequestRepository()) .and() .successHandler(handler) .authorizedClientRepository(repository) .and() ...์๋ต return http.build(); } }
OAuth2AuthenticationSuccessHandler
ํ์ผ
package com.saiko.bidmarket.common.oauth2; import java.io.IOException; import java.nio.charset.StandardCharsets; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.security.core.Authentication; import org.springframework.security.oauth2.client.authentication.OAuth2AuthenticationToken; import org.springframework.security.oauth2.core.user.OAuth2User; import org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler; import com.saiko.bidmarket.common.jwt.Jwt; import com.saiko.bidmarket.user.entity.User; import com.saiko.bidmarket.user.service.UserService; public class OAuth2AuthenticationSuccessHandler extends SavedRequestAwareAuthenticationSuccessHandler { private final Logger log = LoggerFactory.getLogger(this.getClass()); private final Jwt jwt; private final UserService userService; public OAuth2AuthenticationSuccessHandler(Jwt jwt, UserService userService) { this.jwt = jwt; this.userService = userService; } @Override public void onAuthenticationSuccess( HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException { if (authentication instanceof OAuth2AuthenticationToken) { OAuth2AuthenticationToken oauth2Token = (OAuth2AuthenticationToken)authentication; OAuth2User principal = oauth2Token.getPrincipal(); log.debug("Message {}, {}", principal.getName(), principal.getAttributes()); String registrationId = oauth2Token.getAuthorizedClientRegistrationId(); User user = processUserOAuth2UserJoin(principal, registrationId); String loginSuccessJson = generateLoginSuccessJson(user); response.setContentType("application/json;charset=UTF-8"); response.setContentLength(loginSuccessJson.getBytes(StandardCharsets.UTF_8).length); response.sendRedirect("http://localhost:3000/auth?" + loginSuccessJson); } } private User processUserOAuth2UserJoin(OAuth2User oAuth2User, String registrationId) { return userService.join(oAuth2User, registrationId); } private String generateLoginSuccessJson(User user) { String token = generateToken(user); log.debug("Jwt({}) created for oauth2 login user {}", token, user.getId()); return "token=" + token; } private String generateToken(User user) { return jwt.sign(Jwt.Claims.from(user.getId(), new String[]{"ROLE_USER"})); } }
- ๋ก๊ทธ์ธ ์์ฒญ URL
http://localhost:8080/oauth2/authorization/google
HttpCookieOAuth2AuthorizationRequestRepository ์ ๊ฑธ๋ฆฐ ๋๋ฒ๊ทธ



- authorization_uri = https://accounts.google.com/o/oauth2/v2/auth
- redirect_uri = http://localhost:8080/login/oauth2/code/google
AUTHORIZATION_REQUEST ์ฟ ํค ์์ฑ
๊ตฌ๊ธ ์๋ฒ์ AUTHORIZATION_CODE๋ฅผ ์์ฒญํ๋ ์ฟ ํค๋ฅผ ์์ฑ
