Jin's Dev Story

[Spring Security] Security의 흐름 본문

Web & Android/Spring Security

[Spring Security] Security의 흐름

woojin._. 2023. 10. 17. 16:06
Filter

→ 서블릿 컨테이너의 Filter는 Dispatch Survlet으로 가기 전에 먼저 적용

→ client가 http request를 보낼 때 먼저 filter를 거친다는 뜻을 내포하는 그림

→ client가 보낸 http request는 여러 개의 filter를 거쳐가게 됨

→ 이러한 filter들이 여러 개로 엮여서 chain의 형태를 띈다고 하여 위의 형태를 Filter chain 이라고 부름

→ 모든 Request들은 Filter chain을 거쳐야지 servlet에 도착함

 

→ Spring Security는 Filter chain 사이에 DelegationFilterProxy 라는 것을 끼워넣어서 보안 정책을 수행함

⇒ 경우에 따라 보안 정책을 달리해야하므로 filter의 적용을 다르게 해야할 수도 있기 때문에 filter chain 사이에 그룹을 하나 끼워넣어서 경우에 따라 다른 보안 정책을 적용하겠다는 것

💡 Filter 종류
  • SecurityContextPersistenceFilter
    • SecurityContextRepository에서 SecurityContext를 로드하고 저장
  • LogoutFilter
    • Request가 로그아웃하겠다고 하는 것인지 체크
  • UsernamepasswordAuthenticationFilter
    • username / password 로 로그인을 하려고 하는지 체크하여 승인이 되면 Authentication을 부여하고 이동 할 페이지로 이동
  • HeaderWriterFilter
    • Http 헤더를 검사하여 header를 추가하거나 빼주는 역할
  • CorsFilter
    • 허가된 사이트나 클라이언트의 요청인지 검사하는 역할
  • CsrfFilter
    • 리소스를 변경하는 요청의 경우 내가 내보낸 리소스에서 올라온 요청인지 확인
  • 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을 처리
💡 Filter Chain 확인 방법
  • SecurityConfig 클래스 위에 @EnableWebSecurity(debug=true) 어노테이션을 붙여주면 현재 실행되는 Security Filter들을 확인할 수 있음