Java/Spring

[Spring] Filter, Interceptor, ArgumentResolver

SeungbeomKim 2023. 10. 15. 02:29

 

비즈니스 로직과 인증 로직을 분리하기 위한 3가지 요소가 있습니다. 

 

이 3가지 요소는 이들은 모두 공통된 인증 로직을 처리합니다. 서비스 규모가 커진다면 보안 체크를 매 요청 때마다 해줘야 합니다. 그래서 이들을 확실하게 구분하고 중복 로직을 없애려고 합니다.

 

Filter, Interceptor, AOP가 있는데, AOP는 매우 방대한 내용이라서, Interceptor와 약간의 차이가 있지만 비슷한 역할을 담당하는ArgumentResolver에 대해서 설명드리겠습니다.

 

전반적인 흐름도

Servlet Request, ServletResponse Picture

다음 사진과 같이 Client가 HTTP Request를 보냈을 때, Spring Container 영역 밖에 있는 Filter(Servlet Container 영역)를 거치고 DispatcherServlet에서 해당 요청을 처리하게 됩니다. 이후, DispatcherServlet이 Controller를 호출하기 전과 후의 요청과 응답을 처리해 주는 Interceptor를 거치고, Controller가 실행되게 됩니다. 

 

  • DispatcherServlet
    • Front Controller라고 불리는 DispatcherServlet은 HTTP Protocol로 들어오는 모든 요청을 먼저 받아서 적합한 Controller에게 위임하는 역할 담당

 

Filter부터 차근차근 설명드리도록 하겠습니다.

 

Filter 

  • Dispacher Servlet의 요청이 전달되기 전/후에 url 패턴에 맞는 모든 요청에 대해 부가작업을 처리할 수 있는 기능을 제공
  • Spring Container가 아닌, Tomcat과 같은 웹 컨테이너에서 관리 (Servlet Container)
  • Spring 영역 밖에서 전역적으로 처리해야 하는 작업을 하는 경우에 사용

 

총 3가지 메소드를 구현해야 합니다.

 

  • init(): 필터 객체를 초기화하고 서비스에 추가하기 위한 메서드로서, 웹 컨테이너가 한 번 init 메서드를 호출하여 Filter 객체를 초기화하면 이후의 요청들은 doFilter 메서드를 통해 처리
  • doFilter(): url에 맞는 모든 HTTP 요청이 DispatcherServlet으로 전달되기 전에 웹 컨테이너에 의해 실행되는 메서드
  • destroy(): Filter 객체를 서비스에서 제거하고 사용하는 자원을 반환, 웹 컨테이너에 의해 한 번 호출되고 이후에는 doFilter에 의해 처리되지 않음

 

이제 Filter에 대해 설명했으니,  DispatcherServlet이 Controller를 호출할 때 거쳐가는 Interceptor에 대해 설명드리겠습니다.

 

Interceptor (Filter -> DispatcherServlet -> Interceptor)

  • Client의 요청과 관련하여 전역적으로 처리해야 하는 작업들을 처리
  • Spring이 제공하는 기술로서, DispatcherServlet이 Controller를 호출하기 전과 후에 요청과 응답을 참조하거나 가공할 수 있는 기능 제공(Controller가 넘겨주는 Data 가공의 목적)
  • DispatcherServlet은 HandlerMapping을 통해 적절한 Controller를 찾도록 요청하는데, 그 결과로 HandlerExecutionChain(실행 체인)을 반환
  • HandlerExectuionChain이 존재하면, Interceptor를 거쳐 Controller 실행, 존재하지 않으면 바로 Controller를 실행
  • 인증/인가와 같은 작업, API 호출에 대한 로깅을 목적으로 사용

Filter와 마찬가지로, 총 3가지 메서드를 구현해야 합니다. 

 

  • preHandle(): Controller 호출되기 전에 실행되기에 전처리 작업, 요청 정보를 가공 및 추가하는 경우에 사용, 반환 타입이 boolean이기에 반환 값이 true이며 다음 단계로 진행, false면 중단
  • postController(): Controller를 호출한 후에 실행, Controller 이후의 후처리 작업이 있을 때 사용하고 Controller가 반환하는 ModelAndView 타입의 정보가 제공되는데, 최근에는 Json 형태로 데이터를 제공하는 RestAPI 기반의 Controller(@RestController)를 만들면서 자주 사용되지 않음
  • afterCompletion: 모든 View에서 최종 결과를 생성하는 일을 포함해 모든 작업이 완료된 후에 실행

Interceptor와 ArgumentResolver의 차이

 

Interceptor는 Client의 HTTP 요청이 Controller 단으로 전달되기 전에, handler에서 return 함으로써 응답을 전달하려고 할 때 원하는 처리를 수행할 수 있도록 지시할 수 있습니다. 주로 로그인 관련된 프로세스에 Interceptor를 적용합니다.

(객체 반환 X, boolean, void만 가능)

 

반면, Resolver는 로그인 이후에 인증된 사용자 정보가 고정적으로 Parameter에 전달되어야 하는 상황에 사용됩니다.

(객체 반환 가능)

 

 

 

 

<참고 자료>

https://parkmuhyeun.github.io/woowacourse/2023-05-05-Filter-Interceptor/

 

공통 인증 로직 어디서 처리 할 수 있을까?(feat. Interceptor, Filter, Resolver)

공통 인증 로직 어디서 처리 할 수 있을까?(feat. Interceptor, Filter, Resolver) 05 May 2023 in woowacourse on Woowacourse, Spring, Interceptor, Filter, Argumentresolver Where can I handle common authentication logic?이번에 장바구니 미

parkmuhyeun.github.io

https://unluckyjung.github.io/spring/2022/03/12/Spring-Filter-vs-Interceptor/

 

Filter vs Interceptor

Filter와 Interceptor 차이를 알아봅니다. 요청, 응답을 처리하는 시점이 다릅니다.

unluckyjung.github.io

https://steady-coding.tistory.com/601

 

 

[Spring] Filter, Interceptor, Argument Resolver란?

spring-study에서 스터디를 진행하고 있습니다. 필터(Filter)란? 필터는 J2EE 표준 스펙 기능으로 디스패처 서블릿(Dispatcher Servlet)에 요청이 전달되기 전/후에 url 패턴에 맞는 모든 요청에 대해 부가 작

steady-coding.tistory.com