삽질 주도 개발
article thumbnail
공식 문서에서 설명하는 스프링 시큐리티 아키텍처를 보며 정리하는 글입니다.

 

스프링 시큐리티는 스프링 애플리케이션의 인증/인가 및 보안적 요소들을 손쉽게 관리할 수 있도록 해

주는 스프링 프로젝트 중 하나이다.

 

단일 요청의 서블릿 컨테이너 형식적 계층

클라이언트가 애플리케이션으로 요청을 보내면, 서블릿 컨테이너는 FilterChain을 생성하게 된다. FilterChain Filter 인스턴스들과 request URI 경로를 기반으로 한 HttpServletRequest를 처리하기 위한 Servlet을 포함한다.

 

Spring application의 Servlet은 DispatcherServlet이 실구현체가 된다.

FilterChain

 

코드를 통해 확인해보자.

위에서 FilterChain에서는 filtersservlet을 가지고 있는 것을 확인할 수 있다.
내부 동작을 확인해보자.

그리고 FilterChain 내부에서 filter들은 doFilter() 메서드를 호출하고, 모든 filter들을 거친 후에 servlet에게 service 메서드를 호출하도록 하고 있는 것을 확인할 수 있다.

 

DelegatingFilterProxy

스프링은 Filter를 구현한 DelegatingFilterProxy를 제공한다. DelegatingFilterProxy는 서블릿 컨테이너의 라이프사이클과 스프링의 ApplicationContext(스프링 컨테이너)를 연결해주는 역할을 한다.

 

Filter는 스프링 컨텍스트 외부에서 동작하기 때문에 스프링 빈으로 등록하고 사용할 수 없다. 하지만, DelegatingFilterProxy는 서블릿 컨테이너의 필터로 등록할 수 있고, 스프링 빈으로도 등록하여 스프링 컨텍스트 내에서 작업을 위임할 수 있게 된다. 

 

DelegatingFilterProxy

 

코드를 통해 확인해보자.

applicationContext에서 Bean Filter를 찾아서 초기화하는 과정
Bean Filter에게 위임하는 과정

 

FilterChainProxy

스프링 시큐리티는 FilterChainProxy를 가지고 있다. FilterChainProxy는 내부 SecurityFilterChain을 통해 많은 필터들을 위임시켜주는 특별한 Filter이다. SecurityFilterChain은 Bean이기 때문에 기본적으로 DelegatingFilterProxy에 감싸져있다.

 

FilterChainProxy

 

코드를 통해 확인해보자.

filterChainDecorator는 filter들을 차례대로 doFilter() 메서드를 호출시켜주는 역할을 한다.

 

SecurityFilterChain

SecurityFilterChain은 FilterChainProxy에 의해 현재 요청에 대해 실행되어야 할 스프링 시큐리티가 제공하는 필터들의 집합이다.

 

스프링 시큐리티가 제공하는 FilterChainProxy을 통해 우리가 얻을 수 있는 이점은 다음과 같다.

 

첫째, Spring Security의 모든 서블릿 지원을 위한 시작점을 제공한다. 따라서 Spring Security의 Servlet 문제를 해결하려는 경우 FilterChainProxy에 디버그를 추가하는 것이 좋은 시작점이다.

둘째, FilterChainProxy는 Spring Security의 중심이기 때문에 보여지지 않는 작업을 수행할 수 있다. 예를 들어 메모리 누수를 방지하기 위해 SecurityContext를 지우거나 Spring Security의 HttpFirewall을 적용하여 특정 유형의 공격으로부터 애플리케이션을 보호하는 기능을 수행한다.

셋째, SecurityFilterChain을 호출해야 하는 시기를 결정하는 데 더 많은 유연성을 제공한다. Servlet 컨테이너에서 Filter 인스턴스는 URL만을 기준으로 필터 작업을 수행할 수있다. 하지만, FilterChainProxy는 RequestMatcher를 사용하여 HttpServletRequest의 모든 항목을 기반으로 호출을 결정할 수 있다.

 

코드를 통해 확인해보자.

filters은 스프링 시큐리티에서 제공하는 필터들을 포함한다.

 

 

다음은 스프링 시큐리티에서 제공하는 필터(SecurityFilterChain)들의 항목이다.

 


 

틀렸거나 개선할 점은 댓글 부탁드립니다. 저에게 큰 도움이 됩니다 :)