-
[Spring] WebClient 사용시 http:// 프로토콜이 https:/로 자동 변환되는 이슈Spring 2023. 4. 7. 10:54
이슈가 되었던 상황
- 스프링에서 서버간 통신을 사용 할 때 WebClient를 사용
- WebClient를 메서드를 빈에 등록할 때 baseUrl을 집어 넣지 않고 사용하는 WebClient를 사용하는 곳에서 uri에 모든 서버 주소 호출에 재활용
WebClient 메서드를 다음과 같이 빈으로 등록
@Configuration public class WebClientConfig { @Bean public WebClient webClient() { return WebClient.builder() .defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) .build(); } }
빈에 등록되어 있는 WebClient 메서드 사용
@RequiredArgsConstructor @Service public class WebClientService { @Value("https://auth.galaxy.com") private String AuthServer; @Value("https://talk.galaxy.com") private String TalkServer; private final WebClient webClient; public Boolean requestAuthServer(long userId, String jwt) { return webClient .get() .uri(builder -> builder .path(AuthServer + "/{ChannelId}/user/{uerId}/authorization") .build(channelId, userId)) .header(HEADER_AUTHORIZATION, jwt) .retrieve() .bodyToMono(Boolean.class) .block(); } private Mono<String> requestTalkServer(PublishDto publishReq) { return webClient .post() .uri(TalkServer + "/list") .bodyValue(publishReq) .retrieve() .bodyToMono(String.class); } }
talk 서버로 요청은 문제가 없는데 auth 서버 서버로 요청이 계속 실패하는 이슈가 생겼습니다.
이슈 원인
- requestAuthServer 메서드에서 uri에 builder.path 에 프로토콜 부터 전체 주소를 넣었더니 https:// -> https:/ 슬래시가 하나 없어지는 현상 발생
- uri path builder 에서 // 를 / 로 변경 (path에는 //가 들어가지 않기 때문에 사용자의 에러로 생각하여 /로 바꿔 주는듯)
해결
baseUrl이 다른 webClient 메서드를 각각 빈으로 등록
@Configuration @Slf4j public class WebClientConfig { @Value("https://auth.galaxy.com") private String AuthServer; @Value("https://talk.galaxy.com") private String TalkServer; @Bean public WebClient webClientToAuth() { return WebClient.builder() .baseUrl(AuthServer) .defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) .build(); } @Bean public WebClient webClientToTalk { return WebClient.builder() .baseUrl(TalkServer) .defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) .build(); } }
WebClient 사용시에 uri에 baseUrl을 넣지 않고 path variable과 query parameter만 넣음
@RequiredArgsConstructor @Service public class WebClientService { @Value("https://auth.galaxy.com") private String AuthServer; @Value("https://talk.galaxy.com") private String TalkServer; private final WebClient webClientToAuth; private final WebClient webClientToTalk; public Boolean requestAuthServer(long userId, String jwt) { return webClientToAuth .get() .uri(builder -> builder .path("/{ChannelId}/user/{uerId}/authorization") .build(channelId, userId)) .header(HEADER_AUTHORIZATION, jwt) .retrieve() .bodyToMono(Boolean.class) .block(); } private Mono<String> requestTalkServer(PublishDto publishReq) { return webClientToTalk .get() .uri("/list") .bodyValue(publishReq) .retrieve() .bodyToMono(String.class); } }
uri builder에 프로토콜 (https://)이 들어가지 않기 때문에 이중 슬래시가 한개로 바뀌는 케이스가 생긱지 않아서 정상적으로 서비스 호출이 되었음
'Spring' 카테고리의 다른 글