이번 섹션에서는 Servlet
기반 애플리케이션 내에서 Spring Security
의 고수준 아키텍쳐
에 대해서 설명한다.
참조의 인증
, 권한 부여
, 악용에 대한 보호
를 사용할 때 아키텍쳐에 대한 높은 수준의 이해를 요구한다고 한다.
Spring Security
의 Servlet
지원은 Servlet
을 기반으로 하므로 Filter
의 역할을 먼저 살펴보는 것이 도움이 된다.
아래의 Filter
그림은 단일 HTTP
요청에 대한 처리기의 일반적인 계층화를 보여준다.
클라이언트는 애플리케이션에 요청을 보내고 컨테이너는 FilterChain
를 포함하고 요청 URI
의 경로를 기반으로 처리한다.
Spring
은 Servlet Filter
와 DelegatingFilterProxy
컨테이너의 라이프사이클과 Spring의 ApplicationContext
를 지원한다.
DelegatingFilterProxy
는 서블릿 컨테이너
와 스프링 컨테이너(어플리케이션 컨텍스트)
사이의 링크를 제공하는 ServletFilter
이다.
특정한 이름을 가진 스프링 빈을 찾아 그 빈에게 요청을 위임
한다.
Why? 서블릿 필터(서블릿 컨테이너)
와 시큐리티 필터(스프링 컨테이너)
는 서로 다른 컨테이너에서 생성되고 동작하기 때문에 이를 연결해줄 것이 필요함
다음은 DelegatingFilterProxy
의 동작 방식이다.
DelegatingFilterProxy
에서 Bean Filter
를 찾은 다음 ApplicationContext
를 호출한다.
무슨말인지 잘 이해가 안될 수 있지만 아래 그림을 보면 이해가 좀 더 쉬울 것이다.
참고로 DispatcherServlet
보다 DelegatingFilterProxy
의 우선순위가 더 높다.
따라서 DispatcherServlet
이 요청을 다 가로채갈일은 없다고 보면된다.
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
Filter delegate = getFilterBean(someBeanName);
delegate.doFilter(request, response);
}
정리해서 DelegatingFilterProxy
까지 적용된 요청의 동작 순서는 Request
가 Filter
(Servlet 컨테이너)를 거치다가 DelegatingFilterProxy
를 만나면 ApplicationContext
(Spring 컨테이너)로 이동해서 인증을 마저 진행한다.
사진으로 보면 다음과 같다.
Spring Security
의 Servlet
지원은 FilterChainProxy
를 통해 많은 인스턴스에 위임할 수 있는 특수한 기능도 포함되어 있다.
Spring 컨테이너
로 도착한 요청은 DelegatingFilterProxy
로부터 요청을 위임
받고 실제로 보안을 처리한다.
사용자의 요청을 필터 순서대로 호출하여 전달한다. 사용자 정의 필터를 생성해서 기존의 필터 전후로 추가 가능하다.
마지막 필터까지 인증
및 인가
예외가 발생하지 않으면 보안을 통과한다.
FilterChainProxy
에서 잠깐 살펴 봤던것과 같이 마지막 필터까지 인증
및 인가
예외가 발생하지 않으면 보안을 통과한다.
스프링 시큐리티에서 제공하는 필터는 다음과 같다.