libcurl curl easy options

curl easy options

이지 핸들에서 옵션을 설정하여 전송 방식을 제어하거나 경우에 따라 실제로 옵션을 설정하고 전송이 진행되는 동안 전송 동작을 수정할 수 있습니다. curl_easy_setopt()로 옵션을 설정하고 핸들, 설정하려는 옵션 및 옵션에 대한 인수를 제공합니다. 모든 옵션은 정확히 하나의 인수를 취하며 항상 curl_easy_setopt() 호출에 정확히 세 개의 매개변수를 전달해야 합니다.

curl_easy_setopt() 호출은 수백 가지 다른 옵션을 허용하고 다양한 옵션은 다양한 유형의 인수를 허용하므로 세부 사항을 읽고 특정 옵션이 지원하고 기대하는 인수 유형을 정확히 제공하는 것이 중요합니다. 잘못된 유형을 전달하면 예기치 않은 부작용이 발생하거나 딸꾹질을 이해하기 어려울 수 있습니다.

모든 전송에 필요한 가장 중요한 옵션은 URL입니다. libcurl은 관련된 URL을 알지 못하면 전송을 수행할 수 없으므로 알려야 합니다. URL 옵션 이름은 CURLOPT_URL입니다. 모든 옵션에는 CURLOPT_ 접두어가 붙은 다음 설명이 포함된 이름이 모두 대문자를 사용하기 때문입니다. http://example.com HTTP 콘텐츠를 가져오기 위해 URL을 설정하는 예제 줄은 다음과 같습니다.

1
CURLcode ret = curl_easy_setopt(easy, CURLOPT_URL, "http://example.com");

다시: 이것은 핸들의 옵션만 설정합니다. 실제 전송 또는 기타 작업을 수행하지 않습니다. libcurl에게 문자열을 복사하도록 지시하고 작동하면 OK를 반환합니다.

물론 반환 코드를 확인하여 아무 문제가 없는지 확인하는 것이 좋습니다.

숫자 옵션 설정

curl_easy_setopt()는 3번째 인자가 상황에 따라 다른 타입을 사용할 수 있는 vararg 함수이기 때문에 일반적인 C언어 타입 변환은 불가능하다. 따라서 문서에서 그렇게 말하는 경우 ‘int’가 아닌 ‘long’을 실제로 전달했는지 확인해야 합니다. 크기가 같은 아키텍처에서는 문제가 발생하지 않을 수 있지만 모두가 그렇게 작동하지는 않습니다. 마찬가지로 ‘curl_off_t’ 유형을 허용하는 옵션의 경우 해당 유형을 사용하고 다른 유형을 사용하지 않는 인수를 전달하는 것이 중요합니다.

긴 실행:

1
curl_easy_setopt(handle, CURLOPT_TIMEOUT, 5L); /* 5 seconds timeout */

curl_off_t 시행:

1
2
curl_off_t no_larger_than = 0x50000;
curl_easy_setopt(handle, CURLOPT_MAXFILESIZE_LARGE, no_larger_than);

핸들 옵션 가져오기

이전에 curl_easy_setopt()로 설정한 것과 동일한 정보를 추출하는 일반적인 방법은 없습니다! 이전에 설정한 정보를 다시 추출해야 하는 경우 애플리케이션에서 해당 데이터를 직접 추적하는 것이 좋습니다.

TLS 옵션

이 글을 쓰는 시점에서 libcurl이 SSL과 TLS를 수행하는 방식을 제어하기 위한 전용 curl_easy_setopt에 대해 40가지 이상의 다른 옵션이 있습니다.

TLS를 사용하여 수행된 전송은 안전한 기본값을 사용하지만 curl은 다양한 시나리오 및 설정에서 사용되기 때문에 이러한 동작을 변경하려는 상황이 발생할 가능성이 있습니다.

프로토콜 버전

CURLOPT_SSLVERSIONCURLOPT_PROXY_SSLVERSION을 사용하여 허용되는 SSL 또는 TLS 프로토콜 범위를 지정할 수 있습니다. 전통적으로 SSL 및 TLS 프로토콜 버전은 시간이 지남에 따라 감지되고 사용하기에 부적합한 것으로 밝혀졌으며 curl 자체가 시간이 지남에 따라 기본 낮은 버전을 올리더라도 가장 최신의 보안 프로토콜 버전만 사용하도록 선택할 수 있습니다.

