새소식

반응형
Java/Spring

Spring Security Filter 등록 및 실행 순서

  • -
반응형

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

 

 

 

 

 

반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.