⚒ 스프링 시큐리티 필터 중 인증과 인가에 대한 필터인 ExceptionTranslationFilter
, FilterSecurityInterceptor
에 대해 알아보겠다.
🔨 Filter Chain 순서
✔ 위와 같이 ExceptionTranslationFilter와 FilterSecurityInterceptor의 순서는 스프링 시큐리티 필터의 마지막 순서이다.
필터의 흐름을 알아보자.
🔨 전제조건
i) 인증이 되지 않음
ii) 인증은 됐지만 권한이 존재하지 않음
◾ 순서1. <ExceptionTranslationFilter.java>
✔ ExceptionTranslationFilter의 doFilter
가 실행되면서 다음 필터인 FilterSecurityInterceptor가 실행됨
◾ 순서2. <FilterSecurityInterceptor.java>
i) FilterSecurityInterceptor에서 SecurityContext의 인증객체가 있는지 확인
➡ 없다면 AuthenticationException
발생
ii) 인증객체가 있다면 권한정보를 확인
➡ 요청에 대한 권한이 거부 됐다면 AccessDeniedException
발생
◾ 순서3. <ExceptionTranslationFilter.java>
✔ 순서2 에서 발생한 AuthenticationException과 AccessDeniedException은 그 위인 ExceptionTranslationFilter의 catch문
에서 예외를 처리
◾ 순서4. <ExceptionTranslationFilter.java>
✔ AuthenticationException
인 경우 AuthenticationEntryPoint가 처리
✔ AccessDeniedException
인 경우 AccessDeniedHandler가 처리
🔨 Filter 예외 처리
✔ 예외를 공통적으로 처리하기 위해 사용하는 @ControllerAdvice
는 Filter, Interceptor단에서 발생하는 Exception은 처리해주지 않는다.
✔ Filter에서의 오류 발생 시 위의 AuthenticationEntryPoint
, AccessDeniedHandler
클래스를 구현해서 처리한다.
◾ 순서1. <WebSecurityConfigurerAdapter.java>
✔ WebSecurityConfigurerAdapter를 구현한 Config 파일에서 Custom한 AuthenticationEntryPoint, AccessDeniedHandler 클래스 설정
◾ 순서2. Filter
✔ filter에서 예외 발생 시 exception 변수에 값 설정
✔ request의 Attribute
에 exception 변수 set
◾ 순서3. <AuthenticationEntryPoint.java>
✔ request의 Attribute에서 exception 변수 꺼내서 redirect
를 한 후 예외 처리가 가능함
'Spring' 카테고리의 다른 글
[Spring] ProxyMode로 Prototype Scope Bean 사용해보기 (0) | 2023.03.07 |
---|