필터, 인터셉터, AOP를 사용하는 가장 큰 이유는 중복된 코드를 줄여 관리가 용이하게 하기 위함이다.
코드의 중복을 줄이고 관심사를 분리하여 개발자는 비지니스 로직에 집중할 수 있다.
(공통 영역과 비지니스 영역 분리)
필터(Filter)는 Dispatcher Servlet에 요청이 전달되기 전/후에 url 패턴에 맞는 모든 요청에 대해 부가작업을 처리할 수 있는 기능을 제공한다.
스프링 컨테이너가 아닌 톰캣과 같은 웹 컨테이너에 의해 관리가 되는 것이고 디스패처 서블릿 전/후에 처리하는 것이다.
(스프링 빈으로 등록은 된다)
Spring Security 개념 및 Architecture
FilterChain은 서블릿 컨테이너가 관리하는 필터들의 연결고리로, 클라이언트의 요청이 서블릿에 도달하기 전에 여러 필터를 순차적으로 거치게 하는 메커니즘이다.
Spring Boot에서는 FilterRegistrationBean을 사용하여 필터를 등록하고, 필터의 순서를 정의할 수 있다.
FilterRegistrationBean을 사용하면 필터의 순서를 setOrder 메서드를 통해서 명시적으로 지정할 수 있다.
필터를 추가하기 위해서는 javax.servlet의 Filter 인터페이스를 구현해야 하며 이는 다음의 3가지 메서드를 가지고 있다.
public interface Filter {
public default void init(FilterConfig filterConfig) throws ServletException {}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException;
public default void destroy() {}
}
@Slf4j
public class FirstFilter implements Filter{
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
log.info("==========First Filter START==========");
filterChain.doFilter(servletRequest, servletResponse);
log.info("==========First Filter END==========");
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
log.info("FirstFilter init");
}
@Override
public void destroy() {
log.info("FirstFilter destroy");
}
}
@Slf4j
public class SecondFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
log.info("==========Second Filter START==========");
filterChain.doFilter(servletRequest, servletResponse);
log.info("==========Second Filter END==========");
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
log.info("SecondFilter init");
}
@Override
public void destroy() {
log.info("SecondFilter destroy");
}
}
@Configuration
public class FilterConfiguration {
@Bean
public FilterRegistrationBean<FirstFilter> firstFilterRegister() {
FilterRegistrationBean<FirstFilter> registrationBean = new FilterRegistrationBean<>(new FirstFilter());
registrationBean.setOrder(1);
return registrationBean;
}
@Bean
public FilterRegistrationBean<SecondFilter> secondFilterRegister() {
FilterRegistrationBean<SecondFilter> registrationBean = new FilterRegistrationBean<>(new SecondFilter());
registrationBean.setOrder(2);
return registrationBean;
}
}
setOrder로 Filter 순서를 지정한다.
(1) Init
(2) Client Request시
필터 체이닝에 의해 순차적으로 실행되고 요청이 끝난 후 역순으로 종료되는 것을 확인할 수 있다.
(3) 서버 종료 시
Spring Security - FilterSecurityInterceptor 이해 및 Example (2) | 2024.11.11 |
---|---|
Spring Security + JWT 인증 (2/2) - Spring Security 설정 (29) | 2024.08.21 |
Spring Security + JWT 인증 (1/2) - JWT 구현 (25) | 2024.08.20 |
Spring Security 개념 및 Architecture (28) | 2024.08.19 |
[Spring] JWT(Json Web Token) 정리 (35) | 2024.08.15 |
댓글 영역