|
9 | 9 | import jakarta.servlet.http.HttpServletResponse; |
10 | 10 | import jakarta.transaction.Transactional; |
11 | 11 | import lombok.RequiredArgsConstructor; |
| 12 | +import lombok.extern.slf4j.Slf4j; |
| 13 | +import org.springframework.beans.factory.annotation.Value; |
12 | 14 | import org.springframework.http.HttpHeaders; |
13 | 15 | import org.springframework.http.HttpStatus; |
| 16 | +import org.springframework.http.ResponseCookie; |
14 | 17 | import org.springframework.http.ResponseEntity; |
15 | 18 | import org.springframework.security.core.annotation.AuthenticationPrincipal; |
16 | 19 | import org.springframework.web.bind.annotation.PostMapping; |
17 | | -import org.springframework.web.bind.annotation.RequestHeader; |
18 | 20 | import org.springframework.web.bind.annotation.RequestMapping; |
19 | 21 | import org.springframework.web.bind.annotation.RestController; |
20 | 22 |
|
21 | 23 | import java.time.LocalDateTime; |
| 24 | +import java.util.Arrays; |
22 | 25 |
|
23 | 26 | @RestController |
24 | 27 | @RequestMapping("/token") |
25 | 28 | @RequiredArgsConstructor |
26 | 29 | @Transactional |
| 30 | +@Slf4j |
27 | 31 | public class JwtLoginAPIController { |
28 | 32 |
|
29 | 33 | private final JwtTokenUtil jwtTokenUtil; |
30 | 34 | private final RefreshTokenRepository refreshTokenRepository; |
31 | 35 |
|
| 36 | + @Value("${app.cookie.secure:true}") |
| 37 | + private boolean cookieSecure; |
| 38 | + |
| 39 | + @Value("${app.cookie.same-site:None}") |
| 40 | + private String cookieSameSite; |
| 41 | + |
32 | 42 | @PostMapping("/refresh") |
33 | 43 | public ResponseEntity<?> refresh(HttpServletRequest request, |
34 | 44 | 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()); |
35 | 51 |
|
36 | 52 | String refreshToken = null; |
37 | 53 |
|
@@ -73,13 +89,15 @@ public ResponseEntity<?> refresh(HttpServletRequest request, |
73 | 89 | refreshTokenRepository.save(storedToken); |
74 | 90 |
|
75 | 91 | // 새 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(); |
81 | 99 |
|
82 | | - response.addCookie(newCookie); |
| 100 | + response.addHeader(HttpHeaders.SET_COOKIE, newCookie.toString()); |
83 | 101 |
|
84 | 102 | return ResponseEntity.ok() |
85 | 103 | .header(HttpHeaders.AUTHORIZATION, "Bearer " + newAccessToken) |
@@ -118,10 +136,14 @@ public ResponseEntity<Void> logout( |
118 | 136 | refreshTokenRepository.deleteByToken(refreshToken); |
119 | 137 |
|
120 | 138 | // 쿠키 삭제 |
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()); |
125 | 147 |
|
126 | 148 | return ResponseEntity.noContent().build(); |
127 | 149 | } |
|
0 commit comments