1.Filter 와 FilterChain |
-앞서 기본 part 1에서 언급했듯이, 서블릿 필터(Servlet Filter)는 서블릿 기반 애플리케이션의 엔드포인트에 요청이 도달하기 전에 중간에서 요청을 가로챈 후 어떤 처리를 할 수 있도록 해주는 Java의 컴포넌트임
-위의 그림처럼 클라이언트가 서버 측 애플리케이션으로 요청을 전송하면 제일 먼저 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 |