Info/개념 정리

[개념] Spring Security Filter

soohykeee 2023. 1. 15. 16:04
728x90


 

Spring Security 란 무엇인가?

 

[개념] Spring Security 란 무엇인가?

Spring Security란? Spring 기반의 애플리케이션의 보안(인증, 권한, 인가)을 담당하는 스프링 하위 프레임워크이다. Spring Security는 인증(Authentication), 권한(Authorization)에 대한 부분을 Filter의 흐름에 따

soohykeee.tistory.com

 


 

웹 서비스에서 Spring Security는 MVC 패턴 이전에 'Filter' 로서 동작한다. Filter란 클라이언트 요청이 서블릿으로 가기 전에 먼저 처리할 수 있도록 Tomcat (WAS) 에서 지원해주는 기능이다.

 

Servlet Container의 Filter

 

  • Servlet 컨테이너의 Filter는 Dispathcer Servlet으로 가기 전에 먼저 적용된다.
  • Filter들은 여러개가 연결되어 있어 Filter chain이라고도 불린다.
  • 모든 Request들은 Filter chain을 거쳐야지 Servlet에 도착하게 된다.

 

 

Security의 Filter

 

  • Spring Security는 DelegatingFilterProxy 라는 Filter를 만들어 메인 Filter chain에 끼워넣고, 그 아래 다시 SecurityFilterChain 그룹을 등록한다.
  • 위와 같이 하면 URL에 따라 적용되는 Filter Chain을 다르게 하는 방법을 사용한다.
  • 특정한 경우에는 해당 Filter를 무시하고 통과하게 할 수도 있다.
  • WebSecurityConfigurerAdapter는 Filter chain을 구성하는 Configuration 클래스로 해당 클래스의 상속을 통해 Filter Chain을 구성할 수 있다.
  • configure(HttpSecurity http)를 @Override하며 filter들을 세팅한다.

 


 

Security Filter의 종류

  • HeaderWriterFilter : Request의 Http 해더를 검사하여 header를 추가하거나 빼주는 역할을 한다.

  • CorsFilter : 허가된 사이트나 클라이언트의 요청인지 검사하는 역할을 한다.

  • CsrfFilter : Post나 Put과 같이 리소스를 변경하는 요청의 경우 내가 내보냈던 리소스에서 올라온 요청인지 확인한다.

  • LogoutFilter : Request가 로그아웃하겠다고 하는것인지 체크한다.

  • UsernamePasswordAuthenticationFilter : username / password 로 로그인을 하려고 하는지 체크하여 승인이 되면 Authentication을 부여하고 이동 할 페이지로 이동한다. 만약 인증 실패시, AuthenticationFailureHandler를 실행한다.

  • DefaultLoginPageGenerationgFilter : 사용자가 별도의 로그인 페이지를 구현하지 않은 경우, 스프링에서 기본적으로 설정한 로그인 페이지를 처리한다.

  • BasicAuthenticationFilter : HTTP요청의 (BASIC)인증 헤더를 처리하여 결과를 SecurityContextHolder에 저장한다.

  • ConcurrentSessionFilter : 동시 접속을 허용할지 체크한다.

  • BearerTokenAuthenticationFilter : Authorization 해더에 Bearer 토큰을 인증해주는 역할을 한다.

  • BasicAuthenticationFilter : Authorization 해더에 Basic 토큰을 인증해주는 역할을 한다.

  • RequestCacheAwareFilter : request한 내용을 다음에 필요할 수 있어서 Cache에 담아주는 역할을 한다. 다음 Request가 오면 이전의 Cache값을 줄 수 있다.

  • SecurityContextHolderAwareRequestFilter : 보안 관련 Servlet 3 스펙을 지원하기 위한 필터라고 한다.

  • RememberMeAuthenticationFilter : SecurityContext에 인증 객체가 있는지 확인하고, 아직 Authentication 인증이 안된 경우라면 RememberMe 쿠키를 검사해서 인증 처리해준다.

  • AnonymousAuthenticationFilter : 앞선 필터를 통해 인증이 아직도 안되었으면 해당 유저는 익명 사용자라고 Authentication을 정해주는 역할을 한다. (Authentication이 Null인 것을 방지)

  • SessionManagementFilter : 서버에서 지정한 세션정책에 맞게 사용자가 사용하고 있는지 검사하는 역할을 한다. 요청이 시작된 이후 인증된 사용자인지 확인하고, 인증된 사용자일 경우 SessionAuthenticationStrategy를 호출하여 세션 고정 보호 메커니즘을 활성화하거나 여러 동시 로그인을 확인하는 것과 같은 세션 관련 활동을 수행한다.

  • ExcpetionTranslationFilter : 해당 필터 이후에 인증이나 권한 예외가 발생하면 해당 필터가 처리를 해준다.

  • FilterSecurityInterceptor : 사용자가 요청한 request에 들어가고 결과를 리턴해도 되는 권한(Authorization)이 있는지를 체크한다. 해당 필터에서 권한이 없다는 결과가 나온다면 위의 ExcpetionTranslationFilter필터에서 Exception을 처리해준다.

 

 

* Bearer 토큰

Bearer 토큰은 토큰을 소유한 사람에게 액세스 권한을 부여하는 일반적인 토큰 클래스이다. 액세스 토큰, ID 토큰, 자체 서명 JWT는 모두 Bearer 토큰이다.

인증에 Bearer 토큰을 사용하려면 HTTPS와 같은 암호화된 프로토콜로 제공되는 보안이 필요한데, Bearer 토큰을 가로채면 악의적인 행위자가 이를 사용하여 액세스 권한을 얻을 수 있다.

Bearer 토큰이 사용 사례에 충분한 보안을 제공하지 않으면 또 다른 암호화 레이어를 추가하거나 BeyondCorp Enterprise와 같이 신뢰할 수 있는 기기의 인증된 사용자만으로 액세스를 제한하는 상호 전송 계층 보안(mTLS)을 사용하는 것이 좋다.

 

 

 


 

참고:
https://codevang.tistory.com/275
https://velog.io/@seongwon97/Spring-Security-Filter%EB%9E%80
https://cloud.google.com/docs/authentication/token-types?hl=ko#bearer

728x90