티스토리 뷰

진행 중인 프로젝트에서 OAuth2 검증 필터로 OncePerRequestFilter를 상속 받고 빈으로 등록해 사용 중이다

OncePerRequestFilter가 무엇인지는 밸덩을 참고하자

일반 필터와 다르게 이름 그대로 단일 요청에 대해 필터를 단 한번만 타게끔 해주는 녀석이다

 

 

https://www.baeldung.com/spring-onceperrequestfilter

 

OAuth2 검증 필터 흐름은 아래와 같다

1. 사용자의 쿠키에서 ID 토큰을 꺼내와 JWT 파싱 후, issuer를 확인해 구글 토큰인지 확인한다

2-1. 구글 토큰이 아닐 시 필터 체인에 태워 넘긴다

2-2. 구글 토큰일 시 파싱한 정보를 바탕으로 authentication을 만들어 SecurityContextHolder에 넣어준다

3. 만약 토큰의 만료 시간이 지났다면 갱신 url로 forward를 이용해 넘긴다

  - 이 과정에서 google api로 쏴서 토큰의 유효 정보를 얻어와야 하므로 외부 API 연동이 되는 구간이다

4. 이후 필터 체인에 다시 태워 넘긴다 

 

 

 

요렇게 짰다면 무슨 문제가 발생 하는가?

OncePerRequest는 요청 당 한번 임을 상기하자

이전까지 SecurityConfig에서 WebSecurity 설정을 해주지 않아 css, js, img 등의 정적 자원도 모두 필터를 타버렸다

@EnableWebSecurity에서 옵션으로 debug 속성을 정할 수 있는데 활성화하면 아래 사진과 같이 예쁘장한 로그를 찍어준다

 

 

나는 분명 한 번의 요청만 한거 같은데 콘솔에 이상하리 만치 Security 관련 로그가 넘쳐나는 것을 보고

이게 뭐지 타임을 가진 후 살펴보니 정적 자원들에 대해서도 모두 필터를 타고 있었던 것이다

 

게다가 OAuth2 토큰 검증을 위해 구글로 쏘는 로직마저 모두 타버렸으니

단순한 페이지 이동이었을 뿐인데 리소스 자원을 포함해 약 8-9번 가량의 API를 쏘고 있었다, 구글아 미안해..

외부 API에 RestTemplate을 썼다면 왜케 오래 걸리지 싶었을 법 한데

아이러니하게도  WebClient를 이용해 쏘고 있어서 느린 속도가 체감이 되지 않았다

속도 때문이 아니라 디버깅 시에 filter를 한번 지나쳤음에도 불구하고 계속 잡히는게 의아했고

콘솔 로그를 확인해 API가 대량으로 쏴지는 것을 보고 알게 되었다

 

 

그럼 위와 같이 SecurityConfig에서 web.ignoring() 설정을 잡으면 해결될까?

@Component 혹은 @Bean으로 등록한 필터라면 이 것만으로는 해결되지 않는다

 

 

Custom Filter로 특정 작업을 한다면 shouldNotFilter를 꼭 오버라이드해 써주자

필터 타면 안 되는 경우 - true, 필터 타야 하는 경우 - false 반환해줘야 한다

댓글
링크
글 보관함
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Total
Today
Yesterday