diff --git a/src/main/java/side/onetime/auth/handler/OAuthLoginSuccessHandler.java b/src/main/java/side/onetime/auth/handler/OAuthLoginSuccessHandler.java index 4fc8eb1..33475df 100644 --- a/src/main/java/side/onetime/auth/handler/OAuthLoginSuccessHandler.java +++ b/src/main/java/side/onetime/auth/handler/OAuthLoginSuccessHandler.java @@ -41,6 +41,9 @@ public class OAuthLoginSuccessHandler extends SimpleUrlAuthenticationSuccessHand @Value("${jwt.refresh-token.expiration-time}") private long REFRESH_TOKEN_EXPIRATION_TIME; + @Value("${jwt.register-token.expiration-time}") + private long REGISTER_TOKEN_EXPIRATION_TIME; + private final JwtUtil jwtUtil; private final UserRepository userRepository; private final RefreshTokenRepository refreshTokenRepository; @@ -96,7 +99,7 @@ private void handleAuthentication(HttpServletRequest request, HttpServletRespons // 신규 유저 처리 private void handleNewUser(HttpServletRequest request, HttpServletResponse response, String provider, String providerId, String name, String email) throws IOException { log.info("신규 유저입니다."); - String registerToken = jwtUtil.generateRegisterToken(provider, providerId, name, email, ACCESS_TOKEN_EXPIRATION_TIME); + String registerToken = jwtUtil.generateRegisterToken(provider, providerId, name, email, REGISTER_TOKEN_EXPIRATION_TIME); String redirectUri = String.format(REGISTER_TOKEN_REDIRECT_URI, registerToken, URLEncoder.encode(name, StandardCharsets.UTF_8)); getRedirectStrategy().sendRedirect(request, response, redirectUri); } diff --git a/src/main/java/side/onetime/exception/TokenErrorResult.java b/src/main/java/side/onetime/exception/TokenErrorResult.java index 3444c86..d3c2594 100644 --- a/src/main/java/side/onetime/exception/TokenErrorResult.java +++ b/src/main/java/side/onetime/exception/TokenErrorResult.java @@ -11,6 +11,7 @@ public enum TokenErrorResult implements BaseErrorCode { _INVALID_TOKEN(HttpStatus.UNAUTHORIZED, "401", "유효하지 않은 토큰입니다."), _INVALID_REFRESH_TOKEN(HttpStatus.UNAUTHORIZED, "401", "유효하지 않은 리프레쉬 토큰입니다."), + _EXPIRED_TOKEN(HttpStatus.UNAUTHORIZED, "401", "만료된 토큰입니다."), _NOT_FOUND_REFRESH_TOKEN(HttpStatus.NOT_FOUND, "404", "리프레쉬 토큰을 찾을 수 없습니다.") ; diff --git a/src/main/java/side/onetime/service/TokenService.java b/src/main/java/side/onetime/service/TokenService.java index 1db43d9..191a8f7 100644 --- a/src/main/java/side/onetime/service/TokenService.java +++ b/src/main/java/side/onetime/service/TokenService.java @@ -26,13 +26,14 @@ public class TokenService { // 액세스 & 리프레쉬 토큰 재발행 메서드 public TokenDto.ReissueTokenResponse reissueToken(TokenDto.ReissueTokenRequest reissueTokenRequest) { String refreshToken = reissueTokenRequest.getRefreshToken(); + jwtUtil.validateTokenExpiration(refreshToken); Long userId = jwtUtil.getUserIdFromToken(refreshToken); RefreshToken existRefreshToken = refreshTokenRepository.findByUserId(userId) .orElseThrow(() -> new TokenException(TokenErrorResult._NOT_FOUND_REFRESH_TOKEN)); String newAccessToken; - if (!existRefreshToken.getRefreshToken().equals(refreshToken) || jwtUtil.isTokenExpired(refreshToken)) { - // 리프레쉬 토큰이 다르거나, 만료된 경우 + if (!existRefreshToken.getRefreshToken().equals(refreshToken)) { + // 리프레쉬 토큰이 다른 경우 throw new TokenException(TokenErrorResult._INVALID_REFRESH_TOKEN); // 401 에러를 던져 재로그인을 요청 } else { // 액세스 토큰 재발급 diff --git a/src/main/java/side/onetime/service/UserService.java b/src/main/java/side/onetime/service/UserService.java index 3586cbd..9ecdb35 100644 --- a/src/main/java/side/onetime/service/UserService.java +++ b/src/main/java/side/onetime/service/UserService.java @@ -34,6 +34,7 @@ public class UserService { public UserDto.OnboardUserResponse onboardUser(UserDto.OnboardUserRequest onboardUserRequest) { // 레지스터 토큰을 이용하여 사용자 정보 추출 String registerToken = onboardUserRequest.getRegisterToken(); + jwtUtil.validateTokenExpiration(registerToken); String provider = jwtUtil.getProviderFromToken(registerToken); String providerId = jwtUtil.getProviderIdFromToken(registerToken); String name = jwtUtil.getNameFromToken(registerToken); diff --git a/src/main/java/side/onetime/util/JwtUtil.java b/src/main/java/side/onetime/util/JwtUtil.java index 303608f..02fb079 100644 --- a/src/main/java/side/onetime/util/JwtUtil.java +++ b/src/main/java/side/onetime/util/JwtUtil.java @@ -88,7 +88,7 @@ public Long getUserIdFromToken(String token) { return Long.parseLong(userId); } catch (JwtException | IllegalArgumentException e) { // 토큰이 유효하지 않은 경우 - log.warn("토큰에서 userId를 반환하던 도중 에러가 발생했습니다."); + log.error("토큰에서 userId를 반환하던 도중 에러가 발생했습니다."); throw new TokenException(TokenErrorResult._INVALID_TOKEN); } } @@ -114,7 +114,7 @@ public String getProviderFromToken(String token) { return userId; } catch (JwtException | IllegalArgumentException e) { // 토큰이 유효하지 않은 경우 - log.warn("토큰에서 provider를 반환하는 도중 에러가 발생했습니다."); + log.error("토큰에서 provider를 반환하는 도중 에러가 발생했습니다."); throw new TokenException(TokenErrorResult._INVALID_TOKEN); } } @@ -132,12 +132,12 @@ public String getProviderIdFromToken(String token) { return providerId; } catch (JwtException | IllegalArgumentException e) { // 토큰이 유효하지 않은 경우 - log.warn("토큰에서 providerId를 반환하는 도중 에러가 발생했습니다."); + log.error("토큰에서 providerId를 반환하는 도중 에러가 발생했습니다."); throw new TokenException(TokenErrorResult._INVALID_TOKEN); } } - // 토큰에서 name을 반환하는 메서드 + // 토큰에서 이름을 반환하는 메서드 public String getNameFromToken(String token) { try { String name = Jwts.parser() @@ -150,12 +150,12 @@ public String getNameFromToken(String token) { return name; } catch (JwtException | IllegalArgumentException e) { // 토큰이 유효하지 않은 경우 - log.warn("토큰에서 이름을 반환하는 도중 에러가 발생했습니다."); + log.error("토큰에서 이름을 반환하는 도중 에러가 발생했습니다."); throw new TokenException(TokenErrorResult._INVALID_TOKEN); } } - // 토큰에서 name을 반환하는 메서드 + // 토큰에서 이메일을 반환하는 메서드 public String getEmailFromToken(String token) { try { String email = Jwts.parser() @@ -168,26 +168,25 @@ public String getEmailFromToken(String token) { return email; } catch (JwtException | IllegalArgumentException e) { // 토큰이 유효하지 않은 경우 - log.warn("토큰에서 이메일을 반환하는 도중 에러가 발생했습니다."); + log.error("토큰에서 이메일을 반환하는 도중 에러가 발생했습니다."); throw new TokenException(TokenErrorResult._INVALID_TOKEN); } } // Jwt 토큰의 유효기간을 확인하는 메서드 - public boolean isTokenExpired(String token) { + public void validateTokenExpiration(String token) { try { + log.info("토큰의 유효기간을 확인합니다."); Date expirationDate = Jwts.parser() .verifyWith(this.getSigningKey()) .build() .parseSignedClaims(token) .getPayload() .getExpiration(); - log.info("토큰의 유효기간을 확인합니다."); - return expirationDate.before(new Date()); } catch (JwtException | IllegalArgumentException e) { // 토큰이 유효하지 않은 경우 - log.warn("유효기간 확인 도중 에러가 발생했습니다."); - throw new TokenException(TokenErrorResult._INVALID_TOKEN); + log.error("만료된 토큰입니다."); + throw new TokenException(TokenErrorResult._EXPIRED_TOKEN); } } } \ No newline at end of file diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index d3d5780..11c2ce1 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -84,4 +84,6 @@ jwt: access-token: expiration-time: ${ACCESS_TOKEN_EXPIRATION_TIME} refresh-token: - expiration-time: ${REFRESH_TOKEN_EXPIRATION_TIME} \ No newline at end of file + expiration-time: ${REFRESH_TOKEN_EXPIRATION_TIME} + register-token: + expiration-time: ${REGISTER_TOKEN_EXPIRATION_TIME} \ No newline at end of file