본문 바로가기

Spring Framework/SpringSecurity

[Spring Security] SecurityFilterChain

SecurityFilterChain의 개요

이 글은 Spring Security 6.4.3을 기반으로 작성되었습니다.

 

 

SecurityFilterChain은 FilterChainProxy에 의해서 사용되고,

여러 개의 Security Filter들로 구성되어 있습니다.

 

이 SecurityFilterChain을 통해 보안 처리가 이루어진다고 생각하시면 됩니다.

 

 

 

 

Security Filter들은 보통 Bean이지만,

DelegatingFilterProxy나 Servlet container에 등록되는 대신 FilterChainProxy에 등록됩니다.

 

 

이를 통해 얻는 장점이 몇 가지 있습니다.

1. Spring Security 디버깅이 편리해집니다.
- FilterChainProxy는 모든 스프링 시큐리티 지원의 시작점입니다. 중앙 집중적으로 필터를 관리하므로, 만약 문제가 발생한다면 이곳에 debug point를 잡고 시도하면 됩니다.

2. 여러 작업의 자동화
- SecurityContext는 사용자의 인증 정보를 담고 있는 객체로, 메모리 누수를 막기 위해 요청이 끝난 후 이를 처리해야 합니다. FilterChainProxy는 모든 요청이 끝나면 SecurityContext를 자동으로 정리해줍니다.
- HttpFirewall 등을 자동 적용해줌으로써 기본적인 보안을 갖출 수 있도록 도와줍니다.

3. 유연한 동작
- Servlet 컨테이너오직 URL로만 Filter들을 호출합니다.
- FilterChainProxyRequestMatcher 인터페이스를 사용해 같은 URL이라도 GET과 POST를 구분한다던가,  파라미터 조건에 따라 다르게 실행한다던가 하는 세밀하고 유연한 제어가 가능해집니다.

※URL 호출과 관련된 건 아래에서 더 자세히 다루겠습니다.

 

 

 

SecurityFilterChain의 다중화

위의 그림과 같이 여러 개의 SecurityFilterChain을 적용하는 것도 가능합니다.

 

 

FilterChainProxy는 URL, HTTP 메서드, 파라미터, 헤더 등의 정보를 통해

어떤 SecurityFilterChain이 적용될지 결정합니다.

 

 

이때, 오직 첫 번째로 매치된 SecurityFilterChain만 적용된다는 걸 유의해주시기 바랍니다.

예를 들어, 위 그림에서 /api/**의 URL 요청이 오면 SecurityFilterChain0만 적용됩니다. SecurityFilterChainN은 적용되지 않습니다.

만약 /messages/의 URL 요청이 오면 SecurityFilterChain0과 부합하지 않으므로 다른 SecurityFilterChain들을 탐색해나갑니다. 매치되는게 없으므로 /**의 URL을 가진 SecurityFilterChainN이 매치됩니다.

 

 

또 알아둬야 할 것이 각 SecurityFilterChain은 독립적이고 고유하게 구성될 수 있다는 것입니다.

SecurityFilterChain0은 3개의 SecurityFilter를 가진 반면,
SecurityFilterChainN은 4개의 SecurityFilter를 가진 게 그 예시입니다.

만약 특정 요청에서 SpringSecurity를 무시하고 동작하게 하려면,
SecurityFilter를 0개를 가진 SecurityFilterChain을 등록할 수도 있습니다.

 

 

 

다음 포스트부터는 Spring Security의 적용과 관련된 Security Filter에 대해 알아보겠습니다.

 

 

Reference

https://docs.spring.io/spring-security/reference/servlet/architecture.html