Jetty를 사용한 Spring WebClient: CONNECT 없는 일반 HTTP 프록시
일반적인 전달 HTTP 요청이 필요할 때 Spring의 Jetty 커넥터를 일치하는 HTTP/1.1 클라이언트 및 프록시 프로토콜과 함께 사용합니다.
Reactor Netty의 HTTP 프록시 핸들러는 일반 HTTP 대상에도 CONNECT 터널을 설정합니다. 의도한 프록시가 대신 일반 HTTP/1.1 전달을 허용한다면 Spring WebClient는 다른 지원 커넥터를 사용할 수 있습니다.
Spring 6.2에서 Jetty 12.0.35의 클라이언트 API와 호환되는 Jetty Reactive Streams 통합을 사용하는 경우:
var jetty = new org.eclipse.jetty.client.HttpClient(
new org.eclipse.jetty.client.transport.HttpClientTransportOverHTTP());
jetty.getProxyConfiguration().addProxy(
new org.eclipse.jetty.client.HttpProxy("proxy.example", 8080));
var client = WebClient.builder()
.clientConnector(new JettyClientHttpConnector(jetty))
.build();
WebClient와 JettyClientHttpConnector는 Spring 클래스입니다. 제공된 Jetty 클라이언트의 시작과 종료는 애플리케이션의 일반적인 수명 주기로 관리하세요.
Jetty의 HTTP/1.1 프록시는 대상과 클라이언트-프록시 프로토콜이 일치할 때 터널 없이 일반 HTTP/1.1 요청을 전달할 수 있습니다. requiresTunnel 정책은 보안 대상과 호환되지 않는 프로토콜 경로에 CONNECT를 사용합니다.
이것은 일반 HTTPS 터널에서 CONNECT를 제거하는 방법이 아닙니다. 대상의 스킴을 올바르게 유지하세요.
명시된 Jetty API에서 addProxy를 사용하세요. getProxies는 변경할 수 없는 목록을 반환하므로 이전 getProxies().add(...) 방식은 현재의 변경 인터페이스가 아닙니다.
허용된 공용 프록시 경로의 공용 HTTP 대상에는 HTTP 프록시 목록이 Jetty 프록시 호스트와 포트의 후보를 제공합니다. 커넥터를 비교할 때 실제 프록시 응답을 읽으세요. 인증, 대상 정책, 사용할 수 없는 대상은 전달 HTTP와 CONNECT 중 선택과 별개입니다.