Backend/Spring+Boot

WebClient SSL 설정

findmypiece 2022. 4. 19. 01:35
728x90

SSL 관련 설정은 가장 많이 다뤄지는 것이 핸드쉐이크 타임아웃인데 이는 default 값이 있기도 하고 설정역시 간단하기 때문에 여기에서 다루지 않는다. 여기에서 다룰 것은 자체서명 인증서를 사용하는 서버와 https 통신을 해야할 때 필요한 설정을 정리한다.

 

기본적으로 https 통신에 사용되는 인증서는 ROOT CA에 등록된 인증서여야 한다. ROOT CA는 전문적인 인증서 발급회사 의미하며 https 통신을 제공하려는 서버는 이러한 전문업체에 등록되어 정식 서명된 인증서를 사용해야 한다.

 

당연하게도 이러한 인증서는 관리목적으로 일정비용이 발생하게 되는데 단순히 테스트 목적이라면 굳이 ROOT CA 서명없이 자체서명된 인증서를 사용해도 무방하다.

 

다만 이러한 자체서명된 인증서를 사용할 경우 아래와 같은 화면을 마주하게 된다.

 

이는 결국 해당 서버에서 사용중인 인증서가 전문업체의 인증을 받지 않은 인증서니 접근하는게 위험할 수 있다는 경고이다. 이 화면을 경험했던 사람들은 잘 알겠지만 익스플로러 기준 "이 웹사이트를 계속 탐색합니다" 를 선택하면 그냥 접근할 수 있다. 즉, 위험을 감수하더라도 접근할 수 있는 선택권이 있는 셈이다.

 

브라우저에서는 이렇게 수동으로 접근을 선택할 수 있지만 WebClient 같은 RestClient 에서는 이를 회피하기 위한 별도의 설정이 필요하다. 검증없이 모든 인증서를 신뢰하도록 하는 설정인데 WebClient 기준 구현 방법은 아래와 같다. (핵심은 SslContext 객체다)

@Bean
public WebClient createWebClient() throws SSLException {
    SslContext sslContext = SslContextBuilder
            .forClient()
            .trustManager(InsecureTrustManagerFactory.INSTANCE)
            .build();

    HttpClient httpClient = HttpClient.create()
            .secure(t ->
                    t.sslContext(sslContext));

    return WebClient.builder()
            .clientConnector(new ReactorClientHttpConnector(httpClient))
            .build();
}

 

다만 이 방식은 어쨋든 지정된 보안접근 방식을 임의로 회피하는 것이기 때문에 상용환경에서는 사용하는게 권장되지 않는다. 상용환경이라면 ROOT CA 에 정식 서명된 인증서를 사용해야 하고 인증서 만료될 경우 RestClient 에서도 에러가 발생되는 것이 맞다.

 

https://www.javacodemonk.com/spring-5-webclient-without-ssl-validation-3bd3f518
https://springboot.cloud/19
https://www.amitph.com/spring-webflux-timeouts/#Response_Timeout
https://www.baeldung.com/spring-webflux-timeout
728x90