참고 문서 : Spring 공식 문서

Client가 애플리케이션에 Request를 보내면 Container는 요청 URL에 따라 HttpServletRequest를 처리해야 하는 필터와 서블릿을 포함하는 FilterChain을 생성한다.
(하나의 서블릿은 최대 하나의 HttpServletRequest와 HttpServletResponse를 처리 가능)
※. 이떄 다운스트림 필터는 호출되지 않아야 한다. 그 이유는 다운스트림 필터(후행 필터)는 선행 필터에서 서블릿까지 가지 않고 응답을 내려줄 수 있기 떄문에 각각의 필터의 요청과 응답을 수정할 수 있기 때문이다.
※. 필터는 다운스트림 필터와 서블릿에만 영향을 주기 때문에 필터의 호출되는 순서는 중요
스프링 시큐리티가 제공하는 Servlet Container(웹 컨테이너)의 생명주기와 Spring ApplicationContext간의 연결하는 역할의 Filter 구현체

DelegatingFilterProxy의 역할
=> 서블릿 컨테이너에서 관리되는 프록시용 필터로써 우리가 만든 커스텀 필터를 가지고 있다. 이때 커스텀 필터는 스프링 컨테이너의 빈으로 등록되며 빈에 대한 요청이 오면 DelegatingFilterProxy가 요청을 받아 커스텀 필터에게 해당 요청을 위임한다.
DelegatingFilterProxy의 동작 방식 (Spring 기반)
1. Filter 구현체가 스프링 빈으로 등록
2. ServletContext가 Filter 구현체를 갖는 DelegatingFilterProxy를 생성
3. ServletContext가 DelegatingFilterProxy를 서블릿 컨테이너에 필터로 등록
4. 요청이 오면 DelegatingFilterProxy가 필터 구현체에게 요청을 위임하여 필터 처리를 진행
Spring boot에서의 필터 구현체 빈 등록
=> Spring Boot는 자신이 직접 서블릿 컨테이너를 관리하기 때문에 DelegatingFilterProxy 없이 커스텀 필터를 필터 체인에 등록해준다.
시큐리티에서 제공되는 특별한 Filter로 SecurityFilterChain을 통해 많은 필터 인스턴스에게 위임이 가능하다. 참고로 FilterChainProxy은 Bean이다.

좀 더 자세히 설명하면 SecurityFilterChain을 통해 요청에 대한 적절한 인증 과정을 처리하는데 그렇기 하기 위해서는 분기점이 필요하다 ( 이 역할을 FilterChainProxy이 해준다)
최소 한 개 이상의 SecurityFilter가 있으며, 현재 요청에 대해 어떤 Spring 보안 필터 인스턴스를 호출해야 하는지 결정하기 위해 FilterChainProxy에서 사용

SecurityFilterChain API와 함께 FilterChainProxy에 존재한다. 또한 실제로 인증 및 인가 등 보안에 관련된 로직이 존재하는 필터 또한 수 많은 보안 필터에 의해 처리되는데 개발자는 이 필터를 커스텀마이징한다.

ExceptionTranslationFilter가 AccessDeniedException과 AuthenticationException를 처리하여 HTTP Response를 반환
