Spring Servlet Filter

Spring Servlet Filter는 Java Servlet API의 일부로, HTTP 요청과 응답을 처리하는 데 사용되는 인터셉터(interceptor)입니다. Filter는 요청이 특정 서블릿이나 리소스에 도달하기 전에 요청을 가로채고 수정하거나, 응답이 클라이언트에게 전송되기 전에 응답을 수정할 수 있습니다. Spring에서는 이러한 필터를 활용하여 다양한 공통 작업을 수행할 수 있습니다. 예를 들어, 인증, 로깅, 압축, 인코딩 등을 처리할 수 있습니다.

Spring Servlet Filter의 개념 및 역할

  1. 요청/응답 가로채기:

    • 필터는 클라이언트로부터 서버로 들어오는 HTTP 요청을 가로채어 요청을 처리하거나 수정할 수 있습니다.

    • 서버에서 클라이언트로 나가는 HTTP 응답을 가로채어 응답을 처리하거나 수정할 수 있습니다.

  2. 공통 작업 수행:

    • 인증 및 권한 부여: 사용자가 요청하는 리소스에 접근할 권한이 있는지 확인합니다.

    • 로깅 및 감사: 요청 및 응답에 대한 로깅을 수행하여 누가, 언제, 어떤 리소스에 접근했는지 기록합니다.

    • 데이터 압축: 응답 데이터를 압축하여 네트워크 대역폭을 절약합니다.

    • 인코딩 설정: 요청 및 응답의 문자 인코딩을 설정합니다.

Spring에서 Filter 설정하기

Spring Boot에서는 @Component 애너테이션을 사용하여 간단하게 필터를 등록할 수 있습니다. 또한, FilterRegistrationBean을 사용하여 필터를 프로그래밍 방식으로 등록할 수도 있습니다.

1. @Component를 사용한 필터 등록

java코드 복사import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import org.springframework.stereotype.Component;

import java.io.IOException;

@Component
public class CustomFilter implements Filter {
    
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // 필터 초기화 작업
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        // 요청 전 처리 작업
        System.out.println("Request received at " + request.getRemoteAddr());
        
        // 다음 필터로 요청 전달
        chain.doFilter(request, response);
        
        // 응답 후 처리 작업
        System.out.println("Response sent to " + response.getContentType());
    }

    @Override
    public void destroy() {
        // 필터 종료 작업
    }
}

2. FilterRegistrationBean을 사용한 필터 등록

java코드 복사import javax.servlet.Filter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class FilterConfig {
    
    @Bean
    public FilterRegistrationBean<CustomFilter> loggingFilter() {
        FilterRegistrationBean<CustomFilter> registrationBean = new FilterRegistrationBean<>();
        
        registrationBean.setFilter(new CustomFilter());
        registrationBean.addUrlPatterns("/api/*"); // 필터가 적용될 URL 패턴 설정
        
        return registrationBean;
    }
}

필터 체인(Filter Chain)

필터 체인은 여러 개의 필터를 순차적으로 실행하는 구조를 의미합니다. 각 필터는 FilterChain 객체를 통해 다음 필터로 요청을 전달할 수 있습니다. 필터는 설정된 순서에 따라 실행되며, 필터 체인 내의 순서는 애플리케이션의 설정에 따라 달라집니다.

필터와 인터셉터의 차이점

  • 필터: 서블릿 스펙에 정의된 것으로, 디스패처 서블릿(DispatcherServlet) 이전에 실행됩니다. 주로 HTTP 요청 및 응답의 전처리와 후처리를 담당합니다.

  • 인터셉터: Spring MVC의 기능으로, 디스패처 서블릿 이후에 실행됩니다. 주로 컨트롤러 메서드 호출 전후에 특정 작업을 수행합니다.

결론

Spring Servlet Filter는 요청과 응답을 가로채어 다양한 공통 작업을 수행할 수 있는 강력한 도구입니다. 이를 통해 인증, 로깅, 데이터 압축 등의 작업을 손쉽게 처리할 수 있으며, 필터 체인을 통해 여러 필터를 순차적으로 적용할 수 있습니다. 필터와 인터셉터를 적절히 활용하면 애플리케이션의 요청 처리 로직을 깔끔하고 모듈화된 방식으로 구성할 수 있습니다.

Last updated