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들을 호출합니다.
- FilterChainProxy는 RequestMatcher 인터페이스를 사용해 같은 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
'Spring Framework > SpringSecurity' 카테고리의 다른 글
[Spring Security] DelegatingFilterProxy와 FilterChainProxy (0) | 2025.02.26 |
---|---|
[Spring Security] Servlet 기반 어플리케이션 보안의 개요 - FilterChain (0) | 2025.02.26 |