33import jakarta .servlet .http .HttpServletRequest ;
44import jakarta .servlet .http .HttpServletResponse ;
55import lombok .RequiredArgsConstructor ;
6+ import org .springframework .beans .factory .annotation .Value ;
67import org .springframework .http .HttpHeaders ;
78import org .springframework .http .ResponseCookie ;
89import org .springframework .security .core .Authentication ;
1718import org .tuna .zoopzoop .backend .global .security .jwt .JwtUtil ;
1819
1920import java .io .IOException ;
21+ import java .net .URLEncoder ;
2022
2123@ Component
2224@ RequiredArgsConstructor
@@ -27,6 +29,12 @@ public class OAuth2SuccessHandler extends SimpleUrlAuthenticationSuccessHandler
2729 private final MemberRepository memberRepository ;
2830 private final MemberService memberService ;
2931
32+ @ Value ("${front.redirect_domain}" )
33+ private String redirect_domain ;
34+
35+ @ Value ("${spring.profiles.active:dev}" )
36+ private String activeProfile ;
37+
3038 @ Override
3139 public void onAuthenticationSuccess (HttpServletRequest request , HttpServletResponse response ,
3240 Authentication authentication ) throws IOException {
@@ -53,32 +61,49 @@ public void onAuthenticationSuccess(HttpServletRequest request, HttpServletRespo
5361 String accessToken = jwtUtil .generateToken (member );
5462 String refreshToken = jwtUtil .generateRefreshToken (member );
5563
56- ResponseCookie accessCookie = ResponseCookie .from ("accessToken" , accessToken )
57- .httpOnly (true )
58- .path ("/" )
59- .maxAge (jwtProperties .getAccessTokenValidity () / 1000 )
60- // .domain() // 프론트엔드 & 백엔드 상위 도메인
61- // .secure(true) // https 필수 설정.
62- .sameSite ("Lax" )
63- .build ();
64-
65- ResponseCookie refreshCookie = ResponseCookie .from ("refreshToken" , refreshToken )
66- .httpOnly (true )
67- .path ("/" )
68- .maxAge (jwtProperties .getRefreshTokenValidity () / 1000 )
69- // .domain() // 프론트엔드 & 백엔드 상위 도메인
70- // .secure(true) // https 필수 설정.
71- .sameSite ("Lax" )
72- .build ();
73-
74- // HTTP 응답에서 쿠키 값 추가.
75- response .addHeader (HttpHeaders .SET_COOKIE , accessCookie .toString ());
76- response .addHeader (HttpHeaders .SET_COOKIE , refreshCookie .toString ());
77-
78- // 로그인 성공 후 리다이렉트.
79- // 배포 시에 프론트엔드와 조율이 필요한 부분일 듯 함.
80- response .sendRedirect ("/login-success" );
64+ if ("server" .equals (activeProfile )) {
65+ // server 환경일 때: URL 파라미터로 토큰 전달
66+ String redirectUrl = redirect_domain + "/auth/callback"
67+ + "?success=true"
68+ + "&accessToken=" + URLEncoder .encode (accessToken , "UTF-8" )
69+ + "&refreshToken=" + URLEncoder .encode (refreshToken , "UTF-8" );
70+ response .sendRedirect (redirectUrl );
71+ } else {
72+ ResponseCookie accessCookie = ResponseCookie .from ("accessToken" , accessToken )
73+ .httpOnly (true )
74+ .path ("/" )
75+ .maxAge (jwtProperties .getAccessTokenValidity () / 1000 )
76+ // .domain() // 프론트엔드 & 백엔드 상위 도메인
77+ // .secure(true) // https 필수 설정.
78+ .domain (redirect_domain )
79+ .secure (true )
80+ .sameSite ("None" )
81+ .build ();
82+
83+ ResponseCookie refreshCookie = ResponseCookie .from ("refreshToken" , refreshToken )
84+ .httpOnly (true )
85+ .path ("/" )
86+ .maxAge (jwtProperties .getRefreshTokenValidity () / 1000 )
87+ // .domain() // 프론트엔드 & 백엔드 상위 도메인
88+ // .secure(true) // https 필수 설정.
89+ .domain (redirect_domain )
90+ .secure (true )
91+ .sameSite ("None" )
92+ .build ();
8193
94+ // HTTP 응답에서 쿠키 값 추가.
95+ response .addHeader (HttpHeaders .SET_COOKIE , accessCookie .toString ());
96+ response .addHeader (HttpHeaders .SET_COOKIE , refreshCookie .toString ());
97+
98+ String redirectUrl = redirect_domain + "/auth/callback"
99+ + "?success=true"
100+ + "&accessToken=" + URLEncoder .encode (accessToken , "UTF-8" )
101+ + "&refreshToken=" + URLEncoder .encode (refreshToken , "UTF-8" );
102+
103+ // 로그인 성공 후 리다이렉트.
104+ // 배포 시에 프론트엔드와 조율이 필요한 부분일 듯 함.
105+ response .sendRedirect (redirect_domain + "/auth/callback" );
106+ }
82107 // 보안을 좀 더 강화하고자 한다면 CSRF 토큰 같은 걸 생각해볼 수 있겠으나,
83108 // 일단은 구현하지 않음.(개발 과정 중에 번거로워질 수 있을 듯 함.)
84109 }
0 commit comments