HTTP 요청과 응답을 변경할 수 있는 재사용 가능한 코드이며, 서블릿 2.3 규약에 새롭게 추가되었다. 필터는 객체의 형태로 존재하며 클라이언트로부터 오는 요청(request)과 최종자원(서블릿/JSP/기타 문서) 사이에 위치하며 클라이언트의 요청 정보를 알맞게 변경할 수 있으며, 또한 필터는 최종 자원과 클라이언트로 가는 응답(response) 사이에 위치하여 최종 자원의 요청 결과를 알맞게 변경할 수 있다.

이러한 필터는 인코딩, CORS, XSS, LOG, 인증, 권한 등 을 구현하는데 사용합니다.
스프링 시큐리티, 네이버의 lucy-xss-servelt-fiter 등이 대표적이 예입니다.
필터는 여러개 를 등록하고 요청이 해당 필터를 순서대로 통과하도록 할수 있습니다. 이런 필터들을 필터 체인이라고 부르죠.

스프링부트에서 필터를 등록하는 방법
우선 Filter인터페이스를 상속 받아서 구현
public class FirstFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
...
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
...
}
@Override
public void destroy() {
...
}
}
- init()
- 필터가 생설될 때 수행되는 메서드
- 웹 컨테이너(톰캣)이 시작될 때 필터 최초 한 번 인스턴스 생성
- doFilter()
- 클라이언트의 Request, Response가 필터를 거칠때 수행되는 메서드
- FilterChain을 통해 전달
- public void destroy()
- 필터 인스턴스가 제거될 때 실행되는 메서드, 종료하는 기능
필터를 등록하는 방법(web.xml 등 xml 기반 등록은 제외)
1. FilterRegistrationBean으로 필터 등록
- 필터들 사이의 순서를 지정가능
- 각종 설정을 쉽게 설정가능
- 필터들의 설정을 하나의 configuration에 몰아서 관리할 수 있음
2. @WebFilter 애너테이션 필터 등록
- @WebFilter 어노테이션은 필터들 사이의 순서를 지정할 수 있는 속성은 제공하지않음
- @WebFilter 어노테이션을 적고 스캔하면 따로 관리하지않아도 스프링 ioc가 알아서 적용
- 어노테이션에 맵핑 URL을 입력하는 방법
1. 어노테이션에 맵핑 URL을 입력하는 방법
@WebFilter("/target")
2. 어노테이션에 와일드카드를 사용하여 입력하는 방법
@WebFilter("/*")
3. 어노테이션의 value 속성을 이용하는 방법
@WebFilter(value="/target")
@WebFilter(value= {"/target", "/target2"})//여러개 등록시
4. 어노테이션의 urlPatterns 속성을 이용하는 방법
@WebFilter(urlPatterns="/target")
@WebFilter(urlPatterns= {"/target", "/target2"}) //여러개 등록시
5. 서블릿 등록시 사용한 서블릿 이름을 기준으로 지정하는 방법
@WebFilter(servletNames="boardController")
@WebFilter(servletNames= {"boardController", "boardController2"}) //여러개 등록시
3. @Component, @Order(n)
Filter를 상속받은 class를 component로 등록하고 @Order로 순서를 설정하는 방식으로
간단하게 설정과 필터 적용이 가능하지만 다양한 설정이 어려움
실습
1. FilterRegistrationBean을 이용한 필터 등록 실습
1) CustomFilter를 하나 만들기
(import 까지 보여드리는 이유는 implement할때 Filter 가 여러개 떠서 헷갈리실거 같아서 입니다.)

2) 필터 등록

서버를 실행하면 실행 단계에서 init을 볼수 있고

주소로 접속시 필터를 타는 것을 확인할 수 있습니다.

2. @WebFilter 애너테이션 필터 등록
1) Custom2Filter 를 하나 만들기
필터를 하나 만들고 @WebFilter애너테이션을 적용하겠습니다.
빨간색부분과 log의 Custom2Filter 빼고는 이전 CustomFilter와 다를게 없습니다.

2) @ServletComponetScan 적용
configuration에 @ServletComponetScan 을 적용합니다.

서버를 실행하면 실행 단계에서 init과

요청했을때 필터 log를 확인할 수 있습니다.

3. @Component, @Order(n)
springboot의 기본 scan범위 안에 있다면 자동으로 등록되서 필터가 적용 된다.
order 어노테이션으로 필터 적용 순서를 정할수 있다.



3가지 모두를 적용한 경우의 순서

Reference
'Spring' 카테고리의 다른 글
springboot에서 redis 다루기 (0) | 2021.05.23 |
---|---|
Spring Interceptor (0) | 2021.04.12 |
Spring AOP (0) | 2021.04.09 |
Spring Filter, Interceptor, AOP 비교 (0) | 2021.04.09 |
Spring 요청의 흐름(Spring MVC 패턴) (0) | 2021.04.09 |