452 단어
2 분
[ TroubleShooting ] 200은 뜨는데, Response가 제대로 반환이 안될 때

개요#

지금 개발하고 있는 채팅 플랫폼의 유저 서버에서 오류가 발생했다. 로그인을 제외한 나머지 api의 response가 오지 않는 이슈가 있었다.

(5시간을 넘게 디버깅하다 원인을 발견했다.)

원인#

Spring Security 문제였다. 이상하게 login은 json이 정상적으로 전달되는데 login을 제외한 다른 json들이 정상적으로 전달되지 않았다.

그래서 필터에서 /member/join 이 아닌 /member/** 로 대체하고 api 를 보내보니

짜잔. SecurityFilterChain 문제였다. 여기서 SecurityFIlterChain의 어느 부분이 문제인지를 확인해야 했다. 이 이후에 5시간을 추가 디버깅했다. 기존의 시큐리티 로그를 더 찍고, breakpoint도 이곳 저곳 다 설정해서 다 돌려봤는데, 더 자세한 원인을 찾지 못했다. 그러다가! 기존에 SpringSecurity 버젼 6으로 업그레이드하기 전의 코드를 보다가 차이점을 하나 발견했다.

SpringSecurity 6 이전 코드#

.authorizeRequests()
.requestMatchers(CorsUtils::isPreFlightRequest).permitAll()
.antMatchers(PERMIT_URL_ARRAY).permitAll()
.antMatchers("/api/**").hasAnyAuthority(RoleType.USER.getCode())
.antMatchers("/api/**/admin/**").hasAnyAuthority(RoleType.ADMIN.getCode())
.anyRequest().authenticated()

SpringSecurity 6 코드#

http.authorizeHttpRequests((authorizeHttp)-> authorizeHttp
        .requestMatchers(CorsUtils::isPreFlightRequest).permitAll()
        .requestMatchers(PERMIT_URL_ARRAY).permitAll()
        .requestMatchers("/api/v1/admin/**").hasAnyAuthority(RoleType.ADMIN.getCode())
        .requestMatchers("/api/v1/**").hasAnyAuthority(RoleType.USER.getCode())
);

문제 해결#

차이점이 딱 하나 있었다. .anyRequest().authenticated() 하… 이걸 추가하니 제대로 response를 받을 수 있는걸 확인할 수 있었다. 권한이 있던, 허용하건 그걸 인증을 해주지 않아서 생겼던 문제였다.

정리하며#

정말 간단한 문제였지만 해결하는데 너무 오래 걸린 문제였다. (버젼업할 때는 신중하게…) 그래도 버그를 찾는 방향성을 제대로 잡았다는 점에서 매우 만족스러운 트러블슈팅이었다.

[ TroubleShooting ] 200은 뜨는데, Response가 제대로 반환이 안될 때
https://blog-full-of-desire-v3.vercel.app/posts/retrospect/troubleshooting-200--response----/
저자
SpeculatingWook
게시일
2024-07-16
라이선스
CC BY-NC-SA 4.0