작성 이유
SpringSecurity + Swagger + jwt 초기 셋팅을 진행하던 도중 JwtAuthorizationFilter 와 SecurityConfig 를 작성하다가 문득 나는 왜 BasicAuthenticationFilter > OncePerRequestFilter 를 사용하게 되었으며, BasicAuthenticationFilter 클래스와 UsernamePasswordAuthenticationFilter 클래스의 차이는 무엇일까? 궁금하였다.
Spring Security Filter Chain Flow
공식 문서 : https://docs.spring.io/spring-security/site/docs/4.2.1.RELEASE/reference/htmlsingle/#filter-ordering
스프링 시큐리티 체인의 주요 필터는 아래와같은 순서대로 흘러간다.
SecurityContextPersistenceFilter(JSESSIONID에서 인증 복원)
UsernamePasswordAuthenticationFilter(인증 수행)
ExceptionTranslationFilter(FilterSecurityInterceptor에서 보안 예외 포착)
FilterSecurityInterceptor(인증 및 권한 부여 예외가 발생할 수 있음)
체인 필터를 조금 자세히 들어다보면 아래와같다.
1. ChannelProcessingFilter - 다른 프로토콜로 리디렉션해야 할 수도 있기 때문입니다.
2. SecurityContextPersistenceFilter - 웹 요청 시작 시 SecurityContextHolder에 SecurityContext를 설정할 수 있으며, 웹 요청이 종료되면 SecurityContext에 대한 모든 변경 사항을 HttpSession에 복사할 수 있습니다(다음 웹 요청에 사용할 준비가 됨).
3. ConcurrentSessionFilter - SecurityContextHolder 기능을 사용하고 주체의 진행 중인 요청을 반영하기 위해 SessionRegistry를 업데이트해야 하기 때문입니다.
4. 인증 처리 메커니즘 - UsernamePasswordAuthenticationFilter , CasAuthenticationFilter , BasicAuthenticationFilter 등 - SecurityContextHolder가 유효한 인증 요청 토큰을 포함하도록 수정될 수 있음
5. SecurityContextHolderAwareRequestFilter ( 서블릿 컨테이너에 Spring 보안 인식 HttpServletRequestWrapper를 설치하는 데 사용하는 경우)
6. JaasApiIntegrationFilter , JaasAuthenticationToken이 SecurityContextHolder에 있는 경우 이는 JaasAuthenticationToken 의 주제로 FilterChain을 처리합니다.
7. RememberMeAuthenticationFilter - 이전 인증 처리 메커니즘이 SecurityContextHolder를 업데이트하지 않고 요청이 RememberMe 서비스가 발생할 수 있도록 하는 쿠키를 제공하는 경우 적절하게 기억된 인증 개체가 해당 위치에 배치됩니다.
8. AnonymousAuthenticationFilter - 이전 인증 처리 메커니즘이 SecurityContextHolder를 업데이트하지 않은 경우 익명 인증 개체가 해당 위치에 배치됩니다.
9. ExceptionTranslationFilter - HTTP 오류 응답이 반환되거나 적절한 AuthenticationEntryPoint가 실행될 수 있도록 Spring 보안 예외를 포착합니다.
10. FilterSecurityInterceptor - 웹 URI를 보호하고 액세스가 거부될 때 예외를 발생시킵니다.
Filter의 종류?
1. UsernamePasswordAuthenticationFilter
AbstractAuthenticationProcessingFilter의 하위 클래스로
주로 웹 폼 기반의 로그인 처리를 다루는 데 사용됩니다.
사용자가 로그인 폼에 입력한 사용자명과 비밀번호를 받아와 인증을 시도합니다.
폼 기반으로 값을 전달받다보니 JWT 토큰 인증과는 겹치는 부분이 전혀 없음
2. BasicAuthenticationFilter
OncePerRequestFilter의 하위 클래스로
HTTP Basic 인증을 처리하는 필터입니다.
Basic 인증은 클라이언트가 Base64로 인코딩한 사용자명과 비밀번호를 "Authorization" 헤더에 포함시켜 요청을 보내는 방식 입니다.
Base64 인코딩 및 Authorization header를 통한 인증이 JWT와 비슷함! 가증 유력한 인증 필터로 유력
3. GenericFilterBean
주로 단순한 필터 동작을 정의할 때 사용되며, Spring의 빈 라이프사이클과 통합되어
스프링 빈으로 등록된 필터가 필요한 초기화나 종료 작업을 수행할 수 있도록 지원합니다.
각 요청마다 필터가 실행되며, 중복 호출을 관리하지 않아 요청마다 여러 번 실행될 수 있습니다
요청마다 중복 호출을 한다는 점에서 탈락
4. OncePerRequestFilter
GenericFilterBean의 하위클래스로 요청당 한 번만 실행되는 필터를 생성하기 위해 사용됩니다.
이 클래스는 요청이 처리되는 동안 한 번만 실행되도록 보장해주는 메커니즘을 제공합니다.
이는 필터 체인에서 필터의 중복 실행을 방지하는 데 도움이 됩니다.
여기서 흐름을 보면 OncePerRequestFilter가 가장 JWT 특성과 유사하며, 중복 요청을 방지할 수 있다는 점이 큰 메리트를 가지고있어서 OncePerRequestFilter 가 가장 적합할 것 같다고 생각!!
느낀점
GenericFilterBean처럼 중복요청을 전부 다 체크하지 않는이상 어떤 클래스를 써도 큰 문제가 될 것 같지는 않다.
다만 이전에 트레픽 이슈로 죽었던 경험이 있고, 이런 사소한 차이가 나비효과가 된다는 것을 알고있기때문에 많이 찾아보게 되는 것 같다.
또한 확실히 전체 흐름을 알고 어떤 방식을 사용해야하는지 알아가는 단계는 쉽지 않은 것 같다.
refs
AuthenticationFilter 어떤 필터를 상속받을 것인가?
🧐: UsernamePasswordAuthenticationFilter 상속 받아서 쓰실 예정인가요? 🙋♀️: 강사님 코드는 BasicAuthenticationFilter네요? 🧐: 필터 아무거나 써도 되긴 하는데 전 OncePerRequestFilter 썼어요
velog.io
Security Filter Chain Stak Overflow : https://stackoverflow.com/questions/41480102/how-spring-security-filter-chain-works
How Spring Security Filter Chain works
I realize that Spring security build on chain of filters, which will intercept the request, detect (absence of) authentication, redirect to authentication entry point or pass the request to authori...
stackoverflow.com
'BE > Java' 카테고리의 다른 글
| Springboot3 + Swagger + Jwt (5) (0) | 2024.07.03 |
|---|---|
| Springboot3 + Swagger + Jwt (4) (0) | 2024.06.25 |
| Springboot3 + SpringSecurity + H2 403 (0) | 2024.06.24 |
| Springboot3 + Swagger + Jwt (3) (0) | 2024.06.21 |
| Springboot3 + Swagger + Jwt (2) (0) | 2024.06.20 |