spring filterChain 동작과정

2023. 11. 15. 09:45스프링

스프링 시큐리티를 사용하게 된다면
필터체인의 경우 was가 제공하는 ApplicationFilterChain과 스프링에서 제공하는 SecurityFilterChain으로 나뉜다.

둘은 다른 라이프사이클을 가지고 있는데 서로의 요청 url이 다르게 해도 개발자의 의도에 맞게 적용이 되지 않을 수가 있다.

 

처음 애플리케이션을 실행하게 되면 ApplicationFilterChain이 실행이 되고 DelegatingFilterProxy를 통해 SecurityFilterChain 필터를 타게 된다.

다시 설명하자면 기존 FilterChain을 타다가 DelegatingFilterProxy에서 SecurityFilterChain  전달되면 내부 필터들이 작동하게 된다. 

 

결국 시큐리티에서 Filter에 대한 제외할 url 등을 등록을 해도 기존에 filterChain에는 되지 않기 때문에 제외되지 않고 통과하게 된다.

 

스프링에서 Filter를 등록할 때 이렇게 @Component로 등록을 하거나 

@Component
public class RequestBodyCopyFilter extends OncePerRequestFilter {
    @Override
    protected void doFilterInternal(HttpServletRequest req, HttpServletResponse res, FilterChain chain) throws ServletException, IOException {
        if (req instanceof HttpServletRequest) {
            String contentType = req.getContentType();
            if (contentType == null || !contentType.contains("multipart/form-data")) {
                req = new CachedBodyHttpServletRequest((HttpServletRequest) req);
                chain.doFilter(req, res);
            }
        }
    }
}

 

이렇게 @Configuration이 붙은 클래스에 빈으로 등록해주는 방법이 있는데 이렇게 되면

was에 ApplicationFilterChain에 등록되게 된다.

@Bean
public FilterRegistrationBean<RequestBodyCopyFilter> requestBodyCopyFilterFilterRegistrationBean() {
    FilterRegistrationBean<RequestBodyCopyFilter> registrationBean = new FilterRegistrationBean<>();
    registrationBean.setFilter(new RequestBodyCopyFilter());
    registrationBean.setOrder(1);
    return registrationBean;
}

 

 

 

내가 원하는 시점은 security에 usernamePasswordAuthenticationFilter 전에 호출되길 원하는데 제어할 수가 없다.

 

SecurityFilterChain에 filter를 등록하길 원한다면 security 설정 클래스에

.addFilterBefore(new RequestBodyCopyFilter(), UsernamePasswordAuthenticationFilter.class);

 

이렇게 등록해줌으로써 usernamePasswordAuthenticationFilter 전에 호출 할 수 있게 할 수 있다. FilterChainProxy를 디버깅해본 결과 

 

5번 순서에 내가 커스텀한 필터가 잘 들어가 있는 모습을 볼 수 있다.

 

'스프링' 카테고리의 다른 글

Telegram bot longPolling과 webhook  (0) 2024.02.27
스프링부트 개발 가이드  (1) 2023.11.08
springboot redis 연동  (0) 2023.10.11
네이버 클라우드 sens 알림톡 발송  (0) 2023.09.26
yml 파일 암호화  (1) 2023.08.29