[Spring] Filter와 Interceptor에 대해서 알아보고 사용해보자.

2025. 2. 26. 23:55Backend/Spring

개요

이번 과제에서 Spring Interceptor 를 사용을 하게 되면서 Spring 의 흐름은 어떻게 되는지 알게되어서 글을 남긴다.

 

 


기본 배경

 

가장 먼저 흐름에 대해서 알아야한다고 생각을 한다.

스프링의 영역은 Dispatcher Servlet 부터 시작을 한다.

 

Spring MVC

그 Spring MVC 에서 나오는 그 Dispatcher Servlet이 맞다.

 

그리고 Filter 부터 Controller 까지 같은 Servlet Request, Servlet Response 를 사용을 한다.

 

다음에 나오는 내용들 까지 전부 설명을 하면 좋겠지만, 오늘은 Filter 와 Interceptor의 차이까지만 알아보고자 한다.

 

 


 

 

Filter vs Interceptor

  Filter Interceptor
작동 위치 Tomcat Spring 내부
역할 요청과 응답을 거른뒤 정제하는 역할 요청에 대한 작업 전/후로 가로 챈다.
차이점 스프링 자원을 사용할 수 없다. 스프링의 자원을 사용할 수 있다.
기타 모든 요청을 필터를 거친다. 각 컨트롤러에 대한 공통점을 처리한다.

 

간단하게 이정도의 차이점이 있다.

 

모든 요청은 일단 Filter를 거치고 나서 스프링의 내부로 들어오게된다.

 

그후 컨트롤러가 호출이 되기 전에 Interceptor 가 요청에 대한 작업 전/후로 가로채서 처리를 한다음에 컨트롤러에게 혹은 다음 순서에게 넘겨주게 된다.

 

 


 

FIlter , Interceptor 만들기

 

Filter

@Slf4j
@RequiredArgsConstructor
public class JwtFilter implements Filter {

    private final JwtUtil jwtUtil;

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest httpRequest = (HttpServletRequest) request;
        HttpServletResponse httpResponse = (HttpServletResponse) response;

        String url = httpRequest.getRequestURI();

        if (url.startsWith("/auth")) {
            chain.doFilter(request, response);
            return;
        }

        String bearerJwt = httpRequest.getHeader("Authorization");

        if (bearerJwt == null) {
            // 토큰이 없는 경우 400을 반환합니다.
            httpResponse.sendError(HttpServletResponse.SC_BAD_REQUEST, "JWT 토큰이 필요합니다.");
            return;
        }

       	// 로직 생략
    }
}

 

간단하게 설명을 해보면 implements Filter를 해서 새로운 필터를 생성을 한 다음에

doFilter 메소드를 오버라이드를 해서 사용을 할 수 있다.

 

 

Interceptor

@Slf4j
public class AdminInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        UserRole role = UserRole.of(request.getAttribute("userRole").toString());

        if( !UserRole.ADMIN.equals(role) ) {
            response.sendError(HttpServletResponse.SC_FORBIDDEN, "관리자 권한이 없습니다.");
            return false;
        }

        return true;
    }
}

 

현재 블로그 주인장이 사용하는 Spring 버젼에서는 HandlerInterceptorAdaptor 는 더 이상 사용이 안되기 때문에

implements HandlerInterceptor 를 사용해야한다.

 

그후 preHandle 메소드를 오버라이드를 해서 사용을 해주면된다.

 

위 코드는 단순하게 생략된 로직에서 ServletRequest에 이미 attribute로 값이 들어가 있기 때문에

값을 받아와서 사용을 하였다.

 

false로 리턴을 하면 Interceptor를 통과를 하지 못한것이고 true면 통과가 된것이다.

 


Filter , Interceptor 적용법

Filter

@Configuration
@RequiredArgsConstructor
public class FilterConfig {

    private final JwtUtil jwtUtil;

    @Bean
    public FilterRegistrationBean<JwtFilter> jwtFilter() {
        FilterRegistrationBean<JwtFilter> registrationBean = new FilterRegistrationBean<>();
        registrationBean.setFilter(new JwtFilter(jwtUtil));
        registrationBean.addUrlPatterns("/*"); // 필터를 적용할 URL 패턴을 지정합니다.

        return registrationBean;
    }
}

 

Filter 같은 경우는 @Configuration + @Bean 으로 등록을 진행을 해주면 된다.

 

주석으로 설명이 되어있는 것처럼 필요한 URL에 패턴을 적용을 할 수 있다.

 

 

Interceptor

@Configuration
public class WebConfig implements WebMvcConfigurer {

    // Intercepter 등록
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new AdminInterceptor())
                .addPathPatterns("/admin/**");
    }
}

 

Interceptor 의 경우는 implements WebMvcConfigurer 를 받아서 사용을 할 수 있다.

 

addInterceptors 메소드를 오버라이드를 해서 registry에 interceptor를 추가를 해주면 끝난다.

 

 


 

느낀점

오늘 간단한 내용인 Interceptor에 대한 내용을 공부를 했는데,

간단한 내용이지만 오히려 간단하여 Spring 흐름과 Spring MVC에 대한 내용을 자세하게 알게된 것 같아서

적게 되었다.

 

사소한 것에도 이렇게 얻어가는 것이 있어서 세상은 보기 나름이라고 생각한다.

 

앞으로도 화이팅

 

 

 

참고자료

 

[Spring MVC] 스프링 MVC란 무엇인가? - 스프링 MVC 구조 이해

본 내용은 온라인 강의 사이트 인프런의 김영한 님의 강의 내용이 포함되어 있습니다. '스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술' 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 - 인프런 | 강의 웹

ittrue.tistory.com

 

 

[Spring] Filter, Interceptor, AOP 차이 및 정리

[Spring] Filter, Interceptor, AOP 차이 및 정리 안녕하세요. 갓대희 입니다. 이번 포스팅은 [ [Spring] 필터, 인터셉터, AOP 정리 ] 입니다. : ) 공통 프로세스에 대한 고민자바 웹 개발을 하다보면, 공통적으

goddaehee.tistory.com