FilterChain

구황작물·2022년 7월 22일
0

Security

목록 보기
6/10

필터는 클라이언트의 request, response를 가로채는 데 사용되는 객체이다. 필터는 두가지의 작업을 수행 할 수 있다.
client의 요청을 가로채어 작업을 수행
response가 되기 전 가로채어 작업을수행

Spring Security는 주요 보안처리를 여러가지의 Filter로 처리하도록 구성되어 있다.(대표적으로 Authentication, Authorization이 있다.)

FilterChain

  • FlterChain은 여러개의 Filter들이 사슬처럼 연결되어 있고 서로 연결되어 동작한다.

  • 클라이언트가 앱에 요청을 보내고 컨테이너는 요청 URI의 경로를 기반으로 어떤 필터와 어떤 서블릿을 적용할지 결정한다.

  • 클라이언트로부터 요청이 오면 컨테이너는 Servlet와 여러 Filter로 구성된 FilterChain을 만들어 요청 URI path기반("/user/**")으로 HttpServletRequest를 처리한다.

  • FilterChain 형성시 순서가 지정되며 실제로 요청을 처리할 때 필터가 나머지 체인을 거부할 수 있다.

  • 그러므로 FilterChain 순서는 매우 중요하며, Spring Boot에선는 두가지 매커니즘을 통해 순서를 관리한다
    1. Filter 타입의 @Beans에 @Order를 붙인다.
    2. API의 일부로 순서를 가지는 FilterRegistrationBean의 일부가 된다.

  • Filter는 요청이 DispatcherServlet에 의해 다뤄지기 전, 후에 동작한다.

[FilterChain의 예시]

@EnableWebSecurity(debug = true) // request가 올 떄마다 어떤 filter를 사용하고 있는지 출력을 해준다.
@EnableGlobalMethodSecurity(prePostEnabled = true) // 사전에 prePost로 권한체크를 한다.
public class SecurityConfig extends WebSecurityConfigurerAdapter {
// FilterChain을 구성하는 Configuration클래스이다

    @Override
    protected void configure(HttpSecurity http) throws Exception {
    // HttpSecurity는 스프링 시큐리티의 설정을 담당한다.(Filter들을 Setting한다)
    http.authorizeRequest()
    .antMatchers("/user/**").authenticated()
    .antMatchers("/manager/**").access("hasRole('ROLE_ADMIN') or hasRole('ROLE_MANAGER')");
    .antMatchers("/manager/**").access("hasRole('ROLE_ADMIN')")
    .anyRequest().permitAll()
    .and().formLogin().loginPage("/login");
    
    http.httpBasic();
        
    }
}

Filter 인터페이스

  • public void init() : 필터를 웹 컨테이너에 생성한 후 초기화시 호출한다.

  • public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) :
    사용자가 특정한 자원 요청시 그 자원 사이에 필터가 존재하면 필터를 수행 시키고 체인을 따라 다음 존재하는 필터로 이동한다. 체인의 가장 마지막에는 클라이언트가 요청한 최종 지원이 위치한다.

  • public void destroy() : 필터가 웹 컨테이너 삭제시 호출된다.

public class FirstFilter implements Filter {
  
     public void init(FilterConfig filterConfig) throws ServletException {
        // 필터 초기화 작업
     }
     
     public void doFilter(ServletRequest request,
                          ServletResponse response,
                          FilterChain chain)
                          throws IOException, ServletException {
        // 1. request 파리미터를 이용하여 요청의 필터 작업 수행
        // 2. 체인의 다음 필터 처리
        chain.doFilter(request, response);        // 3. response를 이용하여 응답의 필터링 작업 수행
     }
     
     public void destroy() {
        // 주로 필터가 사용한 자원을 반납
     }
  }

DelegatingFilterProxy

Servlet Filter는 Servlet 스펙이기 때문에 스프링에서 정의된 빈을 주입받을 수 없다. 그러나 보안 정책을 정의하고 사용자, 저장소, 기타등등 여러 위치에서 빈 주입이 필요하다.

그래서 스프링 시큐리티는 DelegationFilterProxy를 통해 서블릿 컨테이너에게 필터로서 요청을 취득하고 스프링 컨테이너에 존재하는 특정 빈(SpringSecurityFilterChain)을 찾아 보안처리를 위임한다.

FilterChainProxy

FilterChainProxy는 SpringSecurityFilterChain이라는 이름으로 생성되는 필터 Bean으로 Spring Security에서 제공하는 Filter들을 호출한다.

FilterChainProxy는 DelegatingProxyFilter를 통해(DelegatingFilterProxy로 감싸짐) Servlet Filter에 내장되어 있다.

DelegatingFilterProxy에게 요청을 위임 받고 스프링 시큐리티 초기화 시 생성되는 필터들을 관리하고 제어한다.

FilterChainProxy는 처리를 위임하기 위한 SecurityFilterChain를 들고 있다. 단순히 하나의 SecurityFilterChain만이 아닌 여러 SecurityFilterChain을 가지고 있을 수 있으며 각 SecurityFilterChain안에 걸릴 Filter들을 다르게 설정 할 수 있다.

profile
그냥 개발 좋아하는 덩이뿌리식물

0개의 댓글

관련 채용 정보