부트캠프

Spring Security - Filter 와 Filter Chain

hunm719 2023. 3. 21. 20:00
1.Filter 와 FilterChain

 -앞서 기본 part 1에서 언급했듯이, 서블릿 필터(Servlet Filter)는 서블릿 기반 애플리케이션의 엔드포인트에 요청이 도달하기 전에 중간에서 요청을 가로챈 후 어떤 처리를 할 수 있도록 해주는 Java의 컴포넌트임

서블릿 기반 애플리케이션에서의 Filter 위치

 -위의 그림처럼 클라이언트가 서버 측 애플리케이션으로 요청을 전송하면 제일 먼저 Servlet Filter를 거치고, Filter에서의 처리가 모두 완료되면 DispatcherServlet에서 클라이언트의 요청을 핸들러에 매핑하기 위한 작업을 진행함

 

 -Filter Chain은 여러 개의 Filter가 체인을 형성하고 있는 Filter의 묶음을 의미함

 

  ● Filter 와 Filter Chain의 특성Servlet FilterChain은 요청 URI path를 기반으로 HttpServletRequest를 처리함. 따라서 클라이언트가 서버 측 애플리케이션에 요청을 전송하면, 요청 URI의 경로를 기반으로 어떤 Filter와 어떤 Servlet을 매핑할지 서블릿 컨테이너가 결정함

   Filter는 Filter Chain 안에서 순서를 지정할 수 있으며 지정한 순서에 따라서 동작하게 할 수 있음

   Filter Chain에서 Filter의 순서는 매우 중요하며, 여러 개의 Filter를 등록하고 순서를 지정하는 방법은 아래의 2가지 방법이 있음

      ○ Spring Bean으로 등록되는 Filter에 @Order 애너테이션을 추가하거나 Orderd 인터페이스를 구현해서 Filter의 순서를 지정하는 방법

       FilterRegistrationBean 을 이용해 Filter의 순서를 명시적으로 지정하는 방법

 

 

1-1.Filter 인터페이스

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class FirstFilter implements Filter {
     // (1) 초기화 작업
     public void init(FilterConfig filterConfig) throws ServletException {
        
     }
     
     // (2)
     public void doFilter(ServletRequest request,
                          ServletResponse response,
                          FilterChain chain)
                          throws IOException, ServletException {
        // (2-1) 이곳에서 request(ServletRequest)를 이용해 다음 Filter로 넘어가기 전처리 작업을 수행한다.
 
        // (2-2)
        chain.doFilter(request, response);
 
        // (2-3) 이곳에서 response(ServletResponse)를 이용해 response에 대한 후처리 작업을 할 수 있다.
     }
     
     // (3)
     public void destroy() {
        // (5) Filter가 사용한 자원을 반납하는 처리
     }
  }
cs

 -위의 코드는 Servlet Filter 인터페이스를 구현한 구현 클래스의 기본 구조임

  • (1)의 init() 메서드에서는 생성한 Filter에 대한 초기화 작업을 진행할 수 있음
  • (2)의 doFilter() 메서드에서는 해당 Filter가 처리하는 실질적인 로직을 구현할 수 있음 
  • (3)의 destroy() 메서드는 Filter가 사용한 자원을 반납하는 처리 등의 로직을 작성할 때 사용되며, 해당 Filter가 컨테이너에서 종료될 때 호출됨

 

1-2.FilterConfiguration

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import book.study.security.FirstFilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
 
@Configuration
public class FilterConfiguration {
 
    @Bean
    public FilterRegistrationBean<FirstFilter> firstFilterRegister()  {
        FilterRegistrationBean<FirstFilter> registrationBean = new FilterRegistrationBean<>(new FirstFilter());
        return registrationBean;
    }
}
cs

 -Spring Boot에서 Servlet Filter는 위의 코드 처럼 FilterRegistrationBean의 생성자로 Filter 인터페이스의 구현 객체를 넘겨주는 형태로 등록할 수 있음

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import book.study.security.FirstFilter;
import book.study.security.SecondFilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
 
@Configuration
public class Config {
 
    @Bean
    public FilterRegistrationBean<FirstFilter> firstFilterRegister()  {
        FilterRegistrationBean<FirstFilter> registrationBean = new FilterRegistrationBean<>(new FirstFilter());
        registrationBean.setOrder(1); // (1)
        return registrationBean;
    }
 
    @Bean
    public FilterRegistrationBean<SecondFilter> secondFilterRegister()  {
        FilterRegistrationBean<SecondFilter> registrationBean = new FilterRegistrationBean<>(new SecondFilter());
        registrationBean.setOrder(2); // (2)
        return registrationBean;
    }
}
cs

 -Filter가 여러 개라면 위의 코드처럼 Filter가 지정된 순서대로 실행되도록 registrationBean.setOrder() 메서드로 순서를 지정할 수 있음

 -registrationBean.setOrder() 메서드는 파라미터로 지정한 숫자가 작은 숫자일 수록 먼저 실행되는 특징이 있음

 

 

 

 

 

-코드 및 내용 출처 : code states

'부트캠프' 카테고리의 다른 글

Spring Security - 기본 part 2  (0) 2023.03.21
Spring Security - DelegatingPasswordEncoder  (1) 2023.03.21
Spring Security - 기본 part 1  (1) 2023.03.16
인증/보안 - 기초  (1) 2023.03.15
Spring MVC - API 문서화  (0) 2023.03.12