Java Servlet Filter 서블릿 필터란? Spring Security와 호출 순서

min·2023년 12월 20일
0

참고
https://taetaetae.github.io/2020/04/06/spring-boot-filter/

회사에서 필터 관련 테스트 하는데 제대로 일부 응답에서 오류가 나는 부분이 있어서 확실히하기 위해서 개념 정리해본다.

Filter

호출 순서

HTTP 요청 > WAS (웹 서버) > Filter > Servlet > Controller

구현

Filter 인터페이스를 구현한다.

public class HttpFilter implements Filter {

  @Override
  public void init(FilterConfig filterConfig) throws ServletException {
    // 초기화 코드
  }

  @Override
  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
      throws IOException, ServletException {
	// 필터 로직 구현
    // HTTP 요청이 오면 doFilter가 호출 됨
      }
  }

  @Override
  public void destroy() {
    // 필터 종료 시 처리 코드
  }
}

특정 URL 패턴에만 Filter 적용하고 싶다면 @WebFilter(urlpatterns="") 사용 > 대신 @WebFilter를 사용하고 싶다면 @ServletComponentScan을 메인 어플리케이션에 붙여 줘야함.
@WebFilter@Component 동시에 붙어 있다면 @ServletComponenetScan, @ComponentScan이 둘 다 적용 될 수 있기 때문에 하나만 적용해야 함.

@ServletComponentScan @WebFilter(filterName = "httpFilter", urlPatterns = "/*")로
필터 등록 가능 하지만 필터 순서 조절 안됨. FilterRegistrationBean 사용 권장 > 이 때는 @Configuration 어노테이션을 사용하는 클래스를 만들어서 URL 패턴, Order 지정해줌.

모든 URL에 필터를 적용 할 것이라면 @ComponentSacn+@Component 조합으로 사용.
아니라면 @WebFilterFilterRegistrationBean 이용해서 사용

application.yaml에

spring.security.filter.order={숫자}

사용하면 Filter 순서 조정 할 수 있음.

기본적으로는 Spring security가 먼저 호출 되고 그 이후에 필터 관련해서 호출이 된다.

https://docs.spring.io/spring-security/reference/servlet/architecture.html#servlet-security-filters

FilterChain

Filter가 여러개 모여서 하나의 체인을 형성 하는 것

public class HttpFilter implements Filter {

  @Override
  public void init(FilterConfig filterConfig) throws ServletException {
    // 초기화 코드
  }

  @Override
  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
      throws IOException, ServletException {
	// 다음 필터 체인으로 제어권을 넘기는 것
    filterChain.doFilter(request, capturingResponseWrapper);
      }
  }

  @Override
  public void destroy() {
    // 필터 종료 시 처리 코드
  }
}
profile
기록으로 기억하기

0개의 댓글