• refreshToken을 이용해 accessToken을 발행하는 로직을 구현 하던 도중..

서블릿에서의 에러가 발생

  • JwtAuthenticationFilter의 doFilterInternal 메서드 내부의 로직 때문에 생긴 에러이다.
    • doFilterInternal 로직 중 accessToken을 확인해 만료가 됐다면 refreshToken 메서드(서비스)로 연결이 된다.
    • 해당 서비스단 내부에서 새 토큰의 발행을 돕고, 그때 refreshToken 역시 만료가 됐다면 커스텀익셉션인 UserException을 발생시켜 GlobalExceptionHandler를 통해 처리가 되는 로직이다.
    • 그 과정에서 위의 문제가 발생했다.

문제가 발생하는 로직

  • 이유는 ?
    • 기존의 GlobalExceptionHandler로 처리 되던 에러들은 doFilterIntenal을 벗어나 로직상에서 문제가 발생 됐기에 처리가 가능했다.
    • 하지만 refreshToken 서비스는 doFilterIntenal 내부의 로직이기에 GlobalExceptionHandler로 연결 되지 못하고 예기치 못한 에러(서블릿단에서의 에러)로 연결 됐던 것

수정 후의 로직

  • try / catch를 이용해 서비스단에서 발생 시킨 UserException를 Filter 내부에서 직접 처리 해준다.
    • response를 새로 생성해 status 및 body를 생성해 내보낸다.
    • 마지막 return을 붙이지 않으면 지정해줬던 UserException이 아닌 403 Fobidden 상태를 발생시킨다.
      • return으로 현재의 로직 (response를 새로 만드는 것 까지) 을 끝내지 않으면 기존의 로직 (권한을 만들어내지 못한 상태로 진행) 이 진행 되어 결국 권한이 필요했던 요청에 권한이 없는 상태로 응답을 하기 때문에 UserException 을 발생시키지 않고 403 에러 메시지가 발생 되는 것.

 

나중에 내가 기억하기 위해 서비스단도 적어놓자.

'Java > Spring' 카테고리의 다른 글

[Security] JWT란 ?  (0) 2024.06.18
Redis Config 설정 (로컬환경에서의 설정 방법)  (0) 2024.06.17
RedisUtil (get, set 설정)  (0) 2024.04.16
RedisRepositoryConfig 설정  (0) 2024.04.16
PasswordEncoder 알고리즘 이모저모  (0) 2024.04.15

+ Recent posts