Spring Security 6 의 내용을 보다가 문득 Security Filter Chain 의 Filter 실행 순서가 궁금하여 찾아봤다.
참고 사이트(docs.spring.io)
https://docs.spring.io/spring-security/reference/servlet/architecture.html#servlet-security-filters
FilterOrderRegistration.java
https://github.com/spring-projects/spring-security/blob/6.3.3/config/src/main/java/org/springframework/security/config/annotation/web/builders/FilterOrderRegistration.java
위 코드는 실제로 Filter 순서를 등록하는 코드이다.
내용은 아래와 같다.
SecurityFilterChain Flow
아래는 Security Filter Chain 의 기본적인 Filter 들의 목록이다.
Filter 는 서블릿 컨테이너에서 동작하는 서블릿 스펙 기술이기 때문에 Spring Container 에 있는 bean Filter들을
실행할 수가 없다.
그래서 DelegatingFilterProxy 라는 프록시 서블릿 필터가 사용자 요청이 들어왔을 때
ApplicationContext 에서 SpringSecurityFilterChain 이라는 이름으로 생성된 Bean 을 찾아 요청을 위임한다.
전달받은 SpringSecurityFilterChain Bean 은 Filter들을 실행하기 위한 FilterChainProxy 를 찾아
요청을 위임한다.
보통 기본적으로 많이 사용하는 Filter 만 알아보자. (본인 기준)
1. SecurityContextHolderFilter
Spring Security 의 인증정보를 저장하는 인증 객체인 Authentication 을 저장하는곳은 SecurityContext 이다.
이러한 SecurityContext 를 관리하는곳이 SecurityContextHolder 이고 Authentication 및 SecurityContext 의
등록을 위해 SecurityContextHolderFilter 이다.
Spring Security 5 버전까지는 SecurityContextPersistenceFilter 가 인증 객체를 관리하는 필터였는데
Spring Security 6 버전으로 올라가면서 바꼈다.
SecurityContextPersistenceFilter 는 SecurityContext 를 자동으로 저장해왔지만
SecurityContextHolderFilter 는 읽기만을 수행하기 때문에 저장하는 코드가 추가되어야
로그인이 될 수 있다.
2. CsrfFilter
웹 어플리케이션에서 CSRF(Cross-Site Request Forgery) 공격을 방지하기 위한 필터이다.
CsrfFilter 는 HTTP 요청에 대해 CSRF 토큰을 생성하고 해당 토큰을 쿠키에 저장한다.
그리고 모든 HTTP 요청에 대해 CSRF 토큰이 같이 요청 header 에 전송되는지 검증한다.
3. LogoutFilter
Spring Security 의 로그아웃을 담당하는 필터이다.
4. AbstractAuthenticatedProcessingFilter 와 UsernamePasswordAuthenticationFilter
Spring Security 에서 기본적으로 인증을 담당하는 필터이다.
AbstractAuthenticationProcessingFilter 를 상속받아 UsernamePasswordAuthenticationFilter 가
인증을 담당한다.
보통은 UsernamePasswordAuthenticationFilter 를 사용하지 않고
AbstractAuthenticationProcessingFilter 를 상속받은 커스텀 필터를 작성해 로그인 인증을 진행한다.
Security 설정 중 addFilterAt 또는 addFilterBefore 메서드를 통해 UsernamePasswordAuthenticationFilter 보다order 순서를 더 빠르게 등록해 인증을 진행한다.
5. ConcurrentSessionFilter
ConcurrentSessionFilter 는 동시세션제어를 위한 필터이다.
로그인을 했을 때 이미 로그인 되어 있는 사용자를 로그아웃 할것인지
이미 로그인이 되어 있으면 로그인을 할 수 없게 할것인지 설정할 수 있다.
6. SessionManagementFilter
세션 관리를 위한 필터이다.
SessionAuthenticationStrategy 인터페이스의 전략을 사용하여 세션 관리를 하는데
인터페이스를 구현한 클래스들은 아래와 같다.
- CompositeSessionAuthenticationStrategy - 아래 전략들을 실행하는 전략
- ConcurrentSessionControlAuthenticationStrategy - 동시세션제어
- RegisterSessionAuthenticationStrategy - 세션 등록
- SessionFixationProtectionStrategy - 세션 고정 보호
- ChangeSessionIdAuthenticationStrategy
- NullAuthenticatedSessionStrategy