|
6 | 6 | import com.back.domain.user.entity.User; |
7 | 7 | import com.back.domain.user.entity.UserProfile; |
8 | 8 | import com.back.domain.user.entity.UserStatus; |
| 9 | +import com.back.domain.user.entity.UserToken; |
9 | 10 | import com.back.domain.user.repository.UserProfileRepository; |
10 | 11 | import com.back.domain.user.repository.UserRepository; |
| 12 | +import com.back.domain.user.repository.UserTokenRepository; |
11 | 13 | import com.back.global.exception.CustomException; |
12 | 14 | import com.back.global.exception.ErrorCode; |
13 | 15 | import com.back.global.security.CurrentUser; |
14 | 16 | import com.back.global.security.JwtTokenProvider; |
15 | 17 | import jakarta.servlet.http.Cookie; |
| 18 | +import jakarta.servlet.http.HttpServletRequest; |
16 | 19 | import jakarta.servlet.http.HttpServletResponse; |
17 | 20 | import lombok.RequiredArgsConstructor; |
18 | 21 | import org.springframework.security.crypto.password.PasswordEncoder; |
19 | 22 | import org.springframework.stereotype.Service; |
20 | 23 | import org.springframework.transaction.annotation.Transactional; |
21 | 24 |
|
| 25 | +import java.time.LocalDateTime; |
| 26 | + |
22 | 27 | @Service |
23 | 28 | @RequiredArgsConstructor |
24 | 29 | @Transactional |
25 | 30 | public class UserService { |
26 | 31 | private final UserRepository userRepository; |
27 | 32 | private final UserProfileRepository userProfileRepository; |
| 33 | + private final UserTokenRepository userTokenRepository; |
28 | 34 | private final PasswordEncoder passwordEncoder; |
29 | 35 | private final JwtTokenProvider jwtTokenProvider; |
30 | 36 |
|
@@ -106,13 +112,20 @@ public UserResponse login(LoginRequest request, HttpServletResponse response) { |
106 | 112 | String accessToken = jwtTokenProvider.createAccessToken(user.getId(), user.getUsername(), user.getRole().name()); |
107 | 113 | String refreshToken = jwtTokenProvider.createRefreshToken(user.getId()); |
108 | 114 |
|
109 | | - // TODO: Refresh Token 저장소에 저장 로직 추가 예정 (현재는 stateless 방식) |
| 115 | + // DB에 Refresh Token 저장 |
| 116 | + UserToken userToken = new UserToken( |
| 117 | + user, |
| 118 | + refreshToken, |
| 119 | + LocalDateTime.now().plusSeconds(jwtTokenProvider.getRefreshTokenExpirationInSeconds()) |
| 120 | + ); |
| 121 | + userTokenRepository.save(userToken); |
| 122 | + |
110 | 123 | // Refresh Token을 HttpOnly 쿠키로 설정 |
111 | 124 | Cookie cookie = new Cookie("refreshToken", refreshToken); |
112 | 125 | cookie.setHttpOnly(true); |
113 | 126 | cookie.setSecure(true); |
114 | 127 | cookie.setPath("/api/auth/refresh"); |
115 | | - cookie.setMaxAge(7 * 24 * 60 * 60); // TODO: 하드 코딩된 만료 시간 상수로 분리 |
| 128 | + cookie.setMaxAge((int) jwtTokenProvider.getRefreshTokenExpirationInSeconds()); |
116 | 129 | response.addCookie(cookie); |
117 | 130 |
|
118 | 131 | // Access Token을 응답 헤더에 설정 |
|
0 commit comments