-
Filter, Interceptor 정리SW개발/Spring 2020. 3. 22. 21:52
이번에 개발중인 제품에서 토큰인증과 권한을 filter에서 모두 처리하면서 Error가 인증관련 문제로 나타나는 문제가 있었다. 그리고 이 부분은 결과적으로 Filter에서는 인증을, Interceptor에서는 권한체크를 담당하도록 구조를 변경하였는데, 이와 관련하여 Filter와 Interceptor가 각각 어떠한 일을 하는지 정리하고자한다.
1. 개요
클라이언트의 요청(servlet request)이 서버의 controller에 도달하기 전에 위의 그림과 같은 단계를 거치게 된다. 그냥 요청하면 컨트롤러에서 바로 처리해주면 될텐데 굳이 저러한 과정을 거치는 이유는 무엇일까? 생각해보면 간단하다. controller에 도착하기 이전에 미리 해주어야 할 것들이 있기 때문이다.
예를들어, 로그인을 할 때, 토큰 인증을 해야하는데 어디서 해야할까? 유저가 로그인을 하면 권한이 있는지 없는지 체크를 해줘야하는데 대체 어디서 해줘야할까? 이러한 물음에 대한 답으로 위의 Filter, Interceptor, AOP가 있다고 보면 된다.
즉, Controller에 도달하기 전에 처리해줘야 할 공통업무(유저인증, 권한체크, 페이지 인코딩 변환)를 컨트롤러 앞단에 배치하여 공통업무를 처리해주는 녀석들이라고 보면된다.
2. 구조 분석
- Interceptor와 Filter는 Servlet 단위에서 실행된다.(Dispatcher Servlet 앞, 뒤에 배치되어있다는 뜻)
- AOP는 메소드 앞에 Proxy 패턴의 형태로 실행된다.
- Filter는 스프링 영역 밖에, Interceptor와 AOP는 스프링 영역 안에 존재한다.
3. Filter
3.1 Filter에 대해
말 그대로 request 또는 response에 대한 필터링 역할을 한다. 즉, 요청이나 응답이 유저에게 돌려주기에 적합한지 아닌지를 판단한다. 예를들어, 로그인을 시도하면 인증(Authentication)단계를 거치게 되는데, 이 인증이 적합하면 유저에게 서버로부터 받은 응답을 돌려주고, 유저의 로그인 정보가 맞지 않다면 해당 유저에게 Error로그를 보내주는 것을 생각하면 된다.
또한, filter는 Dispatcher Servlet 이전에 실행이 되는데, 자원의 처리가 끝난 후 응답 내용에 대해서도 변경하는 처리를 할 수가 있다. 예를들어, 인코딩 변환처리, XSS 방어 등의 요청에 대한 처리로 사용된다.
참고로, Filter는 Web Application에 등록한다(참고로, Interceptor는 Spring Context에 등록한다). 예를들어 tomcat의 경우 /WEB-INF/web.xml에 사용할 Filter를 등록하여 사용한다. 따라서, Filter에서 예외가 발생하면 Web Application에서 처리해야한다. tomcat을 사용한다면 <error-page>를 잘 선언하든가 아니면 Filter에서 예외를 잡아 request.getRequestDispatcher(String)으로 마치 핑퐁 하듯이 예외 처리를 미뤄야 한다.
3.2 필터의 실행메서드
- init() - 필터 인스턴스 초기화
- doFilter() - 전/후 처리
- destroy() - 필터 인스턴스 종료
4. Interceptor
.4.1 Interceptor에 대해
Dispatcher Servlet이 컨트롤러를 호출하기 전에 Interceptor(가로채는) 역할을 한다고 보면되며, Spring Context 내부에서 Controller에 관한 요청과 응답에 대해 처리한다. 스프링의 모든 Bean 객체에 접근할 수 있다.
인터셉터는 여러개를 사용할 수 있고, 로그인 체크, 권한 체크, 프로그램 실행시간 계산작업 등의 업무처리를 한다.
4.2 실행메서드
- preHandler() - 컨트롤러 메서드가 실행되기 전에 처리
- postHandler() - 컨트롤러 메서드 실행 직후 처리
- afterCompletion() - view 페이지가 렌더링 된 후
5. 결론
로그인 페이지 또는 권한처리에 대해 고민하다보면 Filter와 Interceptor영역에 대해 생각하게 될 것이다. 전후 처리라는 점에서 그 역할은 비슷하나, 실제로 실행되는 시점이나 할 수 있는 것들이 다르다. 처리해야 할 요구 사항에 따라서 무엇을 써도 무방할 수도 있다. 하지만 차이점을 정확히 파악하고 있다면 조금이나마 더 효과적으로 개발을 할 수 있을 것이다.