웹 프로그래밍/[ Spring Security ]

[ Spring Security ] 07. 주요 아키텍쳐 : DelegatingFilterProxy & FilterChainProxy

kim.svadoz 2021. 12. 20. 11:15
반응형
인프런에서 진행하는 정수원 강사님의 "스프링 시큐리티 - Spring Boot 기반으로 개발하는 Spring Security" 강의를 보고 학습을 위해 개인적으로 추가/정리한 글임을 알립니다.

Spring Security 주요 아키텍쳐


DelegatingFilterProxy

Filter는 Servlet 2.3부터 제공되는 기술이다.

필터의 역할은 어떤 요청이 있을 때 이 요청이 실제로 서블릿으로 들어오는데, 서블릿 자원에 들어오기 전에 처리를 하는 곳이 필터.

요청에 대한 최종적인 접근 전, 후로 어떤 처리를 할 수 있도록 하는 기술이 필터이다.

 

image-20211123202705525

이 필터는 서블릿 스펙에 있는 기술이기 때문에 Servlet 컨테이너에서 생성되고 실행이 되기 때문에, 필터는 Spring에서 만든 Bean을 Injection 해서 사용할 수 없다.

스프링은 모든 요청에 대한 인증/인가 처리를 Filter를 통해서 한다. 근데 이 필터는 Spring Bean으로 주입하거나 Spring이 사용하는 기술을 사용할 수 없다. 하지만, Filter에서도 스프링 기술이 필요하게 되는데.

 

이러한 요구사항을 만족하기 위해서 존재하는 클래스가 바로 DelegatingFilterProxy이다.

이는 스프링에서 관리하는 필터가 아니고 서블릿에서 관리하는 필터이다.

 

즉, 요청을 받아서 이 요청을 스프링에서 관리하는 필터에게 요청을 위임하는 역할을 하게 된다.

 

특징

  1. 서블릿 필터는 스프링에서 정의된 빈을 주입해서 사용할 수 없음.
  2. 특정한 이름을 가진 스프링 빈을 찾아서 그 빈에게 요청을 위임한다.
    • springSecurityFilterChain 이름으로 생성된 빈을 ApplicationContext에서 찾아서 요청을 위임한다.
    • 실제로 보안처리를 하지는 않는다.

 

FilterChainProxy

image-20211123203344038image-20211123203939439

왼쪽은 서블릿 컨테이너, 오른쪽은 스프링 컨테이너의 영역이다.

 

사용자가 처음 요청하면 서블릿 컨테이너에서 요청을 받게 된다. (필터가 그 역할을 하게 된다.)

요청에 대해서 각각의 필터들이 처리를 하게 되고, 그 중에서 DelegatingFilterProxy 클래스가 요청을 받게 되면 이 클래스는, 자기가 전달받은 요청 객체를 특정 이름을 가진 빈(springSecurityFilterChain)을 찾아서 요청을 위임한다.

 

실제로는 DelegatinFilterProxy가 필터로 등록될 때, springSecurityFilterChain의 이름으로 등록한다. 내부적으로는 이 이름으로 등록한 이름을 찾는다. 그 이름을 가진 Bean이 바로 FilterChainProxy이다.

FilterChainProxy는 요청에 대해서 각각의 필터별로 호출하고 자기가 관리하는 모든 필터들에 대해 보안처리를 하고, 모두 끝났으면 Spring MVC의 DispatcherServlet으로 전달해서 실제 요청에 대한 서블릿 처리를 하게 된다.

반응형