카테고리 없음

#22 Filter

kmsoon 2024. 5. 30. 16:40

자바 스프링에서 필터(Filter)는 웹 애플리케이션에서 HTTP 요청과 응답을 가로채고, 특정 로직을 수행하거나 요청/응답을 수정하는데 사용된다. 스프링 필터는 일반적으로 다음과 같은 작업을 수행할 때 사용된다:

  1. 인증 및 권한 부여: 요청이 특정 리소스에 접근할 권한이 있는지 확인한다.
  2. 로깅 및 감사: 요청과 응답을 로깅하거나 감사 목적으로 기록한다.
  3. 데이터 압축: 응답 데이터를 압축하여 클라이언트로 전송한다.
  4. 데이터 변환: 요청 데이터 또는 응답 데이터를 변환한다.

스프링 필터는 자바 서블릿 필터를 기반으로 하며, javax.servlet.Filter 인터페이스를 구현해야 한다. 

 

 

 

 

1. Filter 인터페이스 구현

먼저, javax.servlet.Filter 인터페이스를 구현하는 필터 클래스를 작성한다. 이 인터페이스에는 세 가지 메서드가 있다:

  • init(FilterConfig filterConfig): 필터 초기화 시 호출된다.
  • doFilter(ServletRequest request, ServletResponse response, FilterChain chain): 요청을 필터링할 때 호출된다.
  • destroy(): 필터가 제거될 때 호출된다.
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 java.io.IOException;

public class MyFilter 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 " + System.currentTimeMillis());

        // 다음 필터 또는 서블릿으로 요청 전달
        chain.doFilter(request, response);

        // 응답 처리 후 로직
        System.out.println("Response sent at " + System.currentTimeMillis());
    }

    @Override
    public void destroy() {
        // 필터 제거 시 로직 (필요시)
    }
}

 

 

 

2. 필터 등록

스프링 부트에서는 @Component 어노테이션을 사용하여 필터를 등록하거나, FilterRegistrationBean을 사용하여 수동으로 등록할 수 있다.

 

 

@Component를 사용한 필터 등록

필터 클래스에 @Component 어노테이션을 추가하여 스프링 컨텍스트에 자동으로 등록되도록 한다.

 

import org.springframework.stereotype.Component;

@Component
public class MyFilter implements Filter {
    // 필터 구현 내용
}

 

 

FilterRegistrationBean을 사용한 필터 등록

FilterRegistrationBean을 사용하여 필터를 수동으로 등록하고 설정을 추가할 수 있다.

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<MyFilter> loggingFilter() {
        FilterRegistrationBean<MyFilter> registrationBean = new FilterRegistrationBean<>();
        
        registrationBean.setFilter(new MyFilter());
        registrationBean.addUrlPatterns("/api/*"); // 특정 URL 패턴에만 필터 적용
        registrationBean.setOrder(1); // 필터 체인에서 필터의 순서 지정
        
        return registrationBean;
    }
}

 

 

 

3. 필터 체인 관리

필터 체인에서 필터의 순서를 관리하는 것이 중요하다. FilterRegistrationBean의 setOrder 메서드를 사용하여 필터의 실행 순서를 지정할 수 있다. 순서가 낮을수록 먼저 실행된다.

 

 

 

4. 추가 기능

필터는 종종 다른 스프링 기능과 함께 사용된다. 예를 들어, Spring Security와 통합하여 인증 및 권한 부여 작업을 수행하거나, CORS(Cross-Origin Resource Sharing)를 처리할 수 있다.

 

 

 

Spring Security와 통합

Spring Security는 자체적으로 필터 체인을 관리한다. 따라서 Spring Security를 사용할 경우, SecurityConfigurerAdapter를 확장하여 필터를 추가할 수 있다.

import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.addFilterBefore(new MyFilter(), UsernamePasswordAuthenticationFilter.class);
        // 다른 보안 설정
    }
}

 

스프링 필터는 HTTP 요청과 응답을 가로채고, 처리하는 데 강력한 도구이다. 필터를 구현하고 스프링 부트 애플리케이션에 등록하여 다양한 웹 애플리케이션 요구사항을 충족시킬 수 있다. 필터 체인의 순서를 관리하고, 필요에 따라 Spring Security와 같은 다른 스프링 모듈과 통합하여 더욱 복잡한 작업을 수행할 수 있다.