[spring] 필터와 인터셉터의 차이는 무엇인가요?

orca·2023년 11월 22일
0

Spring

목록 보기
13/13
post-thumbnail

필터는 웹 서버의 일부이고, 인터셉터는 Spring MVC의 일부입니다. 필터는 요청이 디스패쳐 서블릿에 도착하기 전에 동작하고, 인터셉터는 디스패쳐 서블릿과 컨트롤러 사이에서 요청을 가로챕니다.

필터

  • 웹 서버의 일부
  • 필터는 request가 DispatcherServlet 에 도달하기 전에 가로챔
  • 사용 예시
    • 인증
    • 로깅 및 감사
    • Spring MVC와 분리하고자 하는 기능

필터 구현

Spring Security 는 대표적인 필터

인터셉터

  • Spring MVC의 일부
  • 인터셉터는 DispatcherServlet과 Controller 사이에 request 를 가로챔
  • 사용 예시
    • 애플리케이션 전역적인 cross cutting 기능
    • 인가
    • ModelAndView 를 조작할 때

인터셉터 구현

모든 request의 ip를 로깅하는 인터셉터를 구현해보자

1. 기본 설정

implementation 'org.springframework.boot:spring-boot-starter-web'
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {

}

2. 로깅 인터셉터 구현

public class LogInterceptor implements HandlerInterceptor {
    private Logger logger = LoggerFactory.getLogger(this.getClass());

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        logger.info("[preHandle][from " + getIP(request) + "]" + "[" + request.getMethod() + " " + request.getRequestURI() + "]");
        return true;
    }

    private String getIP(HttpServletRequest request) {
        String ipFromHeader = request.getHeader("X-FORWARDED-FOR");
        if (ipFromHeader != null && ipFromHeader.length() > 0) {
            return ipFromHeader;
        }
        return request.getRemoteAddr();
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        logger.info("[postHandle][" + response.getStatus() + "]");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        logger.info("[afterCompletion][" + response.getStatus() + "][exception: " + ex + "]");
    }
}
  • HandlerInterceptor : Spring MVC 내에 작용하는 인터셉터는 모두 HandlerInterceptor 를 구현해야 함
    • preHandle : request를 처리하기 직전에 핸들링
    • postHandle : DispatcherServlet이 뷰를 랜더링하기 직전에 핸들링
    • postHandle : DispatcherServlet이 뷰를 랜더링 한 이후

3. 로깅 인터셉터 등록

1에서 생성한 WebConfig에 아래와 같이 인터셉터를 등록한다

@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LogInterceptor());
    }
}

4. 결과

필터에도 추가로 로그를 남겨보았다

  1. 토큰 인증 성공한 경우

    • 필터 - 인터셉터 - 비즈니스 로직 - 인터셉터 순으로 결과가 잘 찍힘
  2. 토큰 인증 실패한 경우

    • 필터에서 막혀 Spring MVC에 진입하지 못함

HandlerInterceptors vs. Filters in Spring MVC
Introduction to Spring MVC HandlerInterceptor

0개의 댓글