참고 : https://docs.spring.io/spring-security/reference/servlet/architecture.html

클라이언트로부터 요청이 들어오면 서버는 바로 서블릿을 응답하는 대신, 중간의 서블릿 필터들을 거친다. 이 필터들로부터 인증과 인가의 과정이 포함되고, 필터들은 거친 후에야 서블릿을 제공할지 결정하게 된다.
이 방식에서는 각각의 필터 호출 여부가 오로지 URL만을 기반으로 결정된다.

스프링 시큐리티를 사용하면, 서블릿 필터 중간에 DelegatingFilterProxy 필터가 존재한다. DelegatingFilterProxy는 WAS의 서블릿 컨테이너와, 스프링 컨테이너 간의 연결고리가 된다.
DelegatingFilterProxy 내부에는 스프링 빈으로 등록되는 FilterChainProxy가 있다. FilterChainProxy는 스프링 시큐리티 필터들을 사용하기 위해 SecurityFilterChain에 위임할 수 있게끔 한다.
SecurityFilterChain는 FilterChainProxy가 현재 요청으로부터 어떤 시큐리티 필터를 호출할지 결정할 때 사용된다. SecurytiyFilterChain 내부의 Security Filter들은 일반적으로 FilterChainProxy가 등록될 때 함께 빈으로 등록된다.
시큐리티 필터를 바로 서블릿 필터 체인에 등록할 수도 있지만 그렇게 하지 않는 이유는, 스프링 빈으로 관리될 수 없기 때문이다.
서블릿 필터들 중 하나인 DelegatingFilterProxy 역시 스프링 빈으로 관리될 수 없기 때문에, 이 안에 스프링 빈으로 관리될 수 있는 FilterChainProxy를 둔다. 그리고 FilterChainProxy에 의하여 SecurityFilterChain이 관리된다.
추가적으로, 언제 SecurityFilterChain이 호출될 지 결정하는 것과 관련하여 큰 유연성을 제공한다. 서블릿 컨테이너에서는 필터는 URL만을 기반으로 적용 여부가 결정됐다. 하지만 FilterChainProxy는 HttpServletRequest 내부의 무엇이든 기반으로 해서 필터 적용 여부를 결정할 수 있다. 이때 RequestMatcher 인터페이스를 사용한다.