1919import com .nowait .externaloauth .jwt .JwtUtil ;
2020import com .nowait .user .entity .User ;
2121
22+ import jakarta .servlet .http .Cookie ;
2223import jakarta .servlet .http .HttpServletRequest ;
2324import jakarta .servlet .http .HttpServletResponse ;
2425import lombok .RequiredArgsConstructor ;
@@ -40,42 +41,32 @@ public class OAuth2LoginSuccessHandler extends SimpleUrlAuthenticationSuccessHan
4041 public void onAuthenticationSuccess (HttpServletRequest request , HttpServletResponse response ,
4142 Authentication authentication ) throws IOException {
4243
43- // 1. CustomOAuth2UserService에서 설정한 OAuth2User 정보 가져오기
44- CustomOAuth2User customUserDetails = (CustomOAuth2User )authentication .getPrincipal ();
45-
44+ CustomOAuth2User customUserDetails = (CustomOAuth2User ) authentication .getPrincipal ();
4645 User user = customUserDetails .getUser ();
4746 Long userId = customUserDetails .getUserId ();
48- String email = customUserDetails .getName ();
49-
50- Collection <? extends GrantedAuthority > authorities = authentication .getAuthorities ();
51- Iterator <? extends GrantedAuthority > iterator = authorities .iterator ();
52- GrantedAuthority auth = iterator .next ();
53-
54- String role = auth .getAuthority ();
47+ String role = authentication .getAuthorities ().iterator ().next ().getAuthority ();
5548
56- log .info ("user, userId, email, role :: {} {} {} {}" , user , userId , email , role );
49+ // JWT 발급
50+ String accessToken = jwtUtil .createAccessToken ("accessToken" , userId , role , 30 * 60 * 1000L ); // 30분
51+ String refreshToken = jwtUtil .createRefreshToken ("refreshToken" , userId , 30L * 24 * 60 * 60 * 1000L ); // 30일
5752
58- // 2. 1)의 사용자 정보를 담아, accessToken과 refreshToken 발행
59- String accessToken = jwtUtil .createAccessToken ("accessToken" , userId , role , 30 * 60 * 1000L ); // 유효기간 30분
60- String refreshToken = jwtUtil .createRefreshToken ("refreshToken" , userId ,
61- 30 * 24 * 60 * 60 * 1000L ); // 유효기간 30일
62-
63- // 3. refreshToken을 DB에 저장
53+ // 1. refreshToken을 DB에 저장
6454 Token refreshTokenEntity = Token .toEntity (user , refreshToken , LocalDateTime .now ().plusDays (30 ));
6555 tokenRepository .save (refreshTokenEntity );
6656
67- // 4. JSON 응답으로, accessToken과 refreshToken 을 반환해준다.
68- response .setContentType ("application/json" );
69- response .setCharacterEncoding ("utf-8" );
57+ // 2. refreshToken을 HttpOnly 쿠키로 설정
58+ Cookie refreshTokenCookie = new Cookie ("refreshToken" , refreshToken );
59+ refreshTokenCookie .setHttpOnly (true ); // JS 접근 불가
60+ refreshTokenCookie .setSecure (false ); // 운영환경 https라면 true로 변경 필요
61+ refreshTokenCookie .setPath ("/" );
62+ refreshTokenCookie .setMaxAge (30 * 24 * 60 * 60 ); // 30일
63+ response .addCookie (refreshTokenCookie );
64+ response .addHeader ("Set-Cookie" , response .getHeader ("Set-Cookie" ) + "; SameSite=Lax" );
65+
7066
71- ObjectMapper objectMapper = new ObjectMapper (); // 객체 -> json 문자열로 변환
72- String body = objectMapper .writeValueAsString (
73- Map .of (
74- "accessToken" , accessToken ,
75- "refreshToken" , refreshToken
76- )
77- );
78- response .getWriter ().write (body );
67+ // 3. 프론트엔드로 리다이렉트 (accessToken만 쿼리로 전달)
68+ String targetUrl = "http://localhost:5173/login/success?accessToken=" + accessToken ;
69+ response .sendRedirect (targetUrl );
7970 }
8071
8172}
0 commit comments