[JWT 재발급 00] Spring Security Filter에서 만료된 JWT 토큰 예외처리

 

내가 적용한 기본 access-token 재발급 로직

1. Filter에서 접근하는 모든 access token을 확인한다.
2. 그 중 ExpiredJwtException이 발생하면 바로 에러코드와 함께 리턴을 한다.
3. Frontend에서는 해당 에러가 발생하면 Backend로 access token 재발급 요청한다.

 

우선 SecurityConfig에 적용해놓은 Filter에서는 모든 접근에 대해 토큰을 확인한다.

 

나의 경우 아래 그림과 같이 미리 구현해놓은 validate메서드를 통해 access token의 유효성을 검사한다.

 

 

access token의 유효기간이 지난 후에 spring으로 접근을 한 경우 Filter에서 바로 error를 throw 하게 하고자 하였는데

ExceptionHandler에서 error를 캐치하지 못하는 것을 볼 수 있었다.

 

왜 그런지 찾아보니 Filter는 DispacherServlet보다도 더 앞단에 위치하여 ExceptionHandler가 잡아내지 못하고 있는 것이었다.

 

 

 

 

그래서 HttpServletResponse를 이용하여 ExpiredJwtException이 발생하면 Filter에서 바로 return하도록 다음과 같이 구현한 결과 내가 원하는대로 응답이 잘 갔다.

 

 

※ ExpiredJwtException은 throw 할 때 파라미터가 필요하다고 해서 JwtExpiredException을 새로 만들어서 구현하였다.

 

catch (JwtExpiredException e) {
            ObjectMapper objectMapper = new ObjectMapper();
            ResponseDTO responseDTO = ResponseDTO.builder()
                    .status("fail")
                    .message("토큰 재발급하세요")
                    .build();
            response.setCharacterEncoding("utf-8");
            response.setContentType(MediaType.APPLICATION_JSON_VALUE);
            response.setStatus(HttpStatus.FORBIDDEN.value());
            // writeValueAsString() : Object to JSON in String
            response.getWriter().write(objectMapper.writeValueAsString(responseDTO));
            return;
 }