11package kr .dgucaps .caps .global .config .auth ;
22
3- import jakarta .servlet .ServletException ;
4- import jakarta .servlet .http .Cookie ;
53import jakarta .servlet .http .HttpServletRequest ;
64import jakarta .servlet .http .HttpServletResponse ;
75import kr .dgucaps .caps .domain .member .dto .CustomOAuth2User ;
119import kr .dgucaps .caps .domain .member .service .TokenService ;
1210import lombok .RequiredArgsConstructor ;
1311import org .springframework .beans .factory .annotation .Value ;
12+ import org .springframework .http .ResponseCookie ;
1413import org .springframework .security .core .Authentication ;
1514import org .springframework .security .web .authentication .AuthenticationSuccessHandler ;
1615import org .springframework .stereotype .Component ;
@@ -37,14 +36,13 @@ public class CustomOAuth2SuccessHandler implements AuthenticationSuccessHandler
3736 private String onboardingRedirectUrl ;
3837
3938 @ Override
40- public void onAuthenticationSuccess (HttpServletRequest request , HttpServletResponse response , Authentication authentication ) throws IOException , ServletException {
39+ public void onAuthenticationSuccess (HttpServletRequest request , HttpServletResponse response , Authentication authentication ) throws IOException {
4140 CustomOAuth2User customUser = (CustomOAuth2User ) authentication .getPrincipal ();
4241 Member member = customUser .member ();
4342
4443 // 토큰 발급
4544 MemberTokenResponse tokenResponse = tokenService .issueToken (member .getId (), member .getRole ());
46- response .addCookie (createCookie ("accessToken" , tokenResponse .accessToken (), ACCESS_TOKEN_EXPIRE_TIME ));
47- response .addCookie (createCookie ("refreshToken" , tokenResponse .refreshToken (), REFRESH_TOKEN_EXPIRE_TIME ));
45+ writeTokenCookies (response , tokenResponse );
4846
4947 // 마지막 로그인 시간 업데이트
5048 memberService .updateLastLogin (member );
@@ -57,12 +55,26 @@ public void onAuthenticationSuccess(HttpServletRequest request, HttpServletRespo
5755 }
5856 }
5957
60- private Cookie createCookie (String key , String value , int expireTime ) {
61- Cookie cookie = new Cookie (key , value );
62- cookie .setMaxAge (expireTime );
63- cookie .setSecure (true );
64- cookie .setPath ("/" );
65- cookie .setHttpOnly (true );
66- return cookie ;
58+ private void writeTokenCookies (HttpServletResponse response , MemberTokenResponse token ) {
59+ // 쿠키 설정
60+ ResponseCookie accessToken = ResponseCookie .from ("accessToken" , token .accessToken ())
61+ .path ("/" )
62+ .httpOnly (true )
63+ .secure (true ) // HTTPS 연결에서만 전송
64+ .sameSite ("None" ) // 크로스사이트 요청에도 전송
65+ .maxAge (ACCESS_TOKEN_EXPIRE_TIME )
66+ .build ();
67+
68+ ResponseCookie refreshToken = ResponseCookie .from ("refreshToken" , token .refreshToken ())
69+ .path ("/" )
70+ .httpOnly (true )
71+ .secure (true )
72+ .sameSite ("None" )
73+ .maxAge (REFRESH_TOKEN_EXPIRE_TIME )
74+ .build ();
75+
76+ // 쿠키를 응답 헤더에 추가
77+ response .addHeader ("Set-Cookie" , accessToken .toString ());
78+ response .addHeader ("Set-Cookie" , refreshToken .toString ());
6779 }
6880}
0 commit comments