jwt 토큰이 만료되었을 때의 응답을 처리하려고 하였습니다. ExpiredException을 받아 handling하려고 하였으나, global exception을 handling하기 위해 기존에 존재하던 @RestControllerAdvice는 security filter 단에서의 에러를 handling하지 못하였습니다. 이는 sevlet에 들어오기 전에 동작하는 것이었기 때문입니다.이에 이를 해결하는 과정을 포스팅합니다.
spring security filter exception 해결 시도 1
아래의 사진에서 보듯 try catch 문을 통해 Exception이 발생한 경우 response writer를 사용해 응답을 반환해주려 하였습니다. 하지만 httpResponse에 wirte이 되지 않아 문제를 해결하지 못했습니다.
이와 관련해 security의 filter가 돌면서 response가 수정되는 것이 원인일 것이라고 추측하여 chan.doFilter(request, responese) 코드를 주석처리하였으나, 여전히 filter가 호출되는 것을 확인했습니다. 그리고 앞단으로 가며 filter가 동작하는 것을 확인하였습니다.
이와 관련하여 security는 특정 filter에서 exception이 발생하면 선행하던 filter로 exception을 넘겨 처리하는 것을 알게 되었습니다. 처음에는 주석처리를 했음에도 filter가 호출되어 헷갈렸으나, 뒤쪽이 아닌 앞쪽으로 filter가 호출되는 것을 캐치할 수 있었고 이에 문제 해결의 실마리를 얻을 수 있었습니다.
spring security filter exception 해결 시도 2
위의 실마리를 바탕으로, JwtAthenticationFilter 앞에 exception을 핸들링하기 위한 ExceptionHandlerFilter를 추가하여 문제를 해결하였습니다. 특히 기존 ExceptionAdvice가 에러를 핸들링하여 응답하는 format과 동일하게 filter 에러의 응답을 주고 싶었고, 이에 따라 objectMapper와 기존에 개발해둔 ApiResponse 클래스를 활용하여 response를 반환하도록 하였습니다. 아래는 그 코드입니다.
결과
'IT > 디버깅' 카테고리의 다른 글
한진정보통신 인턴 과제 - yolo8 모델을 android 모델로 변환 중 발생한 문제 - android 인식 안됨 (0) | 2024.06.05 |
---|---|
한진정보통신 인턴 과제 - 특정 라벨에 대한 yolo8 모델 정확도 문제 해결 과정 정리 (0) | 2024.06.04 |
oneToMany가 연속적일 때 failed to lazily initialize a collection of role 에러 해결 (0) | 2024.01.28 |
jwt 사용 시 remember me 적용 안되는 이슈 (0) | 2024.01.25 |
@WithMockUser 사용시 요청에 사용되는 User와 MockUser가 다른 경우 발생하는 에러 401 (0) | 2023.11.11 |