Spring은 공통적으로 작업을 처리함으로써 중복된 코드를 제거할 수 있는 기능을 제공한다.
Spring에서 사용되는 이 기능들은 모두 어떤 행동을 하기 전에 먼저 실행하거나, 실행 한 후에 추가적인 행동을 할 때 사용되는 기능들이다.
- Filter
- Interceptor
- AOP (Aspect Oriendted Programmig, 관점 지향 프로그래밍)
1. Filter
- 요청과 응답을 거른 뒤 정제하는 역할을 한다.
- Dispatcher Servlet에 요청이 전달되기 전, Dispatcher Servlet을 떠난 직후에 url 패턴에 맞는 모든 요청에 대해 부가 작업을 처리할 수 있는 기능을 제공한다.
- 스프링 컨텍스트가 아닌, 톰캣과 같은 웹 컨텍스트에 의해 관리되는 것이고, 스프링 밖에서 처리되는 것 (스프링 빈으로 등록 가능)
- Filter는 기본적으로 스프링과 무관하게 전역적으로 처리해야 하는 작업들을 처리할 수 있다.
- Interceptor보다 앞단에서 동작하기 때문에 보안 검사(XSS 방어)를 하여 올바른 요청이 아닌 경우 차단할 수 있다. 사전 차단을 통해 스프링 컨테이너까지 요청이 전달되지 못하고 차단되므로 안전성을 더욱 높일 수 있다.
1-1. Filter 사용 사례
- 보안 및 인증/인가 관련 작업
- 모든 요청에 대한 로깅 또는 감사
- 이미지/데이터 압축 및 문자열 인코딩 (웹 어플리케이션에 전반적으로 사용되는 기능을 구현하기에 적합하다)
- Spring과 분리되어야 하는 기능
2. Interceptor
- 요청에 대한 작업 전/후로 가로챈다고 보면 된다. Dispatcher Servlet이 Controller를 호출하기 전 / 후에 인터셉터가 끼어들어 요청과 응답을 참조하거나 가공할 수 있는 기능을 제공한다.
- 스프링 컨텍스트에서 관리된다.
- Controller 처리 이전, Controller 처리 이후, View 렌더링 이후에 로직이 수행된다.
- 주로 클라이언트의 요청과 관련되어 전역적으로 처리해야하는 작업을 처리한다. 컨트롤러로 넘어가기 직전에 공통으로 해야하는 기능을 처리할 때 적합하다.
- HttpServletRequest나 HttpServletResonse와 같은 객체를 제공받기 때문에 객체 자체를 조작할 수 없다. (필터는 가능) 대신 해당 객체가 내부적으로 갖는 값을 조작할 수 있기 때문에 컨트롤러로 넘겨주기 위한 정보를 가공하기에 용이하다.
- 예를 들어 JWT 토큰을 사용해서 인가를 처리하기 전 공통 기능을 수행할 때를 생각해보자, 이때 JWT 토큰 정보를 파싱해서 컨트롤러에게 사용자의 정보를 제공할 수 있도록 가공할 수 있다.
- Dispatcher Servlet이 핸들러 매핑을 통해 컨트롤러를 찾도록 요청하는데, 그 결과로 실행체인을 돌려준다. 여기서 1개 이상의 인터셉터가 등록되어 있다면 순차적으로 인터셉터들을 거쳐 컨트롤러가 실행되도록 하고, 인터셉터가 없다면 바로 컨트롤러를 실행한다. 인터셉터가 직접 컨트롤러로 요청을 위임하는 것이 아니다.
2-1. Interceptor 사용 사례
- 세부적인 보안 및 인증/인가 공통 작업
- API 호출에 대한 로깅 또는 검사
- Controller로 넘겨주는 정보(데이터) 가공
3. Interceptor와 AOP 비교
인터셉터 대신에 컨트롤러들에 적용할 부가기능을 어드바이스로 만들어 AOP를 적용할 수 있다. 하지만 컨트롤러는 파라미터나 리턴 값이 일정하지 않고, 타입과 실행 메소드가 모드 재각각이라 컨트롤러에 AOP를 적용하려면 번거로운 과정이 수반된다.
그래서 Interceptor를 사용하는 편이 낫다.
4. Filter와 Interceptor 비교
Filter와 Interceptor 둘다 비즈니스 로직과 분리되어 특정 요구사항을 만족시켜야 할 때 적용된다.
Filter는 웹 컨텍스트에서 관리하기 때문에, 모든 요청에 로직이 필요한 경우, request/response header와 같은 매개변수를 수정해야할 때 사용한다.
특정 요청과 컨트롤러에 관계없이 전역적으로 처리해야 하는 작업이나, 웹 어플리케이션에 전반적으로 사용되는 기능을 구현할 때 적용한다.
Interceptor는 스프링 컨텍스트에서 관리하기 때문에, 특정 요청에만 전/후 로직이 필요한 경우 혹은 입/출력 데이터를 가공할 때 사용한다.클라이언트의 요청과 관련된 작업에 대해 추가적인 요구사항을 만족해야 할 때 적용한다.
Reference
'TIL' 카테고리의 다른 글
OpenID (OIDC) (0) | 2023.09.01 |
---|---|
[TIL-230829]CSRF (0) | 2023.08.29 |
OAuth2.0 (0) | 2023.08.28 |
[TIL-230827] 인증과 인가 (0) | 2023.08.27 |
[TIL-230629] 서블릿(Servlet)이란? (0) | 2023.06.29 |