IT/디버깅

spring security filter exception 처리 이슈 해결

happy_life 2024. 2. 15. 18:24

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가 동작하는 것을 확인하였습니다.

 

여전히 filter 호출/ filter 순서

 

 

이와 관련하여 security는 특정 filter에서 exception이 발생하면 선행하던 filter로 exception을 넘겨 처리하는 것을 알게 되었습니다.  처음에는 주석처리를 했음에도 filter가 호출되어 헷갈렸으나, 뒤쪽이 아닌 앞쪽으로 filter가 호출되는 것을 캐치할 수 있었고 이에 문제 해결의 실마리를 얻을 수 있었습니다. 

 

 

 

spring security filter exception 해결 시도 2

위의 실마리를 바탕으로, JwtAthenticationFilter 앞에 exception을 핸들링하기 위한 ExceptionHandlerFilter를 추가하여 문제를 해결하였습니다. 특히 기존 ExceptionAdvice가 에러를 핸들링하여 응답하는 format과 동일하게 filter 에러의 응답을 주고 싶었고, 이에 따라 objectMapper와 기존에 개발해둔 ApiResponse 클래스를 활용하여 response를 반환하도록 하였습니다. 아래는 그 코드입니다.

 

filter추가/response코드

 

 

 

결과

기존 응답/ 이슈 해결후의 응답

 

 

 

 

https://velog.io/@jsang_log/Security-Filter-%EC%98%88%EC%99%B8%EC%B2%98%EB%A6%AC%ED%95%98%EA%B8%B0-JWT