libcurl Proxies

프록시

네트워크 컨텍스트에서 프록시는 중개자, 즉 클라이언트인 귀하와 통신하려는 원격 서버 사이에 있는 서버입니다. 클라이언트는 중간 사람에게 연락한 다음 계속해서 원격 서버에 연락합니다.

이 스타일의 프록시 사용은 회사와 조직에서 사용하는 경우가 있으며, 이 경우 일반적으로 대상 서버에 도달하기 위해 사용해야 합니다.

프록시와 통신할 때 사용할 여러 종류의 프록시와 프로토콜이 있으며 libcurl은 가장 일반적인 몇 가지 프록시 프로토콜을 지원합니다. 프록시에 사용되는 프로토콜이 원격 서버에 사용되는 프로토콜과 반드시 같지는 않다는 점을 인식하는 것이 중요합니다.

libcurl로 전송을 설정할 때 프록시의 서버 이름과 포트 번호를 지적해야 합니다. 여러분이 즐겨 사용하는 브라우저가 libcurl보다 약간 더 고급 방식으로 이 작업을 수행할 수 있다는 것을 알게 될 것입니다. 이러한 세부 사항은 이후 섹션에서 다룰 것입니다.

프록시 유형

libcurl은 SOCKS 및 HTTP 프록시의 두 가지 주요 프록시 유형을 지원합니다. 보다 구체적으로, 원격 이름 조회가 있거나 없는 SOCKS4 및 SOCKS5와 로컬 프록시에 대한 HTTP 및 HTTPS를 모두 지원합니다.

말하는 프록시의 종류를 지정하는 가장 쉬운 방법은 프록시 호스트 이름 문자열(CURLOPT_PROXY)의 구성표 부분을 일치하도록 설정하는 것입니다.

1
2
3
4
5
6
socks4://proxy.example.com:12345/
socks4a://proxy.example.com:12345/
socks5://proxy.example.com:12345/
socks5h://proxy.example.com:12345/
http://proxy.example.com:12345/
https://proxy.example.com:12345/
  • socks4 - 로컬 이름 확인이 있는 SOCKS4를 의미합니다.
  • socks4a - 프록시 이름이 확인되는 SOCKS4를 의미합니다.
  • socks5 - 로컬 이름 확인이 있는 SOCKS5를 의미합니다.
  • socks5h - 프록시 이름이 확인되는 SOCKS5를 의미합니다.
  • http - 프록시가 항상 이름을 확인할 수 있도록 하는 HTTP를 의미합니다.
  • https - 프록시에 대한 HTTPS를 의미하며 항상 프록시가 이름을 확인할 수 있습니다(HTTPS 프록시 지원은 최근 curl 7.52.0에 추가되었으며 OpenSSL, GnuTLS 및 NSS와 같은 TLS 라이브러리의 하위 집합에서만 작동합니다. )

CURLOPT_PROXYTYPE을 사용하여 호스트 이름만 설정하려는 경우 별도의 옵션으로 프록시 유형을 설정하도록 선택할 수도 있습니다. 마찬가지로 CURLOPT_PROXYPORT와 함께 사용할 프록시 포트 번호를 설정할 수 있습니다.

로컬 또는 프록시 이름 조회

위의 섹션에서 서로 다른 프록시 설정을 통해 전송에 관련된 다른 당사자가 이름 확인을 수행할 수 있음을 알 수 있습니다. 여러 경우에 클라이언트가 서버 호스트 이름을 확인하고 연결할 프록시에 IP 주소를 전달하도록 할 수 있습니다. 물론 이름 조회가 클라이언트 시스템에서 정확하게 작동한다고 가정합니다. 프록시가 이름을 확인하도록 합니다. 연결할 IP 주소로 변환합니다.

HTTP 또는 HTTPS 프록시를 사용하는 경우 항상 확인할 프록시에 이름을 지정합니다.

어떤 프록시?

네트워크 연결에서 목적지에 도달하기 위해 프록시를 사용해야 하는 경우, 이를 파악하고 올바른 프록시를 사용하도록 libcurl에 알려야 합니다. libcurl에서는 프록시를 자동으로 파악하거나 감지하도록 지원하지 않습니다.

브라우저를 사용할 때 프록시에 PAC 스크립트 또는 기타 수단을 제공하는 것이 일반적이지만 libcurl에서는 그 중 어느 것도 인식하지 못합니다.

프록시 환경 변수

프록시 옵션이 설정되지 않은 경우 libcurl은 프록시가 사용되도록 요청되었는지 확인하기 위해 전송을 수행하기 전에 특별히 명명된 환경 변수의 존재를 확인합니다.

프록시 호스트 이름을 보유하도록 [scheme]_proxy라는 변수를 설정하여 프록시를 지정할 수 있습니다(호스트를 -x로 지정하는 것과 동일한 방식). 따라서 HTTP 서버에 접근할 때 프록시를 사용하도록 curl에 지시하려면 ‘http_proxy’ 환경 변수를 설정합니다. 이와 같이:

