1. 필터(Filter)란?
필터(Filter)는 J2EE 표준 스펙 기능으로 Dispatcher Servlet에 요청되기 전/후에 부가 작업을 처리할 수 있는 기능을 제공합니다.
스프링 컨테이너가 아닌 웹 컨테이너(ex 톰캣)에 의해 관리가 되고, 특정 URL 패턴에 매핑되어 해당 요청이 들어올 때마다 실행됩니다.
(스프링 빈으로도 등록이 가능하다.)
필터(Filter) 사용 사례
- 인증 및 인가 : 사용자의 인증 상태를 확인하고, 권한이 없는 사용자의 요청을 차단하거나 다른 페이지로 리다이렉션 한다.
- 로깅 및 감사 : 모든 요청 및 응답에 대한 로깅을 수행하거나 보안 검사를 통해 올바르지 않은 요청을 차단한다.
- 데이터 압축 : 데이터 압축, 문자열 인코딩
위의 경우 말고도 스프링과 무관하게 전역적으로 처리해야하는 작업들을 처리할 수 있고, 다음 체인으로 넘기는 ServletRequest/ ServletResponse 객체를 조작할 수 있습니다.
필터(Filter) 메소드
필터를 추가하기 위해서는 javax.servlet의 Filter 인터페이스를 구현해야하며 3가지의 메소드를 가지고 있습니다.
public interface Filter {
default void init(FilterConfig filterConfig) throws ServletException {}
void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException;
default void destroy() {}
}
필터 인터페이스를 구현하고 등록하면 서블릿 컨테이너가 필터를 싱글톤 객체로 생성하고 관리하게 됩니다.
- init() : 필터를 초기화 하는 메서드, 서블릿 컨테이너가 생성될 때 호출된다.
- doFilter() : 요청이 디스패처 서블릿으로 전달되기 전에, 웹 컨테이너에 의해 호출되는 메서드로 요청을 처리하거나, 체인의 다음 필터로 요청을 전달한다.
- destroy() : 필터 종료 메서드, 서블릿 컨테이너가 종료될 때 호출된다.
FilterChain? 필터는 여러 개의 필터가 순차적으로 연결된 체인 형태로 동작하는데 각 필터는 doFilter 메서드에서 FilterChain 객체의 doFilter 메서드를 호출해 다음 필터로 요청을 전달합니다.
2.인터셉터(Interceptor)
인터셉터(Interceptor)는 Filter가 서블릿이 제공하는 기술이였다면, 인터셉터(Interceptor)는 Spring이 제공하는 기술로 Dispatcher Servlet이 컨트롤러를 호출하기 전/후로 요청, 응답을 가로채 특정 작업을 수행하는 기능을 제공합니다.
인터셉터가 존재한다면 순차적으로 인터셉터들이 실행된 후 컨트롤러가 실행되고, 존재하지 않다면 바로 컨트롤러가 실행되게 됩니다.
인터셉터(Interceptor) 메소드
스프링의 인터셉터를 사용하기 위해서는 HandlerInterceptor 인터페이스를 구현해야 하며 다음과 같은 메소드를 가지고 있습니다.
public interface HandlerInterceptor {
default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
return true;
}
default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
@Nullable ModelAndView modelAndView) throws Exception {
}
default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
@Nullable Exception ex) throws Exception {
}
}
- preHandle : 컨트롤러 호출 전에 실행(핸들러 어댑터 호출 전 실행) 응답값이 true면 다음으로 진행하고 false라면 나머지 인터셉터, 핸들러 어댑터를 호출하지 않는다.
- postHandle : 컨트롤러 호출 후에 실행된다.
- afterCompletion : 뷰가 렌더링 된 이후에 실행된다.
인터셉터 사용사례
- 세부적인 보안 및 인증 / 인가 작업
- 로깅 및 감사
- Controller로 넘겨주는 데이터 가공
인증과 / 인가 같은 클라이언트의 요청과 관련된 작업에서 특정 사용자는 이용하지 못하는 경우가 있는데 이 때 컨트롤러로 넘어가기 전에 인터셉터가 처리하거나, HttPServletRequest, HttpServletResponse 내부의 값을 조작해 컨트롤러로 넘겨주기 위한 데이터를 가공할 때 사용됩니다.
총정리
필터(Filter) | 인터셉터(Interceptor) | |
관리되는 곳 | 서블릿 컨테이너 | 스프링 컨테이너 |
스프링 예외처리 여부 | x | ㅇ |
Request/Response 객체 조작 가능 여부 | ㅇ | x |
용도 | 공통 보안 및 인증 / 인가 모든 요청에 대한 로깅 이미지/ 데이터 압축, 문자열 인코딩 Spring과 분리되는 기능 |
세부적인 인증 / 인가 작업 API 호출에 대한 로깅, 감사 Controller로 넘겨주는 데이터 가공 |
참고
'Backend > spring' 카테고리의 다른 글
[Spring] OpenFeign란? (1) | 2024.09.11 |
---|---|
[Spring]스프링 이벤트를 이용한 도메인 의존성 분리 및 고려할 점 (2) | 2024.09.09 |
[Spring] Dispatcher Servlet이란?? (1) | 2024.06.08 |
[Spring] 의존성 주입의 3가지 방법 (0) | 2024.05.28 |
[Spring] Rest Docs으로 API 문서화하기 (1) | 2023.06.30 |