서블릿에서 필터란
서블릿의 필터는 원래의 오리지널 서블릿을 수행하기 전에 불려지는 로직을 의미한다.
이를 위해 FilterChain이 만들어지는데, 이 안에 여러 필터 끝에 오리지널(?) 서블릿이 들어간다.
DelegatingFilterProxy
스프링 시큐리티에서는 DelegatingFilterProxy라는 Filter가 이런 서블릿에서의 필터처럼 위치한다.
DelegatingFilterProxy는 서블릿 컨테이너와 스프링의 ApplicatoinContext를 연결해주는 역할을 한다.
이는 서블릿의 필터처럼 동작하지만 실제 수행은 Filter를 구현한 Bean에 의해 이뤄진다.
DelegatingFilterProxy는 Filter Bean을 찾는 걸 늦출 수 있다.
기존의 서블릿 필터는 컨테이너가 생성되기 전에 만들어지지만,
스프링 시큐리티에서는 ContextLoaderListener가 필요할 때, Filter Bean을 찾는다.
FilterChainProxy
FilterChainProxy는 SecurityFilterChain이라는 것을 통해서 여러 Bean들에 다양한 Filter기능을 위임한다.
SecurityFilterChain
SecurityFilterChain은 여러 SecurityFilter를 담고 있다.
이들은 FilterChainProxy에 의해 등록되는데, 이는 쉬운 Debugging과 메모리 누수 방지 혹은 HttpFirewall의 적용을 쉽게 한다.

SecurityFilterChain이 여러 개일 수 있는데, 이를 통해 클라이언트로부터 온 URI에 따라 다른 FilterChain를 적용할 수 있게 한다.
Security 예외 처리

SecurityFilter과정 중에 예외가 발생한 경우
1. ExceptionTranslationFilter라는 Filter가 FilterChain.doFilter(request, response)를 수행한다.
2. 사용자가 authentication(인증)이 안되었다면 인증을 시작
(1) SecurityContextHolder를 Clear Out
(2) HttpServletRequest를 RequestCache에 저장
(3) AuthenticationEntryPoint가 클라이언트의 인증을 요청(로그인 페이지 이동 등)
3. 접근 권한이 없어 거부되면 AccessDeniedHandler수행하면서 접근 거부
'Spring' 카테고리의 다른 글
| Spring - 의존성주입 방법의 비교(생성자 주입, Setter주입, field주입) (0) | 2020.06.11 |
|---|---|
| SpringSecurity - jdbc를 이용한 인증/권한 처리 (0) | 2020.05.12 |
| Spring - ServletContext와 RootContext (0) | 2020.05.08 |
| Spring - 관점 지향 프로그래밍(AOP) (0) | 2020.05.05 |
| Spring - 의존성 주입(DI)/IoC컨테이너/ApplicationContext (0) | 2020.05.05 |