Filter란?
필터(Filter)는 스프링의 기능이 아닌 자바 서블릿진영에서 제공하는 기능이다.
- HTTp요청과 응답을 가로챈다.
- 자바진영에서 제공하는 필터이므로 스프링의 DispatcherServlet보다 먼저 실행이 된다.
- AOP보다 Request와 response 객체에 쉽게 접근이 가능하다.
- FilterRegistrationBean을 통해 특정 URL에만 적용하거나 실행 순서를 제어할 수 있다.
위 그림에서 스프링 영역의 Dispatcher Servlet에 들어가기전에 Filter가 실행이 되는 것을 확인 할 수 있다.
필터(Filter)는 필터 체인을 통해 연쇄적으로 동작하게도 가능하다.
Filter는 어디에 쓰일까?
- XSS(Cross Site Scripting) 방지(사용자로부터 들어오는 입력 데이터를 검증하고 필터링하여,
스크립트 삽입과 같은 악성 공격을 사전에 차단한다. - Logging(모든 HTTP 요청에 대한 정보를 기록하여 모니터링, 디버깅, 감사 추적 등에 사용가능하다.)
- Encoding(들어온 요청 및 응답의 문자 인코딩을 설정하여 한글깨짐과 같은 문자 인코딩 방지해줌
- IP 검사(특정 IP주소로 들어오는 요청을 허용 또는 차단하여 비정상적 접근을 제어)
자 우리는 AOP | Filter | Interceptor까지 모두 살펴보았다.
그럼 위 3개를 한번 비교를 해보면서 복습을 해보겠다.
- AOP()
- 특정 기능을 작성한 후 여러 부분에 쉽게 적용하는 기술
- Advice(특정 기능), Pointcut(여러 부분), Aspect(Advice + Pointcut)
- Pointcut으로 메서드를 지정한다.
- 스프링의 제어 범위 내에서 모든 메서드를 제어가능하다.
- @Aspect || @Component 어노테이션을 적용한 1개 이상의 클래스만 있으면 적용이 가능하다.
- Filter()
- 자바 서블릿 기반의 기술로 HTTP 요청과 응답을 가로챈다.(필터처럼 걸러준다.)
- 스프링의 DispatcherServlet보다 먼저 실행 된다.
- AOP보다 Request와 Response객체에 쉽게 접근이 가능하다.
- FilterRegistrationBean을 통해 특정 URL에만 적용하거나 실행 순서를 제어할 수 있다.
- Interceptor()
- 스프링 서브릿 바로 다음에 실행되는 기술로 Controller에 들어오는 요청과 응답을 제어할 수 있다.
- Filter와 달리 스프링의 DispatcherServlet으로 진입 후 동작된다.
- Request와 Response 객체를 기본 제공하므로 웹과 관련된 기능을 쉽게 작성가능하다.
- Filter와 달리 적용할 URL과 제외할 URL을 따로 지정할 수 있다.
말로만 해서는 잘 이해가 안될 수도 있으니 실습을 통해서 다시 한번 이해를 해보겠다.
FIlter로 IP확인하기
IPCheckFilter.java
package com.example.basic.filter;
import java.io.IOException;
import jakarta.servlet.Filter;
import jakarta.servlet.FilterChain;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletRequest;
import jakarta.servlet.ServletResponse;
import jakarta.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class IPCheckFilter
implements Filter {
@Override
public void doFilter(
ServletRequest request, ServletResponse response,
FilterChain chain)
throws IOException, ServletException
{
HttpServletRequest req = (HttpServletRequest) request;
String ip = req.getRemoteAddr();
log.info(ip);
chain.doFilter(request,response);
}
}
지금 doFilter의 메서드는 Filter인터페이스를 상속받아서 doFilter메서드를 구현해줘야한다.
필터의 인터페이스에 들어가보면 다음과 같이 나와있는 것을 볼 수 있다.
현재 request에 HttpServletRequest로 명시적 TypeCasting을 해서 HttpServletRequest로 형 변환을 해줬다.
그럼 req객체는 HTTP요청에 특화된 정보와 기능을 다루는데 사용이 된다.
Filter는 FilterRegistrationBean을 통해서 특정 URL에만 적용하거나 실행순서를 제어한다고 나와있다.
그럼 FilterRegistrationBean을 빈으로 등록해줘야된다.
FilterConfig.java
우리는 Configuration으로 해당 FilterConfig클래스가 Bean을 등록하는 클래스라고 스프링에게 알려주고
getFilterRegistrationBean()메서드가 반환하는 bean객체를 빈으로 등록해준다.
VisitorController.java
그럼 visitorController에 visitor경로로 들어가보자
해당경로로 로그가 뜨는 것을 볼 수 있다.
'Spring' 카테고리의 다른 글
스프링부트 - JWT(Json Web Token)이란? (0) | 2025.05.11 |
---|---|
스프링부트 - 파일 업로드 (0) | 2025.05.10 |
[스프링부트] - 인터셉터(interceptor) (1) | 2025.05.09 |
[스프링부트] - Controller Advice (1) | 2025.05.07 |
[스프링부트] - AOP에 대해서 알아보자 (0) | 2025.05.07 |