1. Filter 필터
1.1 개념
Filter는 서블릿(Servlet)으로 요청이 전달되기 전, 또는 응답이 클라이언트로 반환되기 전에 요청과 응답을 전처리하거나 후처리하는 메커니즘입니다.
Filter는 Java 웹 애플리케이션의 핵심 구성 요소(Servlet, Filter, Listener) 중 하나입니다.
주로 로그인 검증, 인코딩 통일, 민감 문자 처리 등 공통적인 작업을 수행하는 데 사용됩니다.
@WebFilter(urlPatterns = "/*") // 필터가 차단할 요청 경로 설정 ("/*"는 모든 브라우저 요청 차단)
public class LogFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("init: 초기화 메서드 호출됨");
}
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
System.out.println("LogFilter: 요청 차단됨 - 전처리 로직");
// 요청 전달
chain.doFilter(req, res);
System.out.println("LogFilter: 후처리 로직");
}
@Override
public void destroy() {
System.out.println("destroy: 소멸 메서드 호출됨");
}
}
Filter 클래스에 @WebFilter 애노테이션을 추가한 후, 애플리케이션 진입점에 @ServletComponentScan 애노테이션을 추가하여 Spring Boot에서 서블릿 구성 요소를 활성화해야 합니다.
@ServletComponentScan
@SpringBootApplication
public class MainApplication {
public static void main(String[] args) {
SpringApplication.run(MainApplication.class, args);
}
}
참고: 필터에서 chain.doFilter(req, res)를 호출하여 요청을 전달하지 않으면 후속 리소스에 접근할 수 없습니다.
1.2 필터의 세 가지 메서드
1.2.1 init()
필터 객체가 생성될 때 자동으로 호출되며, 한 번만 실행됩니다.
1.2.2 doFilter()
요청이 차단될 때마다 매번 호출되는 핵심 메서드로, 요청과 응답을 처리합니다. chain.doFilter()로 요청을 전달할 수 있습니다.
1.2.3 destroy()
서버가 종료될 때 자동으로 호출되며, 한 번만 실행됩니다.
1.3 차단 경로 설정
- 특정 경로:
/login–/login경로만 차단 - 디렉터리 차단:
/api/*–/api/하위 모든 리소스 차단 - 모든 경로:
/*– 모든 리소스 차단
1.4 필터 체인 (다중 필터)
웹 애플리케이션에 여러 필터를 구성할 수 있으며, 이를 필터 체인이라고 합니다. 필터 실행 순서는 클래스 이름의 알파벳 순서에 따라 결정됩니다.
1.5 구현 단계
- 필터 클래스 정의:
javax.servlet.Filter인터페이스를 구현하고 모든 메서드를 재정의 - 경로 설정:
@WebFilter애노테이션으로 차단할 리소스 경로 지정
요청 처리 흐름:
- 요청 URL 획득
- URL에
login이 포함되어 있으면 통과 - 요청 헤더에서 토큰(token) 획득
- 토큰이 없으면 미인증 오류 반환
- 토큰을 파싱하여 검증 실패 시 미인증 오류 반환
- 모든 검증 통과 시 요청 전달
2. Interceptor 인터셉터
2.1 개념
Interceptor는 컨트롤러(Controller)로 요청이 전달되기 전후 또는 뷰(View)가 렌더링된 후에 로직을 실행할 수 있는 Spring MVC의 기능입니다.
필터와 유사하지만 Spring 컨텍스트 내에서 동작하며, 주로 인증, 로깅, 성능 모니터링 등에 사용됩니다.
2.2 세 가지 메서드
2.2.1 preHandle()
컨트롤러 실행 전에 호출되며, true를 반환하면 요청이 계속 진행되고, false를 반환하면 중단됩니다.
2.2.2 postHandle()
컨트롤러 실행 후에 호출되며, 뷰 렌더링 전에 추가 처리를 수행합니다.
2.2.3 afterCompletion()
뷰 렌더링이 완료된 후에 호출되어 리소스 정리 등의 작업을 수행합니다.
2.3 구현 단계
- 인터셉터 클래스 정의:
HandlerInterceptor인터페이스 구현 - 등록 및 설정:
WebMvcConfigurer인터페이스를 구현하여 인터셉터 등록
public class AuthInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("AuthInterceptor: preHandle 실행");
String token = request.getHeader("Authorization");
if (token == null || token.isEmpty()) {
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
return false;
}
// 토큰 검증 로직
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
System.out.println("AuthInterceptor: postHandle 실행");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
System.out.println("AuthInterceptor: afterCompletion 실행");
}
}
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new AuthInterceptor())
.addPathPatterns("/api/**") // 차단할 경로
.excludePathPatterns("/api/login"); // 제외할 경로
}
}
2.4 필터와 인터셉터의 실행 순서
두 구성 요소를 함께 사용할 경우 실행 순서는 다음과 같습니다:
- Filter의
doFilter()전처리 - Interceptor의
preHandle() - 컨트롤러 실행
- Interceptor의
postHandle() - Filter의
doFilter()후처리 - Interceptor의
afterCompletion()
3. Filter와 Interceptor의 주요 차이점
| 구분 | Filter | Interceptor |
|---|---|---|
| 기반 | Servlet API 기반 | Spring MVC 프레임워크 기반 |
| 적용 범위 | 모든 요청 (정적 리소스 포함) | 컨트롤러로 전달되는 요청만 |
| Spring 빈 주입 | 직접 지원하지 않음 (추가 설정 필요) | 완전히 지원 |
| 주요 사용 사례 | 인코딩 처리, 보안 검사, 압축 | 인증, 로깅, 성능 측정, 권한 검사 |