공식문서 : https://docs.spring.io/spring-security/reference/servlet/architecture.html#servlet-filters-review
이 글은 공식문서를 참조하여 공부하면서 기록 한 것입니다. 정확한 텍스트는 공식문서를 참조하시기 바랍니다.
3줄요약
- Spring Security는 Filter와 FilterChain을 응용한 기술이다.
- SpringSecurity에 관해 최적의 Debug포인트는 FilterChainProxy이다.
- SecurityFilterChain에 있는 Security Filter들은 전형적인 빈으로 FilterChainProxy로 등록된다.
Spring Security의 동작원리를 이해하기 위해서는 Filter와 FilterChain에 대해 이해하는 것이 중요하다.
FilterChain은 1개 이상의 Filter로 이루어져 동작한다.
클라이언트가 어플리케이션에 요청을 보내면, 컨테이너는 요청 URI 경로에 기반하여 HttpServletRequest를 처리해야 하는 Filter Instance와 Servlet을 포함하는 FilterChain을 생성한다.
각 필터는 요청 또는 응답을 검사하고, 변경하거나, 특정 조건에 따라 다음 필터나 Servlet의 실행을 중단하는 역할을 하므로 어플리케이션은 FilterChain을 통해 보안, 로깅, 요청 전처리 및 응답 후처리 등의 다양한 작업을 수행할 수 있다.
Spring MVC 어플리케이션에서는 Servlet이 DispatcherServlet의 인스턴스이기 때문에 하나의 Servlet만 하나의 HttpServletRequest와 HttpServletResponse를 처리할 수 있지만, 여러 필터를 사용하여 요청에 대한 작업 응용이 가능하게 한다.
Servlet Container는 자체 표준을 사용하여 Filter Instance를 등록할 수 있지만, Spring에서 정의한 빈을 인식하지 못한다.
이것을 해결하기 위해 Spring은 DelegatingFilterProxy라는 필터 구현을 제공하여 Servlet Container의 생명 주기와 Spring의 ApplicationContext 사이의 연결을 가능하게 한다. 또한 모든 작업을 필터를 구현한 Spring 빈에 위임할 수 있다.
DelegatingFilterProxy의 장점은 어플리케이션 시작지점과 Spring Bean 로딩 사이에 유연성을 확보하기 위해 필터 Bean 인스턴스를 지연조회 하는 것도 있다.
FilterChainProxy는 DelegatingFilterProxy에 의해 감싸져 사용되는 빈으로 Spring Security가 제공하는 특별한 필터로써 동작한다.
가장 큰 장점은 여러 Filter Instance에 작업을 위임이 가능하다는 것인데, 이는 SecurityFilterChain을 통해 다양한 보안 필터로의 위임을 가능함을 의미한다.
SecurityFilterChain에 있는 Security Filter들은 전형적인 빈으로 FilterChainProxy로 등록되는데 이것은 3가지 장점이 있다.
1. FilterChainProxy를 사용하면 Spring Security의 Servlet의 지원을 받는다.
2. SecurityContext에 의해 메모리 누수가 일어나지 않고, Spring Security의 HttpFirewall에 의해 보안성이 높아진다.
3. FilterChainProxy는 RequestMatcher 인터페이스를 사용하여 HttpServletRequest의 다양한 요소를 기반으로 언제 SecurityFilterChain을 호출할지 결정함으로써 유연성을 제공한다.
'Backend > Spring | SpringBoot' 카테고리의 다른 글
[Spring Security] 인증 표현식 (0) | 2024.03.20 |
---|---|
[Spring Security] Survlet 기반 Application 아키텍쳐(2) (0) | 2024.03.19 |
[Spring Security] SpringSecurityConfig 적용 (0) | 2024.03.18 |
[Spring Security] Spring Security 적용 (0) | 2024.03.15 |
[Spring] @RequestBody (0) | 2024.03.14 |