[SpringBoot] 스프링부트 MVC - Filter

Cover image

Spring Boot MVC - Filter

HTTP Method 취약점을 제거하는 업무를 하는 중에 기존 코드에서 일부분 수정을 해야하는 법을 알았다. 그중 필터에 대해 알게되었고 HTTP 헤더 정보를 설정, Encoding, XSS, CORS 이슈등을 해결할 수 있다는 점을 알았다.

이에 대해서 Filter에 대해 공부해야겠다는 생각이 들었다.


Filter란.

image

다음의 사진과 같습니다.

서블릿의 ServletContext 기능으로 사용자에 의해 서블릿이 호출 되기 전/후로 사용자 요청/응답의 헤더 정보 등을 검사 및 설정할 수 있습니다.


Filter와 Interceptor의 차이

  • Filter는 DispatcherServlet 앞에서 먼저 동작하고, Intercepter는 DispatcherServlet에서 Controller(Handler) 사이에서 동작합니다.
  • Filter

    • 웹 어플리케이션의 Context의 기능을 가지고 있다.
    • 스프링 기능을 활용하기에 어렵다.
    • 일반적으로 인코딩, CORS, XSS, LOG, 인증, 권한 등을 구현한다..
  • Interceptor

    • 스프링의 Spring Context의 기능이며 일종의 빈이다.
    • 스프링 컨테이너이므로 다른 Bean을 주입해서, 활용성을 높일 수 있다.
    • 다른 Bean을 활용 가능하기에 인증 및 권한 등을 구현할 수 있다.

Springboot에서 Filter를 설정.

스프링에서는 웹 어플리케이셔 컨텍스트를 설정할 수 있는 web.xml 파일을 통한 필터를 설정할 수 있다. 그러나 스프링부트는 다르다.

<filter>
     <filter-name>SomeFilter</filter-name>
    <filter-class>com.somecompany.SomeFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>SomeFilter</filter-name>
    <url-pattern>/url/*</url-pattern>
    <init-param>
       <param-name>paramName</param-name>
       <param-value>paramValue</param-value>
    </init-param>
</filter-mapping>

스프링 부트는 다음과 같이 설정할 수 있습니다.

@Bean
public FilterRegistrationBean testFilterRegistration() {

    FilterRegistrationBean registration = new FilterRegistrationBean();
    registration.setFilter(testFilter());
    registration.addUrlPatterns("/url/*");
    registration.addInitParameter("paramName", "paramValue");
    registration.setName("testFilter");
    registration.setOrder(1);
    return registration;
}

public Filter testFilter() {
    return new testFilter();
}

이처럼 스프링과 스프링 부트의 필터 설정은 다르게 설정됩니다.

좀 더 스프링 부트의 필터에 대해 알아보자면, 다음과 같습니다. 스프링 부트에서 필터를 사용하는 방법은 크게 두가지로 나눠집니다.

1. FilterRegistrationBean으로 필터 등록

org.springframework.boot.web.servletFilterRegistrationBeen을 사용하여, CORSFilter 클래스를 설정파일에서 빈으로 등록하는 방식입니다.

  • 예시코드는 다음과 같습니다.
@SpringBootApplication
public class TestApplication1 {

	public static void main(String[] args) {
		SpringApplication.run(TestApplication1.class, args);
	}

	@Bean
	public FilterRegistrationBean setFilterRegistration() {
		FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new MyFilter());

        // string 여러개를 가변인자로 받는 메소드
		filterRegistrationBean.addUrlPatterns("/filtered/*");
        return filterRegistrationBean;
	}
}

2. @WebFilter + @ServletComponentScan

스프링부트에서 지원하는 @WebFilter 애너테이션으로 자동 등록 후에 @ServletComponentScan을 사용하는 방식이다.

예시코드는 다음과 같습니다.

  • @ServletComonentScan 설정
@ServletComponentScan
@SpringBootApplication
public class TestApplication2 {
	public static void main(String[] args) {
		SpringApplication.run(TestApplication2.class, args);
	}
}
  • @WebFilter 설정
@Slf4j
@WebFilter(urlPatterns = "/filtered/*")
public class MyFilter implements Filter {
	// 1번과 내용이 같습니다.
}

다음과 같이 구성할 수 있습니다. 해당 코드와 같이 Springboot에 필터를 설정할 수 있습니다.


마무리.

업무 개발 코드를 추가할 수 없어서 간단하게 정리했습니다. 다음에 업무 상에 시간이 조금 있으면, HTTP Method를 제한하는 코드를 추가적으로 구성해서 올리겠습니다.


출처