◆ 개요
- 로그인 검증 부분에서 필터와 인터셉터를 사용하면 비즈니스 로직에서 공통된 로그인 검증 코드를 제거할 수 있음을 알게 되어서 공부를 해보게 됐다.
◆ 필터
- J2EE 표준 스펙 기능으로 디스패처 서블릿에 요청이 전달되기 전/후에 url패턴에 맞는 모든 요청에 대해 부가작업을 처리할 수 있는 기능을 제공한다.
- 디스패처 서블릿은 스프링의 가장 앞단에 존재하는 프론트 컨트롤러이며, 필터는 스프링 범위 밖인 웹 컨테이너에서 작동을 한다.
◆ 필터의 메소드
- init : 필터 객체를 초기화하고 서비스에 추가하기 위함
- doFilter : url패턴에 맞는 모든 HTTP 요청이 디스패처 서블릿으로 전달되기 전에 웹 컨테이너에서 실행되는 메서드
- destroy : 필터 객체를 서비스에서 제거하고 사용하는 자원을 반환하기 위함
◆ 인터셉터
- 필터와 달리 Spring이 제공하는 기술로써, 디스패처 서블릿이 컨트롤러를 호출하기 전과 후에 요청과 응답을 참조하거나 가공할 수 있는 기능을 제공한다.
- 필터는 웹 컨테이너에서 작동을 하지만 인터셉터는 스프링 컨텍스트에서 작동을 한다.
◆ 인터셉터의 메소드
- preHandle : 컨트롤러가 호출 되기 전에 실행됨.
- postHandle : 컨트롤러가 호출 된 후에 실행됨 (view 관련).
- afterCompletion : 컨트롤러가 호출 된 후에 실행되며, 비즈니스 로직에서 예외가 발생했다면 처리해줌
| 대상 | 필터(Filter) | 인터셉터(Interceptor) |
|---|---|---|
| 관리되는 컨테이너 | Servlet Container | Spring Container |
| Request/Response 조작 가능 여부 | 조작 가능 | 조작 불가능 |
| 용도 | 1. 공통된 보안 및 인증/인가 관련 작업 2. 모든 요청에 대한 로깅 또는 검사 3. 이미지/데이터 압축 및 문자열 인코딩 4. Spring과 분리되어야 하는 기능 | 1. 세부적인 보안 및 인증/인가 공통 작업 2. API 호출에 대한 로깅 또는 검사 3. Controller로 넘겨주는 정보(데이터)의 가공 |
◆ 최종 설명
필터
- 스프링과 무관하게 전역적으로 처리해야 하는 작업들을 처리할 수 있다.
- 대표적으로 보안 공통 작업이 있으며, 인터셉터보다 앞단에서 동작하므로 전역적으로 해야하는 보안 검사를 하여, 올바른 요청이 아닐 경우 차단을 할 수 있다.
- 또한 필터는 이미지나 데이터의 압축이나 문자열 인코딩과 같이 웹 애플리케이션에 전반적으로 사용되는 기능을 구현하기 적합하다.
인터셉터
- 클라이언트 요청과 관련되어 전역적으로 처리해야 하는 작업들을 처리할 수 있다.
- 대표적인 것은 세부적으로 적용해야 하는 인증/인가와 같이 클라이언트 요청과 관련된 작업 등이 있다.
- 객체 자체를 조작할 수는 없으나, 해당 객체가 내부적으로 갖는 값은 조작할 수 있어 컨트롤러로 넘겨주기 위한 정보를 가공하기에 용이하다.