Skip to content

Commit 3faffd9

Browse files
authored
Merge pull request #346 from mosu-dev/develop
[배포] 토큰 만료 처리
2 parents 9c76dda + d9928bf commit 3faffd9

File tree

3 files changed

+57
-8
lines changed

3 files changed

+57
-8
lines changed

src/main/java/life/mosu/mosuserver/application/auth/provider/JwtTokenProvider.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,9 +106,15 @@ protected Claims validateAndParseToken(final String token) {
106106
}
107107

108108
if (claims.getExpiration().toInstant().isBefore(new Date().toInstant())) {
109-
throw new CustomRuntimeException(ErrorCode.EXPIRED_TOKEN);
109+
throw new ExpiredJwtException(
110+
null,
111+
claims,
112+
"JWT 토큰이 만료되었습니다."
113+
);
110114
}
111115
return claims;
116+
} catch (ExpiredJwtException exception) {
117+
throw exception;
112118
} catch (JwtException | IllegalArgumentException exception) {
113119
throw new CustomRuntimeException(ErrorCode.INVALID_TOKEN_TYPE);
114120
}
Lines changed: 43 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,26 @@
11
package life.mosu.mosuserver.global.filter;
22

3+
import com.fasterxml.jackson.databind.ObjectMapper;
4+
import io.jsonwebtoken.ExpiredJwtException;
35
import jakarta.servlet.FilterChain;
46
import jakarta.servlet.ServletException;
57
import jakarta.servlet.http.HttpServletRequest;
68
import jakarta.servlet.http.HttpServletResponse;
79
import java.io.IOException;
810
import life.mosu.mosuserver.global.exception.CustomRuntimeException;
11+
import life.mosu.mosuserver.global.exception.ErrorResponse;
912
import lombok.RequiredArgsConstructor;
13+
import org.springframework.http.HttpStatus;
14+
import org.springframework.http.MediaType;
1015
import org.springframework.stereotype.Component;
1116
import org.springframework.web.filter.OncePerRequestFilter;
1217

1318
@Component
1419
@RequiredArgsConstructor
1520
public class TokenExceptionFilter extends OncePerRequestFilter {
1621

22+
private final ObjectMapper objectMapper;
23+
1724
@Override
1825
protected void doFilterInternal(
1926
final HttpServletRequest request,
@@ -22,11 +29,43 @@ protected void doFilterInternal(
2229
) throws ServletException, IOException {
2330
try {
2431
filterChain.doFilter(request, response);
25-
} catch (CustomRuntimeException exception) {
26-
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
27-
response.setContentType("application/json");
32+
} catch (CustomRuntimeException ex) {
33+
34+
ErrorResponse errorResponse = ErrorResponse.builder()
35+
.status(ex.getStatus().value())
36+
.message(ex.getMessage())
37+
.code(ex.getCode())
38+
.build();
39+
40+
response.setStatus(HttpStatus.UNAUTHORIZED.value());
41+
response.setContentType(MediaType.APPLICATION_JSON_VALUE);
42+
response.setCharacterEncoding("UTF-8");
43+
44+
objectMapper.writeValue(response.getWriter(), errorResponse);
45+
} catch (ExpiredJwtException ex) {
46+
ErrorResponse errorResponse = ErrorResponse.builder()
47+
.status(HttpStatus.NOT_ACCEPTABLE.value())
48+
.message("토큰이 만료되었습니다.")
49+
.code("TOKEN_EXPIRED")
50+
.build();
51+
52+
response.setStatus(HttpStatus.NOT_ACCEPTABLE.value());
53+
response.setContentType(MediaType.APPLICATION_JSON_VALUE);
2854
response.setCharacterEncoding("UTF-8");
29-
response.sendError(exception.getStatus().value(), exception.getMessage());
55+
56+
objectMapper.writeValue(response.getWriter(), errorResponse);
57+
} catch (Exception ex) {
58+
ErrorResponse errorResponse = ErrorResponse.builder()
59+
.status(HttpStatus.INTERNAL_SERVER_ERROR.value())
60+
.message("서버 오류가 발생했습니다.")
61+
.code("INTERNAL_SERVER_ERROR")
62+
.build();
63+
64+
response.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value());
65+
response.setContentType(MediaType.APPLICATION_JSON_VALUE);
66+
response.setCharacterEncoding("UTF-8");
67+
68+
objectMapper.writeValue(response.getWriter(), errorResponse);
3069
}
3170
}
3271
}

src/main/java/life/mosu/mosuserver/global/filter/TokenFilter.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package life.mosu.mosuserver.global.filter;
22

3+
import io.jsonwebtoken.ExpiredJwtException;
34
import jakarta.servlet.FilterChain;
45
import jakarta.servlet.ServletException;
56
import jakarta.servlet.http.HttpServletRequest;
@@ -105,9 +106,12 @@ protected void doFilterInternal(
105106

106107
try {
107108
setAuthentication(accessToken);
109+
} catch (ExpiredJwtException e) {
110+
log.error("액세스 토큰 만료: {}", e.getMessage());
111+
throw e;
108112
} catch (CustomRuntimeException e) {
109-
log.error("액세스 토큰 인증 실패: {}", e.getMessage());
110-
throw new CustomRuntimeException(ErrorCode.INVALID_TOKEN);
113+
log.error("유효하지 않은 토큰 인증 실패: {}", e.getMessage());
114+
throw e;
111115
} catch (Exception e) {
112116
log.error("액세스 토큰 인증 실패: {}", e.getMessage());
113117
throw new RuntimeException("액세스 토큰 인증 중 예외 발생", e);
@@ -120,7 +124,7 @@ private void reissueToken(HttpServletRequest request, HttpServletResponse respon
120124
throws IOException {
121125
final TokenCookies tokenCookies = tokenResolver.resolveTokens(request);
122126
if (!tokenCookies.availableReissue()) {
123-
throw new CustomRuntimeException(ErrorCode.EXPIRED_REFRESH_TOKEN);
127+
throw new CustomRuntimeException(ErrorCode.NOT_FOUND_TOKEN);
124128
}
125129

126130
Token newToken = authTokenManager.reissueToken(tokenCookies);

0 commit comments

Comments
 (0)