Skip to content

Commit 0dc6d56

Browse files
authored
[fix] refreshToken 쿠키설정 수정
[#74] Fix: refreshToken 쿠키설정 수정
2 parents c1a31fb + b076d3f commit 0dc6d56

3 files changed

Lines changed: 42 additions & 13 deletions

File tree

src/main/java/Mua/Mua_backend/global/config/SecurityConfig.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Excepti
4747
)
4848
.authorizeHttpRequests(auth -> auth
4949
.requestMatchers("/", "/login/**", "/oauth2/**", "/login/oauth2/**",
50+
"/token/refresh", "/token/logout",
5051
"/v3/api-docs/**", "/swagger-ui/**", "/swagger-ui.html", "/h2-console/**", "/api/feeds/**", "/api/notifications/**",
5152
"/api/members/**", "/health").permitAll()
5253
.requestMatchers("/admin/**").hasRole("ADMIN")

src/main/java/Mua/Mua_backend/global/security/jwt/JwtLoginAPIController.java

Lines changed: 33 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,29 +9,45 @@
99
import jakarta.servlet.http.HttpServletResponse;
1010
import jakarta.transaction.Transactional;
1111
import lombok.RequiredArgsConstructor;
12+
import lombok.extern.slf4j.Slf4j;
13+
import org.springframework.beans.factory.annotation.Value;
1214
import org.springframework.http.HttpHeaders;
1315
import org.springframework.http.HttpStatus;
16+
import org.springframework.http.ResponseCookie;
1417
import org.springframework.http.ResponseEntity;
1518
import org.springframework.security.core.annotation.AuthenticationPrincipal;
1619
import org.springframework.web.bind.annotation.PostMapping;
17-
import org.springframework.web.bind.annotation.RequestHeader;
1820
import org.springframework.web.bind.annotation.RequestMapping;
1921
import org.springframework.web.bind.annotation.RestController;
2022

2123
import java.time.LocalDateTime;
24+
import java.util.Arrays;
2225

2326
@RestController
2427
@RequestMapping("/token")
2528
@RequiredArgsConstructor
2629
@Transactional
30+
@Slf4j
2731
public class JwtLoginAPIController {
2832

2933
private final JwtTokenUtil jwtTokenUtil;
3034
private final RefreshTokenRepository refreshTokenRepository;
3135

36+
@Value("${app.cookie.secure:true}")
37+
private boolean cookieSecure;
38+
39+
@Value("${app.cookie.same-site:None}")
40+
private String cookieSameSite;
41+
3242
@PostMapping("/refresh")
3343
public ResponseEntity<?> refresh(HttpServletRequest request,
3444
HttpServletResponse response) {
45+
log.info("POST /token/refresh sessionId={}, requestedSessionId={}, cookies={}",
46+
request.getSession(false) != null ? request.getSession(false).getId() : null,
47+
request.getRequestedSessionId(),
48+
request.getCookies() == null ? "[]" : Arrays.stream(request.getCookies())
49+
.map(Cookie::getName)
50+
.toList());
3551

3652
String refreshToken = null;
3753

@@ -73,13 +89,15 @@ public ResponseEntity<?> refresh(HttpServletRequest request,
7389
refreshTokenRepository.save(storedToken);
7490

7591
// 새 RefreshToken 쿠키 다시 내려줌
76-
Cookie newCookie = new Cookie("refreshToken", newRefreshToken);
77-
newCookie.setHttpOnly(true);
78-
newCookie.setSecure(false);
79-
newCookie.setPath("/");
80-
newCookie.setMaxAge(60 * 60 * 24 * 14);
92+
ResponseCookie newCookie = ResponseCookie.from("refreshToken", newRefreshToken)
93+
.httpOnly(true)
94+
.secure(cookieSecure)
95+
.sameSite(cookieSameSite)
96+
.path("/")
97+
.maxAge(60 * 60 * 24 * 14)
98+
.build();
8199

82-
response.addCookie(newCookie);
100+
response.addHeader(HttpHeaders.SET_COOKIE, newCookie.toString());
83101

84102
return ResponseEntity.ok()
85103
.header(HttpHeaders.AUTHORIZATION, "Bearer " + newAccessToken)
@@ -118,10 +136,14 @@ public ResponseEntity<Void> logout(
118136
refreshTokenRepository.deleteByToken(refreshToken);
119137

120138
// 쿠키 삭제
121-
Cookie deleteCookie = new Cookie("refreshToken", null);
122-
deleteCookie.setMaxAge(0);
123-
deleteCookie.setPath("/");
124-
response.addCookie(deleteCookie);
139+
ResponseCookie deleteCookie = ResponseCookie.from("refreshToken", "")
140+
.httpOnly(true)
141+
.secure(cookieSecure)
142+
.sameSite(cookieSameSite)
143+
.path("/")
144+
.maxAge(0)
145+
.build();
146+
response.addHeader(HttpHeaders.SET_COOKIE, deleteCookie.toString());
125147

126148
return ResponseEntity.noContent().build();
127149
}

src/main/java/Mua/Mua_backend/global/security/oauth/OAuth2LoginSuccessHandler.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,12 @@ public class OAuth2LoginSuccessHandler implements AuthenticationSuccessHandler {
2929
@Value("${app.oauth.redirect-uri}")
3030
private String redirectUri;
3131

32+
@Value("${app.cookie.secure:true}")
33+
private boolean cookieSecure;
34+
35+
@Value("${app.cookie.same-site:None}")
36+
private String cookieSameSite;
37+
3238
@Override
3339
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response,
3440
Authentication authentication) throws IOException {
@@ -55,8 +61,8 @@ public void onAuthenticationSuccess(HttpServletRequest request, HttpServletRespo
5561

5662
ResponseCookie refreshCookie = ResponseCookie.from("refreshToken", refreshToken)
5763
.httpOnly(true)
58-
.secure(true) // 로컬 테스트면 false, HTTPS면 true
59-
.sameSite("None")
64+
.secure(cookieSecure)
65+
.sameSite(cookieSameSite)
6066
.path("/")
6167
.maxAge(60 * 60 * 24 * 14)
6268
.build();

0 commit comments

Comments
 (0)