1
http_proxy=http://proxy.example.com:80

위의 프록시 예제는 HTTP용이지만 물론 프록시하려는 특정 프로토콜에 대해 ftp_proxy, https_proxy 등을 설정할 수도 있습니다. http_proxy를 제외한 이러한 모든 프록시 환경 변수 이름은 HTTPS_PROXY와 같이 대문자로 지정할 수도 있습니다.

모든 프로토콜을 제어하는 단일 변수를 설정하기 위해 ALL_PROXY가 존재합니다. 특정 프로토콜 변수가 있는 경우 해당 변수가 우선 적용됩니다.

환경 변수를 사용하여 프록시를 설정할 때 하나 또는 몇 개의 호스트 이름이 프록시를 통과하지 못하도록 제외되어야 하는 상황에 쉽게 도달할 수 있습니다. 이것은 NO_PROXY 변수 또는 해당 CURLOPT_NOPROXY libcurl 옵션을 사용하여 수행할 수 있습니다. 액세스할 때 프록시를 사용하지 않아야 하는 쉼표로 구분된 호스트 이름 목록으로 설정합니다. 모든 호스트와 일치하도록 NO_PROXY를 단일 별표(‘*’)로 설정할 수 있습니다.

HTTP 프록시

HTTP 프로토콜은 HTTP 프록시를 사용하는 방법에 대해 자세히 설명합니다. 실제 원격 서버에 요청을 보내는 대신 클라이언트(libcurl)는 대신 프록시에 특정 리소스를 요청합니다. HTTP 프록시에 대한 연결은 암호화되지 않은 일반 HTTP를 사용하여 이루어집니다.

HTTPS 리소스가 요청되면 libcurl은 대신 프록시에 CONNECT 요청을 발행합니다. 이러한 요청은 프록시를 통해 터널을 열어 데이터를 이해하지 못한 채 전달합니다. 이런 식으로 libcurl은 HTTP 프록시가 있는 경우에도 안전한 종단 간 TLS 연결을 설정할 수 있습니다.

HTTP 프록시를 통해 비 HTTP 프로토콜을 프록시할 수 있지만 이는 대부분 CONNECT 메서드를 통해 데이터를 터널링하여 수행되기 때문에 클라이언트가 다른 특정 원격 포트 번호에 연결할 수 있도록 프록시를 구성해야 합니다. 많은 HTTP 프록시는 80 및 443 이외의 다른 포트 번호에 대한 연결을 금지하도록 설정됩니다.

HTTPS 프록시

HTTPS 프록시는 HTTP 프록시와 유사하지만 클라이언트가 보안 HTTPS 연결을 사용하여 연결할 수 있습니다. 이 경우에도 프록시 연결은 원격 사이트와의 연결과 분리되어 있으므로 원격 사이트에 대한 HTTPS는 프록시에 대한 HTTPS 연결을 통해 터널링되므로 libcurl은 별도의 프록시 연결에 대한 전체 TLS 옵션 집합을 제공합니다. 원격 호스트에 대한 연결에서.

예를 들어, CURLOPT_PROXY_CAINFOCURLOPT_CAINFO가 원격 호스트를 위한 것과 같은 HTTPS 프록시의 기능입니다. CURLOPT_PROXY_SSL_VERIFYPEERCURLOPT_SSL_VERIFYPEER 등의 프록시 버전입니다.

HTTPS 프록시는 오늘날에도 여전히 조직과 회사에서 상당히 이례적입니다.

프록시 인증

프록시를 사용한 인증은 프록시 자체와의 핸드셰이크 협상에서 유효한 자격 증명을 제공해야 함을 의미합니다. 프록시 인증은 원격 호스트와의 가능한 인증 또는 인증 부족에 추가 및 분리됩니다.

libcurl은 HTTP, HTTPS 및 SOCKS5 프록시를 통한 인증을 지원합니다. 핵심 옵션은 CURLOPT_PROXY 문자열 내에서 설정하지 않는 한 사용할 사용자 이름과 암호를 설정하는 CURLOPT_PROXYUSERPWD입니다.

HTTP 프록시 헤더

HTTP 또는 HTTP 프록시를 사용하여 libcurl은 헤더 세트를 포함하는 프록시에 요청을 발행합니다. 물론 애플리케이션은 서버로 보낸 요청과 마찬가지로 헤더를 수정할 수 있습니다.

libcurl은 서버에 별도의 요청이 전송될 때 프록시로 전송되는 헤더를 제어하기 위해 CURLOPT_PROXYHEADER를 제공합니다. 이는 일반적으로 프록시를 통해 터널을 설정하기 위해 프록시로 전송된 초기 CONNECT 요청을 의미합니다.

공유하기