-
[스프링 시큐리티] DelegatingFilterProxy & FilterChainProxy강의노트/스프링 시큐리티 2020. 9. 13. 00:25
ServletFilter
- WAS에서 톰캣이 올라가서 WAS에서 실행되는 필터이다.
- 요청을 받아서 Servlet에 전달하고, Servlet에서 응답을 받아서 클라이언트에 전달하는 역활을 수행한다.
- Servlet Container에서 생성되고 실행이 된다.
- 서블릿 필터는 스프링에서 정의된 빈을 주입해서 사용할 수 없다.
- Why? 서로 실행되는 컨테이너가 다르다.
- 인증/인가 처리는 스프링 컨테이너에 생성된 Filter를 통해서 처리된다.
- 실질적인 서블릿 필터가 DelegatingFilterProxy이다.
// web.xml <filter> <filter-name>springSecurityFilterChain</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> </filter> <filter-mapping> <filter-name>springSecurityFilterChain</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
DelegatingFilterProxy
- 서블릿 컨테이너와 스프링 컨테이너(어플리케이션 컨텍스트) 사이의 링크를 제공하는 ServletFilter이다.
- 특정한 이름을 가진 스프링 빈을 찾아 그 빈에게 요청을 위임한다.
- Why? 서블릿 필터(서블릿 컨테니어)와 시큐리티 필터(스프링 컨테이너)는 서로 다른 컨테이너에서 생성되고 동작한다.
- 요청 순서
- Servlet Filter가 요청을 DelegatingFilterProxy로 전달한다.
- DelegatingFilterProxy는 해당 요청을 스프링 컨테이너에 생성 된 Filter를 구현한 스프링 빈에 위임한다.
- springSecurityFilterChain 이름으로 생성된 빈을 ApplicationContext에서 찾아 위임을 요청 (실제 보안 처리를 하지 않음)
- 코드 분석
SecurityFilterAutoConfiguration 클래스에서 DelegatingFilterProxyRegistrationBean를 빈으로 등록한다.
DelegatingFilterProxyRegistrationBean 클래스 DelegatingFilterProxy 객체를 생성한다.
this.setTargetBeanName(targetBeanName) DelegatingFilterProxy로 요청이 들어올 때 처리를 위임 할 스프링 빈 이름(springSecurityFilterChain)을 설정한다.
요청이 들어오면 가장 먼저 DelegatingFilterProxy의 doFilter() 함수가 호출된다. doFilter() 함수는 요청을 위임할 필터(springSecurityFilterChain)를 찾아서 해당 요청을 위임(invokeDelete())한다.
invokeDelete() 함수 호출 시 내부에서 FilterChainProxy의 doFilter() 함수를 호출하고, doFilterInternal() 함수에서는 등록 된 Filter 목록을 가지고 인증/인가 처리를 진행한다.
FilterChainProxy
- springSecurityFilterChain의 이름으로 생성되는 필터 빈이다.
- DelegatingFilterProxy로부터 요청을 위임 받고 실체로 보안을 처리한다.
- 스프링 시큐리티 초기화 시 생성되는 필터들을 관리하고 제어한다.
- 스프링 시큐리티가 기본적으로 생성하는 필터
- WebAsyncManager
- SecurityContextPersistenceFilter
- HeaderWriterFilter
- LogoutFilter
- AnonymousAuthenticationFilter
- SessionManagementFilter
- 설정 클래스에서 API 추가 시 생성되는 필터
- 스프링 시큐리티가 기본적으로 생성하는 필터
- 사용자의 요청을 필터 순서대로 호출하여 전달한다.
- 사용자 정의 필터를 생성해서 기존의 필터 전후로 추가 가능하다.
- 마지막 필터까지 인증 및 인가 예외가 발생하지 않으면 보안을 통과한다.
- 코드 분석
webSecurity.build() 함수 호출 시 springSecurityFilterChain이름의 FilterChainProxy 빈을 생성한다.
'강의노트 > 스프링 시큐리티' 카테고리의 다른 글
[스프링 시큐리티] 인증 정보 저장 객체(Authentication) (0) 2020.09.14 [스프링 시큐리티] 필터 초기화와 다중 보안 설정 (0) 2020.09.14 [스프링 시큐리티] CsrfFilter (0) 2020.09.12 [스프링 시큐리티] ExceptionTranslationFilter (0) 2020.09.12 [스프링 시큐리티] 권한 설정과 표현식 (0) 2020.09.10