ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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://)이 들어가지 않기 때문에 이중 슬래시가 한개로 바뀌는 케이스가 생긱지 않아서 정상적으로 서비스 호출이 되었음

Designed by Tistory.