Published on

[ Spring Sequrity ] 스프링 시큐리티(Spring security) 아키텍처

Authors
  • avatar
    Name
    유사공대생
    Twitter

들어가며,

image

Spring Security의 Servlet 지원은 Servlet Filters를 기반으로 하므로, 일반적으로 Filter의 역할을 먼저 살펴보는 것이 도움이 된다. 다음 이미지는 단일 HTTP 요청에 대한 핸들러의 일반적인 계층 구조를 보여준다.

클라이언트는 요청을 애플리케이션에 보내고, 컨테이너는 요청 URI의 경로를 기반으로 HttpServletRequest를 처리해야 할 Filter 인스턴스와 Servlet을 포함하는 FilterChain을 생성한다. Spring MVC 애플리케이션에서 Servlet은 DispatcherServlet의 인스턴스이다. 최대로 하나의 Servlet만 단일 HttpServletRequest와 HttpServletResponse를 처리할 수 있다. 그러나 하나 이상의 Filter를 사용하여 다음과 같은 작업을 수행할 수 있다.

  • 하위 Filter 인스턴스 또는 Servlet이 호출되지 않도록 방지한다. 이 경우, Filter는 일반적으로 HttpServletResponse를 작성한다.
  • 하위 Filter 인스턴스와 Servlet이 사용하는 HttpServletRequest 또는 HttpServletResponse를 수정한다.

Filter의 힘은 그 안으로 전달되는 FilterChain에서 나온다.

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
	// do something before the rest of the application
    chain.doFilter(request, response); // invoke the rest of the application
    // do something after the rest of the application
}

Filter는 하위 Filter 인스턴스와 Servlet에만 영향을 미치기 때문에, 각 Filter가 호출되는 순서는 매우 중요하다.

DelegatingFilterProxy

Spring은 Servlet 컨테이너의 라이프사이클과 Spring의 ApplicationContext 간의 연결을 가능하게 하는 DelegatingFilterProxy라는 Filter 구현체를 제공한다. Servlet 컨테이너는 자체 표준을 사용하여 Filter 인스턴스를 등록할 수 있지만, Spring이 정의한 Bean들에 대해 인식하지 못한다. DelegatingFilterProxy를 통해 표준 Servlet 컨테이너 메커니즘을 사용하여 등록할 수 있지만, 모든 작업을 Filter를 구현한 Spring Bean에 위임할 수 있다.

다음은 DelegatingFilterProxy가 Filter 인스턴스와 FilterChain에 어떻게 적용되는지를 보여주는 그림이다.

image

FilterChainProxy

image

SecurityFilterChain

image

image

Handling Security Exceptions

image