사용자 도구

사이트 도구


java:httpclient

Java HttpClient

주의

성능 이슈

  • Java 17 미만 버전의 Http Client 는 synchronized 블록이 있어서 일부 상황에서 멀티 쓰레드에서 동시 호출시 문제 발생소지가 있음. Java 17 이상에서는 괜찮음.

일부 헤더가 사라지는 문제

  • 일부 헤더(connection, content-length, expect, host, upgrade)가 사라지는 현상이 발생한다.
  • 보안을 위해 sec-로 시작되는 헤더도 삭제한다.
  • 이것은 문제는 아니고, 의도된 것인데 System Property 를 지정해주면된다. 호출이 일어날 때마다 프라퍼티 확인(Java 16 이후버전)
# 대소문자 안 가림
jdk.httpclient.allowRestrictedHeaders=host,content-length
# sec- 헤더는 이것만으로는 해결이 안됨.
  • 헌데, java.net.HttpURLConnection 를 구현한 sun.net.www.protocol.http.HttpURLConnection구현체에 따르면 sun.net.http.allowRestrictedHeaders=true 이면 무조건 모든 헤더를 사용 가능하게 허가함. sec- 도 허가됨.

SSL 에서 memory leak

인증 / Authentication

HttpClient client = HttpClient.newBuilder()
  .authenticator(new Authenticator() {
      @Override
      protected PasswordAuthentication getPasswordAuthentication() {
          return new PasswordAuthentication("<사용자명>", "<비번>".toCharArray());
      }
  })
  .build();
// header 직접 설정방식
private static final String getBasicAuthenticationHeader(String username, String password) {
    String valueToEncode = username + ":" + password;
    return "Basic " + Base64.getEncoder().encodeToString(valueToEncode.getBytes());
}
 
HttpRequest request = HttpRequest.newBuilder()
  .GET()
  .uri(new URI("https://postman-echo.com/basic-auth"))
  .header("Authorization", getBasicAuthenticationHeader("<사용자명>", "<비번>"))
  .build();

Connection Pool

HttpRequestBuilder

  • header(key, value) : 헤더를 추가한다.
  • setHeader(key, value) : 헤더를 추가하면서 기존값이 있으면 덮어쓴다.

Proxy

System 설정값 따르기

HttpClient.newBuilder()
      .proxy(ProxySelector.getDefault())
      .build();

명시적 지정

HttpClient client = HttpClient.newBuilder()
      .proxy(ProxySelector.of(new InetSocketAddress("www-proxy.com", 8080)))
      .build();

참조

java/httpclient.txt · 마지막으로 수정됨: 2023/11/28 10:44 저자 kwon37xi