Skip to content

Commit 0ccb446

Browse files
authored
[refactor/OPS-310] redirect url 변경 (#53)
* refactor/OPS-310 : redirect-url 변경. * refactor/OPS-310 : 작은 수정. * refactor/OPS-310 : 또 하나의 작은 수정. * refactor/OPS-310 : 큰 수정. * refactor/OPS-310 : 테스트 * refactor/OPS-310 : 요청 사항 반영. * refactor/OPS-310 : 요청 사항 반영 #2
1 parent d6098e5 commit 0ccb446

File tree

3 files changed

+92
-25
lines changed

3 files changed

+92
-25
lines changed
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package org.tuna.zoopzoop.backend.domain.auth.handler;
2+
3+
import jakarta.servlet.ServletException;
4+
import jakarta.servlet.http.HttpServletRequest;
5+
import jakarta.servlet.http.HttpServletResponse;
6+
import lombok.RequiredArgsConstructor;
7+
import org.springframework.beans.factory.annotation.Value;
8+
import org.springframework.security.core.AuthenticationException;
9+
import org.springframework.security.web.authentication.AuthenticationFailureHandler;
10+
import org.springframework.stereotype.Component;
11+
12+
import java.io.IOException;
13+
import java.net.URLEncoder;
14+
15+
@Component
16+
@RequiredArgsConstructor
17+
public class OAuth2FailureHandler implements AuthenticationFailureHandler {
18+
@Value("${front.redirect_domain}")
19+
private String redirect_domain;
20+
21+
@Override
22+
public void onAuthenticationFailure(HttpServletRequest request,
23+
HttpServletResponse response,
24+
AuthenticationException exception) throws IOException, ServletException {
25+
26+
// 프론트로 리다이렉트
27+
// 필요하면 쿼리 파라미터로 에러 정보 전달
28+
29+
String redirectUrl =
30+
redirect_domain + "/auth/callback"
31+
+ "?success=false"
32+
+ "&error=" + URLEncoder.encode(exception.getMessage(), "UTF-8");
33+
34+
response.sendRedirect(redirectUrl);
35+
}
36+
}

src/main/java/org/tuna/zoopzoop/backend/domain/auth/handler/OAuth2SuccessHandler.java

Lines changed: 50 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import jakarta.servlet.http.HttpServletRequest;
44
import jakarta.servlet.http.HttpServletResponse;
55
import lombok.RequiredArgsConstructor;
6+
import org.springframework.beans.factory.annotation.Value;
67
import org.springframework.http.HttpHeaders;
78
import org.springframework.http.ResponseCookie;
89
import org.springframework.security.core.Authentication;
@@ -17,6 +18,7 @@
1718
import org.tuna.zoopzoop.backend.global.security.jwt.JwtUtil;
1819

1920
import 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
}

src/main/java/org/tuna/zoopzoop/backend/global/security/jwt/JwtAuthenticationFilter.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,12 @@ private String getTokenFromRequest(HttpServletRequest request) { // Authorizatio
6767
}
6868
}
6969
}
70+
71+
String accessTokenParam = request.getParameter("accessToken");
72+
if (StringUtils.hasText(accessTokenParam)) {
73+
return accessTokenParam;
74+
}
75+
7076
return null;
7177
}
7278
}

0 commit comments

Comments
 (0)