Spring Security
Architecture
일단 기본적으로 Spring Security는 Servlet Filter layer에서 동작하는 것을 기억하자.
How does Servlet Filter work?
Client에서 애플리케이션에 요청을 하게되면 서블릿 컨테이너에서 서블릿 인스턴스들과 HttpServletRequest 를 처리하는 서블릿으로 이루어진 필터 체인을 생성한다.
Filter Chain = ((Filter Instance1 → Filter Instance2 → Filter Instances . . . → Servlet (Spring Applictation을 사용한다면 Dispatcher Servlet))
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
// 현재 필터에서 처리할 어떤 내용
chain.doFilter(request, response); // 다음 필터 인스턴스나, 서블릿으로 넘김
// 작업이 끝난 후 후처리해야할 파트
}
DelegatingFilterProxy
서블릿 컨테이너의 생명주기와 Spring’s Application Context를 연결해주는 프록시 필터이다. 쉽게 생각하면 Servlet Filter + Application Context를 갖고 있어 스프링 컨테이너에서 관리하는 빈들에 접근이 가능하다.
DelegatingFilterProxy를 통해 빈으로 등록한 필터를 Servlet Filter로서 작동시킬 수 있다.
작동원리는 “빈으로 등록한 필터”의 빈 이름을 DelegatingFilterProxy의 서블릿 필터 이름으로 설정하여 초기화 단계에서 “빈으로 등록한 필터”를 delegate Filter에 등록시킨다.
“DelegatingFilterProxy”의 doFilter는 아래와 같은 방식으로 구현되어있다.
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
Filter delegate = getFilterBean(someBeanName);
delegate.doFilter(request, response);
}
위 코드를 보면 왜 Proxy라는 이름을 가졌는지 알 수 있다.
Why DelegatingFilter Proxy?
Spring 컨테이너가 생성되고 빈으로 등록되는 시점은 ContextLoaderListner가 실행되는 시점이다. 서블릿 필터 등록은 서블릿 컨테이너가 실행하기 전에 등록이 되므로 Spring 컨테이너에서 관리할 수 없는 필터로 등록이 되어버리는 것이다.
SecurityFilterChain
FilterChainProxy
FilterChainPorxy는 SpringSecurity에서 제공하며 여러 필터 인스턴스를 포함하는 특별한 필터이다.
FilterChainProxy또한 빈으로 관리가 되기 때문에 DelegatingFilterProxy에 감싸져 있다.
SecurityFilterChain
SecrurityFilterChain은 FilterChainProxy가 어떤 Security Filter 인스턴스들을 사용할 지 알 수 있도록 도와준다.
SecurityFilterChain에 있는 SecurityFilter는 FilterChainProxy를 통해 관리되는 빈들이다.
기본 필터를 사용했을 때는 URL만을 통해 실행여부가 결정되었다면 FilterChainProxy를 사용하여RequestMatcher Interface를 HttpServletRequest안에 있는 url, method, header등 다양한 정보를 통해 filter 실행 여부를 결정할 수 있다.
Multiple SecurityFilterChain
여러 SecurityFilterChain을 사용하는 경우에 FilterChainProxy는 어떤 SecurityFilterChain을 사용할지 결정해야하는데 처음으로 매치된 것만 실행하도록 구현되어있다. 아래와 같은 그림처럼 구현되어 있다고 가정해보자.

“/api/message” URL에 요청이 왔다면, 처음 매칭되는 SecurityFilterChain0이 매칭되어 실행하고 그 외의 SecurityFilterChain은 실행되지 않는다.
출처 : Spring Docs - https://docs.spring.io/spring-security/reference/servlet/architecture.html
'백엔드 > Spring Framework' 카테고리의 다른 글
| [Spring] WebApplicationInitializer 의 작동원리 (0) | 2024.09.02 |
|---|