[Spring] API 서비스 필터링

[Spring] API 서비스 필터링

OncePerRequestFilter를 사용해 API 호출 필터링을 살펴봅니다.


API 서비스를 학습하며 사용한 ‘/notes’는 외부에서 데이터를 주고받기 위한 경로입니다. 이 경로를 외부에서 아무런 제약 없이 호출하는 것은 서버에게 상당한 위험이 될 수 있습니다.
필터를 사용한 필터링을 통해 인증된 사용자에 한해서 서비스를 제공하게 할 수 있습니다.
먼저 스프링 프레임워크에서 제공하는 OncePerRequestFilter를 사용한 예제를 확인해보겠습니다.



1. ApiCheckFilter 생성



1

OncePerRequestFilter는 추상 클래스로 제공되는 필터로 가장 일반적이며, 매번 동작하는 기본적인 필터입니다. ApiCheckFilter를 위의 그림과 같은 경로에 생성한 뒤 OncePerRequestFilter를 상속받도록 작성합니다.
우선은 단순히 log를 출력하도록 작성하고 filterChain.doFilter()를 통해 다음 단계로 넘어가게 합니다.

2. SecurityConfig - apiCheckFilter() 작성



2

생성한 ApiCheckFilter를 SecurityConfig에서 스프링의 빈으로 등록합니다.

3. SecurityConfig - apiCheckFilter() 작성 결과



3

프로젝트를 실행해 중간의 스택 트레이스를 살펴보면 ApiCheckFilter가 동작하는 것을 확인할 수 있습니다.
ApiCheckFilter의 경우 스택 트레이스에서 보여지는 (15/15)를 통해 여러 과정 중 가장 마지막 필터임을 알 수 있습니다.

4. SecurityConfig - finterChain() 수정



4

만약 ApiCheckFilter의 동작 순서를 조절하고 싶은 경우 http.addFilterBefore()을 사용할 수 있습니다.
위와 같이 addFilterBefore()를 작성할 경우 AuthenticationFilter 이전에 ApiCheckFilter가 작동하도록 순서가 변경됩니다.

5. SecurityConfig - finterChain() 수정 결과



5

필터 동작 순서를 변경한 뒤 프로젝트를 실행하고 스택 트레이스를 살펴보면 ApiCheckFilter의 동작 순서가 바뀐 것을 확인할 수 있습니다.

6. ApiCheckFilter 수정



6

ApiCheckFilter가 오직 ‘/notes’로 시작하는 경우에만 작동하도록 하고자 합니다. 이는 AntPathMatcher를 사용해 구현할 수 있습니다. AntPathMatcher는 엔트 패턴에 맞는지를 검사하는 유틸리티입니다.
생성자에 AntPathMathcer()를 추가하고 doFilterInternal()에 AntPathMatcher의 match()를 사용해 지정한 패턴과 request의 URI가 같을 때 실행되도록 작성합니다.

7. SecurityConfig - apiCheckFilter() 수정



7

생성자에 파라미터가 생겼기 때문에 apiCheckFilter()를 수정합니다.

8. ApiCheckFilter 수정 결과



8

수정 후 프로젝트를 실행하면 ‘/notes/’로 접근할 경우에만 스택 트레이스에 ApiCheckFilter가 동작하는 것을 확인할 수 있습니다.


© 2022. All rights reserved.