로그인 처리를 하면서 servlet filter, spring interceptor, spring argument resolver 에 대해서 공부했다.
모두 공통의 관심사를 처리할 때 사용한다는 특징이 있다.
어떠한 상황에 어떤 것을 사용해야 하는지 정확히 구분하기 위해 정리해보기로 했다.
servlet filter
디스패처 서블릿에 요청이 전달되기 전 처리를 할 수 있다.
url 패턴에 맞는 모든 요청에 대해서 처리가 가능하다.
필터는 J2EE 표준 스펙 기능으로서 spring 과 분리된 기능을 처리해야할 때 사용한다. 웹 컨테이너에서 동작하기 때문에 올바르지 않은 요청일 경우 사전에 차단 가능하여 스프링 컨테이너까지의 진입이 차단되어 안정성을 높일 수 있다.
spring interceptor
컨트롤러를 호출하기 전과 후의 처리를 할 수 있다.
디스패처 서블릿은 핸들러 매핑을 통해 컨트롤러를 찾는데, 그 결과로 실행체인(HandlerExecutionChain)을 돌려준다. 이 실행 체인은 1개 이상의 인터셉터가 등록이 되어 있다면, 인터셉터를 거쳐 컨트롤러를 실행하게 한다. 인터셉터가 없다면 바로 컨트롤러를 실행한다.
로그인 된 사용자만이 마이페이지에 접속할 수 있다면, 인터셉터에서 검증이 필요하다.
spring argument resolver
컨트롤러에 어떠한 요청이 들어왔을 때, 요청에 들어온 값을 이용해 원하는 객체를 만들 수 있다.
메서드 파라미터를 인자값들에 주입해주는 전략적 인터페이스이다.
jwt 토큰과 함께 요청이 들어온다면 이 토큰이 유효한 토큰인지 확인 후, 토큰에 저장된 id 를 꺼내서 로그인 유저 객체를 생성해야 한다. 만약 이것을 컨트롤러마다 구현하게 된다면 중복된 코드가 생기고 컨트롤러의 책임이 증가한다.
동작 순서
- client request
- filter
- dispatcher servlet
- client request 에 대한 handler mapping 처리
- (1) request mapping
- (2) interceptor
- (3) argument resolver
- controller
filter vs interceptor vs argument resolver
- 필터는 스프링과 무관한 전역적으로 처리하는 작업(보안 등) 과 같은 것을 처리할 때 사용한다.
- 필터는 서블릿 컨테이너, 인터셉터는 스프링 컨테이너에서 관리한다.
- 인터셉터는 스프링에 들어온 요청을 전역적으로 처리하는 작업(로그인 인가)
- 인터셉터는 컨트롤러가 실행되기 전에 요청을 가로채며, 특정 객체를 반환할 수 없다. 오직 boolean 또는 void 만 반환이 가능하다.
- 리졸버는 인터셉터 이후에 동작하며, 요청이 컨트롤러로 들어왔을 때 값으로 원하는 객체를 생성할 수 있다.
interceptor 로 로그인 상태인지 확인 후,
argument resolver 로 받아온 요청을 통해 authUser 객체를 생성하는 방식을 사용하였다.
'프로젝트' 카테고리의 다른 글
웹 소켓과 tcp/ip 소켓의 차이점 (0) | 2023.06.07 |
---|---|
cognito와 oauth2.0 (0) | 2023.05.24 |
프로젝트 인프라 구성 (0) | 2023.04.04 |
세션 방식을 선택한 이유 (0) | 2023.02.28 |
jwt 토큰 방식을 선택한 이유 (0) | 2022.10.13 |