Spring/SpringSecurity

JwtAuthorizationFilter에서 상속받을 필터에 대한 고민

코딩맛 2024. 12. 1. 18:55

- Index -

[SpringSecurity] SpringSecurity + JWT 로그인 구현_1
[SpringSecurity] SpringSecurity + JWT 로그인 구현_2
[SpringSecurity] SpringSecurity + JWT 로그인 구현_3
[SpringSecurity] SpringSecurity + JWT 회원가입, 테스트 코드 작성
[번외]JwtAuthorizationFilter에서 상속받을 필터에 대한 고민

 

스터디에서 스프링 시큐리티를 사용한 인증/인가 방식에 JWT를 적용하는 부분을 진행하고 있다.

스터디원 한 분께서 JwtAuthorizationFilter가 상속받는 필터에 대한 질문을 해주셨다.

상속받을 적합한 인증 필터 사용에 대한 고민을 글로 적어보려하고 한다.

 

상속받을 필터 변경

현재 상속받는 필터는 GernerticFilterBean이다.

이는 요청마다 필터를 실행하고, 중복 호출 관리가 안 된다는 단점이 있었다.

구현한 인증 방식에 대한 흐름을 살펴보면 아래와 같다.

 

1. 초기 로그인 & 토큰 발급

클라이언트 : JSON 형식으로 Request Body에 Username/Password 전달

-> 

서버 :  인증 객체 생성 후 Security Context에 저장, JWT 사용자에게 발급(헤더에 저장)

 

2. URL 요청마다 인증

서버 : 헤더로 부터 token값을 읽어와서 유효한지 체크 -> 인증 객체 생성 후 Security Context에 저장

 

인증 시에 위 로직에 적합한 필터를 상속 받으려고 한다.

 

필터 후보의 특성

1. UsernamePasswordAuthenticationFilter

AbstractAuthenticationProcessingFilter의 하위 클래스, 웹 폼기반 로그인 처리를 다루는데 사용한다.

 

2. BasicAuthenticationFilter

OncePerRequestFilter의 하위 클래스, Htttp Basic 인증 처리를 하는 필터이다.

Basic 인증은 클라이언트가 Base64로 인코딩한 사용자명과 패스워드를 'Authorization(인가)' 헤더에 포함하여 요청을 보내는 방식이다.

 

3. GenericFilterBean

주로 단순한 필터 동작을 정의

각 요청마다 필터를 실행하고, 중복 호출 관리가 안 되어 요청마다 여러번 실패할 수 있다.

 

4. OncePerRequestFilter

GenericFilterBean의 하위 클래스, 요청 당 1번만 실행되도록 필터를 생성하기 위해 사용

이는 필터 체인에서 필터의 중복 실행을 방지하는데 도움이 된다.

 

상속받을 필터 결정

1. UsernamePasswordAuthenticationFilter

-> 프로젝트에선 웹 폼 기반 로그인 방식을 사용하지 않고 JSON 값으로 읽기 때문에 상속 받기 적합하지 않다.

 

2. BasicAuthenticationFilter

-> 'Authorization(인가)' 헤더에 포함하여 요청을 보내는 방식 자체는 JWT를 인증 방식에 있어서 유사하지만

HTTP Basic 인증을 위한 것과 헤더는 동일하지만 담기는 값은 다르기 때문에 사용하지 않기로 결정하였다.

 

3. GenericFilterBean

-> 필터의 중복 관리가 안 된다는 점, 연속된 실패로 인해 불필요한 작업이 생기는 것을 생각하면 적합하지 않다.

 

4. OncePerRequestFilter

-> GenericFilterBean의 기능을 상속받고, 중복 호출 방지 기능이 있어 필터의 목적이 JWT 인증에 적합하다고 판단하였다.

그래서 해당 필터를 상속받아 사용하기로 결정하였다.

 

마무리

개발을 하면서 GenericFilterBean이 어떤 역할을 하는지 파악하지 않고 상속을 받아 사용을 했다.

하지만 이 필터를 상속받아야만 하는 이유에 대해 깊게 고민을 하고 사용하는 과정이 필요한 것 같다.

 

이번 시간을 통해 로직의 특성에 맞게 상속 받아오는 클래스가 하는 역할이 무엇인지 정확히 알고,

하위 클래스가 구현할 코드와 더 적합한 클래스를 상속 받아오는 것의 중요성을 느끼게 되었다.

 

 

 

AuthenticationFilter 어떤 필터를 상속받을 것인가?

🧐: UsernamePasswordAuthenticationFilter 상속 받아서 쓰실 예정인가요? 🙋‍♀️: 강사님 코드는 BasicAuthenticationFilter네요? 🧐: 필터 아무거나 써도 되긴 하는데 전 OncePerRequestFilter 썼어요

velog.io