Spring Boot/Spring Security

[Spring Securtiy] Spring Security의 Filter

수수한개발자 2022. 6. 29.
728x90

Filter

Servlet Container의 Filter

서블릿 컨테이너의 Filter는 Dispatch Servlet으로 가기 전에 먼저 적용된다.

Filter들은 여러개가 연결되어 있어 Filter chain이라고도 불린다.

모든 Request들은 Filter chain을 거쳐야지 Servlet에 도착하게된다.

 

Spring Security의 Filter

  • Spring Security는 DelegatingFilterProxy 라는 필터를 만들어 메인 Filter Chain에 끼워넣고, 그 아래 다시 SecurityFilterChain 그룹을 등록한다.
  • 그렇게 하며 URL에 따라 적용되는 Filter Chain을 다르게 하는 방법을 사용한다.
  • 어떠한 경우에는 해당 Filter를 무시하고 통과하게 할 수도 있다.
  • WebSecurityConfigurerAdapter는 Filter chian을 구성하는 Configuration클래스로 해당 클래스의 상속을 통해 Filter Chain을 구성할 수 있다.
  • configure(HttpSecurity http)를 override하며 filter들을 세팅한다.
  • 스프링 부트 2.7.0 버전 이상을 사용할거면 WebSecurityConfigurerAdapter 상속 대신 SecurityFilterChain을 @Bean으로 등록하면 된다.

Security의 Filter의 종류

  • HeaderWriterFilter : Request의 Http 해더를 검사하여 header를 추가하거나 빼주는 역할을 한다.
  • CorsFilter : 허가된 사이트나 클라이언트의 요청인지 검사하는 역할을 한다.
  • CsrfFilter : Post나 Put과 같이 리소스를 변경하는 요청의 경우 내가 내보냈던 리소스에서 올라온 요청인지 확인한다.
  • LogoutFilter : Request가 로그아웃하겠다고 하는것인지 체크한다.
  • UsernamePasswordAuthenticationFilter : username / password 로 로그인을 하려고 하는지 체크하여 승인이 되면 Authentication을 부여하고 이동 할 페이지로 이동한다.
  • ConcurrentSessionFilter : 동시 접속을 허용할지 체크한다.
  • BearerTokenAuthenticationFilter : Authorization 해더에 Bearer 토큰을 인증해주는 역할을 한다.
  • BasicAuthenticationFilter : Authorization 해더에 Basic 토큰을 인증해주는 역할을 한다.
  • RequestCacheAwareFilter : request한 내용을 다음에 필요할 수 있어서 Cache에 담아주는 역할을 한다. 다음 Request가 오면 이전의 Cache값을 줄 수 있다.
  • SecurityContextHolderAwareRequestFilter : 보안 관련 Servlet 3 스펙을 지원하기 위한 필터라고 한다.
  • RememberMeAuthenticationFilter : 아직 Authentication 인증이 안된 경우라면 RememberMe 쿠키를 검사해서 인증 처리해준다.
  • AnonymousAuthenticationFilter : 앞선 필터를 통해 인증이 아직도 안되었으면 해당 유저는 익명 사용자라고 Authentication을 정해주는 역할을 한다. (Authentication이 Null인 것을 방지!!)
  • SessionManagementFilter : 서버에서 지정한 세션정책에 맞게 사용자가 사용하고 있는지 검사하는 역할을 한다.
  • ExcpetionTranslationFilter : 해당 필터 이후에 인증이나 권한 예외가 발생하면 해당 필터가 처리를 해준다.
  • FilterSecurityInterceptor : 사용자가 요청한 request에 들어가고 결과를 리턴해도 되는 권한(Authorization)이 있는지를 체크한다. 해당 필터에서 권한이 없다는 결과가 나온다면 위의 ExcpetionTranslationFilter필터에서 Exception을 처리해준다.
728x90

댓글