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
- https://docs.spring.io/spring-security/reference/
- https://docs.spring.io/spring-framework/reference/web/webmvc.html
- https://jakarta.ee/specifications/servlet/
- Spring Security 요청 처리 흐름과 DispatcherServlet
- Filter vs Interceptor vs AOP — 어디서 무엇을 처리해야 할까