이러한 옵션은 허용 가능한 가장 낮은 버전과 선택적으로 최대값을 사용합니다. 서버가 해당 조건으로 연결을 협상할 수 없으면 전송이 실패합니다.

예시:

1
curl_easy_setopt(easy, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1_2);

프로토콜 세부정보 및 동작

CURLOPT_SSL_CIPHER_LISTCURLOPT_PROXY_SSL_CIPHER_LIST를 설정하여 사용할 암호를 선택할 수 있습니다.

CURLOPT_SSL_FALSESTART를 사용하여 SSL “False Start”를 활성화하도록 요청할 수 있으며 CURLOPT_SSL_OPTIONS를 사용하여 조정할 몇 가지 다른 동작 변경 사항이 있습니다.

확인(Verification)

TLS를 사용하는 클라이언트는 자신이 말하는 서버가 정확하고 신뢰할 수 있는 서버인지 확인해야 합니다. 이것은 서버의 인증서가 curl에 대한 공개 키가 있는 인증 기관(CA)에 의해 서명되었고 인증서에 서버의 이름이 포함되어 있는지 확인하여 수행됩니다. 이러한 검사 중 하나라도 실패하면 전송이 실패합니다.

개발 목적과 실험을 위해 curl을 사용하면 애플리케이션이 서버 또는 HTTPS 프록시에 대한 이러한 검사 중 하나 또는 둘 다를 끌 수 있습니다.

  • CURLOPT_SSL_VERIFYPEER는 인증서가 신뢰할 수 있는 CA에 의해 서명되었는지 확인하는 것을 제어합니다.
  • CURLOPT_SSL_VERIFYHOST는 인증서 내의 이름 확인을 제어합니다.
  • CURLOPT_PROXY_SSL_VERIFYPEERCURLOPT_SSL_VERIFYPEER의 프록시 버전입니다.
  • CURLOPT_PROXY_SSL_VERIFYHOSTCURLOPT_SSL_VERIFYHOST의 프록시 버전입니다.

선택적으로 CURLOPT_PINNEDPUBLICKEY 또는 CURLOPT_PROXY_PINNEDPUBLICKEY를 사용하여 알려진 해시에 대해 인증서의 공개 키를 확인하도록 curl에 지시할 수 있습니다. 여기에서도 불일치로 인해 전송이 실패합니다.

Authentication

TLS 클라이언트 인증서

TLS를 사용하고 서버가 클라이언트에게 인증서를 사용하여 인증하도록 요청할 때 일반적으로 CURLOPT_SSLKEYCURLOPT_SSLCERT를 사용하여 개인 키와 해당 클라이언트 인증서를 지정합니다. 일반적으로 CURLOPT_SSLKEYPASSWD를 사용하여 키의 비밀번호도 설정해야 합니다.

다시 말하지만, CURLOPT_PROXY_SSLKEY, CURLOPT_PROXY_SSLCERT 등 HTTPS 프록시에 대한 연결에 대해 동일한 옵션 세트가 별도로 존재합니다.

TLS 인증

TLS 연결은 보안 원격 암호라는 (거의 사용되지 않는) 기능을 제공합니다. 이것을 사용하여 이름과 암호를 사용하여 서버에 대한 연결을 인증하고 옵션은 CURLOPT_TLSAUTH_USERNAMECURLOPT_TLSAUTH_PASSWORD입니다.

STARTTLS

STARTTLS 방법을 사용하여 TLS(FTP, IMAP, POP3 및 SMTP)로의 연결을 업그레이드하는 프로토콜의 경우 일반적으로 URL을 지정할 때 curl에 비TLS 버전의 프로토콜을 사용하도록 지시한 다음 curl에게 TLS를 활성화하도록 CURLOPT_USE_SSL 옵션으로 요청합니다.

이 옵션을 사용하면 클라이언트가 TLS로 업그레이드할 수 없는 경우 curl을 계속할 수 있지만 제대로 인식하지 못한 채 안전하지 않은 프로토콜을 사용할 수 있으므로 권장하지 않는 경로입니다.

1
2
/* require use of SSL for this, or fail */
curl_easy_setopt(curl, CURLOPT_USE_SSL, CURLUSESSL_ALL);
공유하기