[Spring Security] Filter란?

SeongWon Oh·2021년 12월 26일
13

Spring Framework

목록 보기
25/33
post-thumbnail

Filter

Survlet Container의 Filter

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

Security의 Filter

  • Spring Security는 DelegatingFilterProxy 라는 필터를 만들어 메인 Filter Chain에 끼워넣고, 그 아래 다시 SecurityFilterChain 그룹을 등록한다.
  • 그렇게 하며 URL에 따라 적용되는 Filter Chain을 다르게 하는 방법을 사용한다.
  • 어떠한 경우에는 해당 Filter를 무시하고 통과하게 할 수도 있다.
  • WebSecurityConfigurerAdapter는 Filter chian을 구성하는 Configuration클래스로 해당 클래스의 상속을 통해 Filter Chain을 구성할 수 있다.
  • configure(HttpSecurity http)를 override하며 filter들을 세팅한다.
@EnableWebSecurity(debug = true) // request가 올 떄마다 어떤 filter를 사용하고 있는지 출력을 해준다.
@EnableGlobalMethodSecurity(prePostEnabled = true) // 사전에 prePost로 권한체크를 하겠다는 설정!!
public class SecurityConfig extends WebSecurityConfigurerAdapter {
// WebSecurityConfigurerAdapter`는 Filter chian을 구성하는 Configuration클래스

    @Override
    protected void configure(HttpSecurity http) throws Exception {
    // HttpSecurity를 설정하는 것이 Filter들을 Setting하는 것이다.
        http.authorizeRequests((requests) ->
                requests.antMatchers("/").permitAll()
                        .anyRequest().authenticated()
        );
        http.formLogin(login->
                login.defaultSuccessUrl("/", false));
       http.httpBasic();
    }
}

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을 처리해준다.

Filter Chain 확인하는 방법

WebSecurityConfigurerAdapter을 상속받아 Filter Chain을 만드는 Class위에 @EnableWebSecurity(debug = true)어노테이션을 붙여주면 현재 실행되는 Security Fiter들을 확인할 수 있다.

Filter Chain이 적용되는 URL설정하는 방법

  • 해당 filter를 동작시킬 URL을 설정하려면 http.antMatcher를 통해 설정해야한다.
  • 모든 request에 대해 동작하려면 다음과 같이 http.antMatcher("/**")로 하며 /api~~에 대해서 적용을 하고 싶다면 http.antMatcher("/api/**") 와 같이 해줘야한다.
  • 여러 종류의 URL에 대해 여러 Filter를 만들고 싶다면 SecurityConfig 클래스를 여러개 만들어줘야하며 여러개의 sequrityConfig은 순서가 중요하여 class위에 @Order annotation을 붙여줘야한다.
@Order(1) // order가 낮은 것부터 먼저 설정을 한다.
@EnableWebSecurity(debug = true)
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
    
     	http.antMatcher("/**"); // 해당 filter가 동작할킬 URL을 설정하려면 antMatcher를 통해 설정해야한다.
       
        http.authorizeRequests((requests) ->
                requests.antMatchers("/").permitAll()
                        .anyRequest().authenticated()
        );
        http.formLogin(login->
                login.defaultSuccessUrl("/", false));
       http.httpBasic();
    }
}

Reference

profile
블로그 이전했습니다. -> https://seongwon.dev/

0개의 댓글