본문 바로가기

Backend/Spring | SpringBoot

[Spring Security] Onceperrequestfilter vs Usernamepasswordauthenticationfilter

반응형

JWT필터를 구현하는 과정에서 궁금증이 생겼다.
구현을 하면서 인증과 인가를 함에 있어 2개의 필터를 상속받아 구현하는것이 맞을까 하는 궁금증이었다.
내가 구현하는 구조가 잘못되었을지도 모르고 중복 동작을 구현했을지도 모르니 찾아보기로 했다.
일단 JWT필터를 구현함에 있어 알아본 필터는 4가지가 있다.


1. UsernamePasswordAuthenticationFilter
AbstractAuthenticationProcessingFilter의 하위 클래스로 주로 웹 폼 기반의 로그인 처리를 다루는 데 사용된다.
사용자가 로그인 폼에 입력한 사용자명과 비밀번호를 받아와 인증을 시도한다.
UsernamePasswordAuthenticationFilter는 사용자 이름과 비밀번호를 사용하여 인증을 시도하는 표준 Spring Security 필터이다. 일반적으로 폼 로그인 인증 절차에서 사용되며, 사용자 이름과 비밀번호를 받아 인증 객체를 생성하고 인증 과정을 수행한다.

 

2. GenericFilterBean
주로 단순한 필터 동작을 정의할 때 사용되며, Spring의 빈 라이프사이클과 통합되어 스프링 빈으로 등록된 필터가 필요한 초기화나 종료 작업을 수행할 수 있도록 지원한다.
각 요청마다 필터가 실행되며, 중복 호출을 관리하지 않아 요청마다 여러 번 실행될 수 있다

 

3. OncePerRequestFilter
GenericFilterBean의 하위클래스로 요청당 한 번만 실행되도록 보장해주는 메커니즘을 제공한다.
이는 필터 체인에서 필터의 중복 실행을 방지하는 데 도움이 된다.
주로 요청을 가로채어 특정 로직(예: 요청 헤더에서 JWT 토큰을 추출하고 검증하는 것)을 수행하는 데 사용된다.
JWT 인증에서 이 필터는 일반적으로 토큰의 유효성을 검사하고, 유효한 경우 Spring의 SecurityContext에 인증 세부 정보를 설정하는 데 사용된다.

 

4. BasicAuthenticationFilter
OncePerRequestFilter의 하위 클래스로 HTTP Basic 인증을 처리하는 필터이다.
Basic 인증은 클라이언트가 Base64로 인코딩한 사용자명과 비밀번호를 "Authorization" 헤더에 포함시켜 요청을 보내는 방식 이다.

 

UsernamePasswordAuthenticationFilter는 주로 사용자가 시스템에 처음 로그인할 때 사용자 이름과 비밀번호를 검증하고, 유효한 인증 정보에 대해 JWT를 생성하고 반환하는 데 사용된다.
그리고 이후 서비스에 대해서는 OncePerRequestFilter를 상속받은 필터를 사용하여 각 요청에 포함된 JWT의 유효성을 검증하는 것이 일반적이다. 이 필터는 요청마다 실행되어 토큰을 검증하고, 유효한 토큰을 가진 요청에 대해 해당 사용자에게 적절한 인증을 부여한다.

 

정리하면 아래와 같다.

1. UsernamePasswordAuthenticationFilter는 JWT인증과는 별개로 JWT를 생성 하고 반환 하는데 사용
2. 클래스 관계 : GenericFilterBean ⊃ OncePerRequestFilter ⊃ BasicAuthenticationFilter
3. OncePerRequestFilter는 JWT의 유효성을 검증하는데 사용

 

따라서 두가지 모두 사용해서 구현하는 것도 가능하고 적절히 하면 될것 같다.

반응형