-
[Spring Security] 응답코드가 200이지만 body 가 비어있을 때, API까지 Request가 도달하지 못할 때(response code 200 but no body)Back End/Spring Security 2021. 12. 8. 20:48
보통 이런 경우는 Filter단에서 Request 나 Response 의 버퍼를 읽어서 내용이 유실된 경우에 발생한다.
하지만 필자가 겪은 현상은 아마 그 누구도 겪지 못한 현상이 아닐까 한다.
전제조건이 필요하기 때문이다. (개발미숙 + Filter 사용 + 이왕 파고드는거 완벽하게 내 것으로 만들고 싶은 주제파악안되는 욕심)
[응답코드가 200인데 body가 비어있고, Request가 API까지 도달도 못하고, 또 수정을 하니 어떤 URL에서는 API까지 도달을 하는데 또 다른 URL에서는 API까지 도달을 못하기도 했다...]
3일에 걸친 디버깅 끝에 원인을 찾은 나 자신이 뿌듯하기도 하고, 절대 잊어버리지 않기 위해 포스팅을 해본다... (찾은것이 신기할 정도...)
와 진짜,,, 왠만한 Security Chain의 구현코드는 직접 다 읽어본 것 같다.. (고생했어...)
# 해당 현상 발생원인 (혹여나 같은 증상으로 오신분들을 위해)
1. Filter단에서 Request 나 Response 의 버퍼를 읽어서 내용이 유실된 경우
2. 커스텀 필터를 만들어놓고 doFilter() 메소드를 실행하지 않은 경우
(doFilter가 FilterChain 횟수만큼 시행되어야 한다.)
3. 커스텀 필터에 조건문등을 달아, doFilter() 호출전에 return 을 넣은 경우
(2번과 같은경우이다. 호출횟수가 충족되지 않는다.)
4. 하나의 커스텀 필터에 doFilter() 를 2번이상 호출한 경우
(API까지 도달하여 원하는대로 body 를 받을 수 있을지는 모르나, 본인이 의도한 로직대로 작동하지 않았을 수 있다.)
+) 커스텀필터는 @Component 어노테이션을 가지고 있거나, FilterChain에 직접 추가한 필터들을 일컫는다.
# 해당 현상에 대한 고찰 (근본적 원인)
아래 포스팅에 설명되어있다 😙
# [3일 증발의 역사...] (주저리주저리)
필자의 주절거림이므로 접어놓겠습니다 ... 😔
더보기1. 이왕이면 Spring Security로 로그인인증을 구현하고 싶었다.
2. 구현과정중 하나도 놓치고싶지않았다.
3. WebSecurityConfig 를 설정하기 시작한다.
4. 많은 난관을 정면돌파한다. (CORS, CSRF 등등..)
5. 본 목적인 JWT를 적용하기 전, 나만의 인증작업을 위해 HttpFilter라는 Custom Filter를 만들어 연습했다. (원인1)
6. 이 후, 구글링 된 예제코드대로 JWT 인증필터를 직접구현하여, addFilterBefore로 UserNamePasswordAuthenticationFilter 앞에 삽입한다.
7. Filter 이기때문에 Spring Security가 관여하는 모든 URL에는 당연히 나의 커스텀필터가 작동한다.
8. 즉, 인증작업이 필요없는 public page 에서 조차도 JWT 토큰을 인증하려한다.
9. 구글링 결과, config 설정에서 http.antMatchers("제외할 URL").permitAll() 을 하라고 한다. (안됬다.)
10. 또 다른 구글링 결과, config 설정에서 오버로딩으로 매개변수를 WebSecurity 를 받아 .ignoring().antMatcher("제외할 URL")을 하라고 한다. (되긴 됬다. 하지만 Spring Security 의 적용을 해당 URL에서 제외한다기에 JWT토큰 인증작업말고도 다른기능도 다 같이 꺼지기에 이 방법은 아니구나 싶어 다른방법을 찾기로 했다. CORS 관련헤더를 또 따로 추가해줘야되서 귀찮았다.)
11. 여러가지 방법을 찾다가 못찾고, 일단 제일 허접한 방법이지만 왠지 될 것만 같은... JWT 필터에서 "제외할 URL"들을 if문으로 걸어 제외 시키는 방법을 일단 해보기로 했다. (원인2)
12. 예상대로 잘 작동하기에 (전혀 나의 예상과는 다르게 작동하고있었다는건 나중에 알았다.), 이제 인증이 필요한 구간(private page)에서 React로 JWT 토큰을 Spring 서버로 실어보내어 인증하는 테스트를 진행하였다.
13. 와...! JWT 필터에 나의 토큰이 잘 도착했어..!!! 200 OK Nice!!!!! 어..? 근데 왜 Body가 없지? (3일 삭제의 시작)
Spring Security를 적용하면서부터 해당현상이 목격되었기에 Spring Security 문제인줄 알고, Security Chain 구성부터 실제 구현코드까지 싹다 정독했다... 결국 Spring Security 의 문제가 아닌, Filter의 동작방식에 대한 문제인 것을 알게되었다.
728x90'Back End > Spring Security' 카테고리의 다른 글