[SpringSecurity] 커스텀 필터

유알·2022년 12월 25일
1

[SpringSecurity]

목록 보기
5/15

필터를 만드는 법

import jakarta.servlet.Filter;

import java.io.IOException;

public class MyFilter1 implements Filter {

    @Override
    public void doFilter(jakarta.servlet.ServletRequest request, jakarta.servlet.ServletResponse response, jakarta.servlet.FilterChain chain) throws IOException, jakarta.servlet.ServletException {
        System.out.println("필터1");
        chain.doFilter(request,response);
    }
}

doFilter의 역할은 처리결과를 다음으로 넘겨주는 역할을 하니 꼭 구현하자
다음 필터가 있다면 다음 필터로, 없다면 서블릿으로 넘겨주게 된다.

SecurityFilterChain


이미지 출처 : http://atin.tistory.com/590
간단한 설명 : https://siyoon210.tistory.com/32
자세한 내용은 Spring Security Doc을 보면 각 필터마다 설명이 나와있다.
https://docs.spring.io/spring-security/reference/servlet/index.html

그런데 내가 공식문서를 읽다보니까 Security Filters의 Ordering에 대해 설명한 부분이 있는데, 위의 그림에는 빠진 부분이 많은 것같아서, 링크를 첨부한다.
내가 확실히 이해한게 맞다면 아래의 링크를 참조하는것이 훨씬 정확하다.
https://docs.spring.io/spring-security/reference/servlet/architecture.html#servlet-security-filters

필터를 등록하는 두가지 방법

SecurityConfig에 등록

@Configuration
@EnableWebSecurity
@RequiredArgsConstructor
public class SecurityConfig{

    private final CorsFilter corsFilter;

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception{
        http.addFilterBefore(new MyFilter1(), BasicAuthenticationFilter.class);
        //http.addFilterAfter(new MyFilter1(), BasicAuthenticationFilter.class);
        // ...
        return http.build();
    }
}

위의 SecurityFilterChain의 순서를 참고하여 전(http.addFilterBefore)이나 후(http.addFilterAfter)를 통해 필터를 등록할 수 있다.

FilterConfig에 등록

@Configuration
public class FilterConfig {
    @Bean
    public FilterRegistrationBean<MyFilter1> filter1(){
        FilterRegistrationBean<MyFilter1> bean = new FilterRegistrationBean<>(new MyFilter1());
        bean.addUrlPatterns("/*");
        bean.setOrder(0); // 우선순위를 결정한다. 낮을수록 빨리 실행됨
        return bean;
    }
}

이런식으로 @Bean에 등록을 하여 사용할 수 있다.
보면 setOrder로 우선순위를 지정할 수 있다.
0 -> 1 -> 2 -> 3 -> ... 이런식으로 실행된다.

어떤 필터가 먼저 실행될까?

FilterConfig에 넣은 필터보다 SecurityConfig에 넣은 필터가 먼저 실행되게 된다.
즉 SecurityConfig에 있는 필터가 다 실행되고 나서 FilterConfig에 있는 필터가 설정한 order 대로 실행된다. 따라서 가장 먼저 실행되고 싶으면, 위의 FilterChain 순서표를 참고하여 addFilterBefore메서드를 통해 가장 먼저 실행되게 하면 된다.

profile
더 좋은 구조를 고민하는 개발자 입니다

0개의 댓글