포스트

Filter를 이해하면서 정리한 생각 — 인증은 어디서 시작되는가

Filter를 이해하면서 정리한 생각 — 인증은 어디서 시작되는가

들어가면서

이전에 Filter / Interceptor / AOP를 정리하면서 각각의 역할을 구분해봤다.

👉 Filter vs Interceptor vs AOP — 어디서 무엇을 처리해야 할까

그때는 “어디서 무엇을 처리해야 하는가”라는 기준으로 정리했다면, 이번에는 조금 더 자연스럽게 이런 질문에서 시작하게 됐다.

“인증은 정확히 어디서 시작되는 걸까?”

JWT를 붙이고 나서야, 인증이 Controller 바깥에서 이미 끝난다는 걸 체감하게 됐다.


요청은 어디서부터 시작되는가

Spring을 사용하다 보면 요청이 Controller로 바로 들어온다고 착각하기 쉽다.

하지만 실제 흐름은 다르다.

1
2
3
4
5
6
7
Client Request
   ↓
Filter Chain
   ↓
DispatcherServlet
   ↓
Controller

Filter는 이 흐름의 가장 앞단에 있다.

Controller는 이미 “통과된 요청”만 받는다.


Filter를 다시 보게 된 이유

예전에는 Filter를 이렇게 생각했다.

  • 인코딩 처리
  • CORS 설정
  • 간단한 전처리

그런데 JWT 인증을 붙이면서 느낌이 완전히 달라졌다.

“이 요청을 애초에 받아도 되는가?”

이 질문을 가장 먼저 하는 곳이 Filter였다.


Spring Security를 붙이면 생기는 변화

Spring Security를 적용하면서 하나 인상 깊었던 점이 있다.

의존성을 추가하는 순간,

SecurityFilterChain이 생성되고 요청 흐름에 포함된다

즉,

  • 기존 FilterChain에
  • 보안 필터들이 자연스럽게 끼어든다

구조를 다시 보면

1
2
3
4
5
6
7
Client Request
   ↓
FilterChain
   ↓
SecurityFilterChain
   ↓
DispatcherServlet

이 안에서

  • 인증
  • 인가
  • 예외 처리

가 모두 처리된다.


왜 인증은 여기서 끝나야 할까

이건 구현하면서 자연스럽게 이해하게 됐다.

Controller까지 인증이 안 된 요청이 들어오는 순간,

  • 비즈니스 로직이 실행될 수 있고
  • 예상하지 못한 사이드 이펙트가 생긴다

그래서 인증은 이렇게 되어야 한다.

“비즈니스 로직 전에 끝난다”

Filter는 그걸 보장하는 위치다.


JWT를 붙이고 나서 느낀 점

JWT 필터를 직접 구현하면서 처음엔 단순히 “토큰 검사 로직”이라고 생각했다.

하지만 흐름을 따라가 보니 이건 더 큰 의미였다.

1
2
3
4
5
6
7
8
9
요청 진입
 ↓
JWT Filter
 ↓
토큰 검증
 ↓
SecurityContext 저장
 ↓
다음 단계 진행

이 시점이 지나면

Controller에서는 이미 인증된 사용자로 인식된다.


OncePerRequestFilter를 쓰게 된 이유

처음에는 그냥 예제 따라 사용했는데, 나중에 보니 이유가 있었다.

Filter는 다음 상황에서 여러 번 실행될 수 있다.

  • forward
  • include
  • dispatch

JWT 인증은 한 번만 하면 충분하다.

그래서

“한 요청당 한 번만 실행되게 보장”

이게 필요했다.


정리하면서 바뀐 관점

Filter를 이해하면서 바뀐 건 기술이 아니라 관점이었다.

예전에는:

  • “어디에 코드를 넣을까”

지금은:

  • “이 로직은 어느 계층에서 처리해야 할까”

결국 하나로 연결됐다

Filter를 이해하면서 자연스럽게 연결된 개념이 있다.

  • Spring Security 구조
  • JWT 인증 방식
  • 요청 처리 흐름

특히 이 부분은 따로 정리해두지 않으면 계속 헷갈린다.

👉 Spring Security 요청 처리 흐름과 DispatcherServlet


마무리

Filter는 단순한 전처리가 아니었다.

  • 요청을 받아들이는 입구였고
  • 인증이 시작되는 지점이었고
  • 시스템의 경계선이었다

이걸 이해하고 나니 Spring Security가 왜 이 구조를 선택했는지도 자연스럽게 납득이 됐다.


한 줄 정리

인증은 Controller에서 시작되지 않는다. 이미 그 전에 끝난다.


References

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.