Home

Published

- 3 min read

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

img of [ 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를 받을 수 있는걸 확인할 수 있었다. 권한이 있던, 허용하건 그걸 인증을 해주지 않아서 생겼던 문제였다.

정리하며

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