인프런 커뮤니티 질문&답변

이상민님의 프로필 이미지

작성한 질문수

스프링 시큐리티 완전 정복 [6.x 개정판]

예외 필터 - ExceptionTranslationFilter

예외처리에 관해 이해가 어려운 부분이 있습니다.

작성

·

259

0

안녕하세요 강의 잘 보고 있습니다. 다름이 아니라 예외를 처리하는 부분에서 이해가 잘 가지 않는 부분이 이렇게 질문을 드립니다.

스프링 시큐리티의 FilterChainProxy의 끝단에 예외를 처리하는 ExceptionTranslationFilter가 존재합니다. 해당 필터가 인가 예외를 처리하는 것까지는 이해하였습니다.

 

그러나 인증예외를 다루는 것이 조금 이해가 가지 않습니다.

스프링 시큐리티에서 제공하는 formLogin 인증을 포함한 모든 인증 방식은 ExceptionTranslationFilter앞에 존재합니다.

그럼에도 불구하고 인증 필터들에서 발생하는 예외들을 ExceptionTranslationFilter에서 처리를 합니다. 기존의 저는 예외가 발생할 즉시 바로 자신을 호출한 객체에게 예외를 반환하며 프로세스가 진행한다 알고 있는데 이는 스프링 시큐리티에서 인증예외를 처리하는 흐름과는 정 반대의 흐름입니다.

 

혹시 인증 필터에서 해당 예외가 발생할시 예외를 Throw하는 것이 아닌 다른방식으로 예외를 감싸서 ExceptionTranslationFilter까지 흘러가는 건가요? 아니면 제가 놓치는 부분이 있는걸까요?

답변 2

1

정수원님의 프로필 이미지
정수원
지식공유자

네 이부분은 ExceptionTranslationFilter 챕터에서 설명하고 있습니다.

ExceptionTranslationFilter 는 AuthorizationFilter 에서 발생한 예외를 처리하고 있습니다.

즉 ExceptionTranslationFilter 이전 필터들에서 발생하는 예외를 처리하지 않습니다.

ExceptionTranslationFilter 이전 필터들에서 발생하는 예외는 해당 필터에서 예외를 처리하거나 그 이전필터에게 예외를 전가하는 식으로 이루어집니다

그래서 formLogin 에서 발생하는 예외는 UsernamePasswordAuthenticationFilter 에서 처리합니다.

강의에서도 설명하고 있으니 참고 해 주시기 바랍니다.

이상민님의 프로필 이미지
이상민
질문자

감사합니다 :)

0

제 생각에는 AuthorizationFilter에서 AccessDeniedException 예외를 던지지만, 또한 AuthenticationCredentialsNotFoundException 예외도 던지는 로직이 있습니다(AuthenticationCredentialsNotFoundException 예외는 AuthenticationException 하위 예외입니다). 해당 예외를 ExceptionTranslationFilter가 처리하므로 인증 예외를 처리한다고 설명하신게 아닐까 싶습니다.

 

AuthenticationCredentialsNotFoundException 예외는 AuthorizationFiltergetAuthentication() 메서드에, 해당 예외를 ExceptionTranslationFilter가 처리하는 부분은 doFilter() 메서드 내부에서 (AuthenticationException) 형변환을 하는 부분을 살펴보시면 쉽게 이해하실 듯 합니다.