cURL로 HTTP 헤더 전송 방법

웹 스크래핑에서 HTTP 헤더의 힘을 탐구하고, 커스텀 헤더를 효율적으로 전송하는 curl 사용법을 배워 데이터 수집 및 서버 상호작용을 향상시키세요.
1 분 읽기
How to Send HTTP Headers with cURL main blog image

하이퍼텍스트 전송 프로토콜(HTTP)은 클라이언트가 요청을 보내고 서버의 응답을 기다리는 클라이언트-서버 모델을 따르는 상태 비저장 프로토콜입니다. 요청에는 HTTP 메서드, 서버 위치, 경로, 쿼리 문자열, 헤더 등의 세부 정보가 포함됩니다.

HTTP 헤더는 메타데이터와 지시사항 전송을 용이하게 하는 키-값 쌍 형태의 필드 또는 문자열 목록입니다. 콘텐츠 유형, 캐싱 동작, 인증과 같은 매개변수를 정의하는 데 핵심적 역할을 하여 클라이언트와 서버 간의 효율적이고 안전한 상호작용을 보장합니다. 웹 스크래핑에서 HTTP 헤더는 요청을 맞춤 설정할 수 있게 하여 웹 스크레이퍼가 사용자 에이전트를 모방하고, 콘텐츠 협상을 제어하며, 웹사이트 정책 및 프로토콜에 따른 인증을 처리할 수 있게 합니다.

웹 스크래핑에서 HTTP 헤더의 일반적인 사용 사례로는 사용자 에이전트(UA) 또는 응답 유형 변경, 조건부 요청 수행, 애플리케이션 프로그래밍 인터페이스(API) 인증 등이 있습니다.

이 글에서는curl을 사용하여 HTTP 헤더를 보내는 방법을 배울 수 있습니다.

cURL을 사용한 HTTP 헤더 전송

이 튜토리얼을 시작하기 전에 터미널에서 다음 명령어를 실행하여 curl이 운영 체제에 설치되어 있는지 확인하세요:

curl --version

설치되어 있다면 다음과 같이 버전 번호가 출력됩니다:

curl 7.55.1 (Windows) libcurl/7.55.1 WinSSL
Release-Date: [unreleased]
Protocols: dict file ftp ftps http https imap imaps pop3 pop3s smtp smtps telnet tftp
Features: AsynchDNS IPv6 Largefile SSPI Kerberos SPNEGO NTLM SSL

curl은 내부 또는 외부 명령, 실행 가능한 프로그램 또는 배치 파일로 인식되지 않습니다” 또는 “명령을 찾을 수 없습니다“와 같은 오류 메시지가 표시되면curl을 설치해야 합니다.

또한httpbin.org와 같은 헤더를 검사할 수 있는 도구도 필요합니다. httpbin.org는 간단한 HTTP 요청 및 응답 서비스입니다.

curl을 사용해 본 적이 있다면 curl 구문이 다음과 같다는 것을 알 수 있습니다:

curl [옵션] [URL]

즉, mywebpage.com에서 웹 페이지를 다운로드하려면 다음 명령을 실행해야 합니다:

curl www.mywebpage.com

cURL 헤더

httpbin.org를 사용하여 curl이 전송한 헤더를 확인하려면 명령줄을 열고 다음을 실행하세요:

curl http://httpbin.org/headers

출력 결과에는 헤더 목록이 포함됩니다:

{
  "headers": {
    "Accept": "*/*",
    "Host": "httpbin.org",
    "User-Agent": "curl/7.55.1",
    "X-Amzn-Trace-Id": "Root=1-65fd2eb0-0617353714d52f3777c9c267"
  }

Accept, Host, User-Agent 헤더는 curl에서 기본적으로 전송됩니다.

Accept 헤더는 클라이언트가 수용할 수 있는 미디어 유형을 서버에 알립니다. 클라이언트가 수용할 의사가 있는 콘텐츠 유형을 서버에 전달하여 클라이언트와 서버 간의 콘텐츠 협상을 가능하게 합니다.

클라이언트가 JSON을 선호함을 나타내는 Accept 헤더는 다음과 같습니다:

Accept: application/json

User-Agent 필드에는 클라이언트 정보가 포함됩니다. 이 경우 버전 7.55.1을 실행 중인 curl 애플리케이션입니다(이 버전 번호는 사용 중인 버전과 일치할 것입니다).

Host 헤더는 HTTP 요청이 전송되는 웹 도메인(, 호스트)과 포트를 고유하게 식별합니다. 요청에 포트가 포함되지 않은 경우 기본값(, HTTP의 경우 포트 80, HTTPS의 경우 포트 443)이 가정됩니다.

X-Amzn-Trace-Id는 출력된 헤더 중 유일하게 기본 헤더가 아닌 항목입니다. 이 헤더는 요청이 AWS 로드 밸런서와 같은 Amazon Web Services(AWS) 서비스로 전송되었음을 나타내며, HTTP 요청 추적에 활용될 수 있습니다.

이러한 헤더가 curl에 의해 기본적으로 전송되었는지 확인하려면 verbose 모드를 사용할 수 있습니다. 해당 플래그는 -v 또는 --verbose이며, 헤더를 포함한 요청 및 응답에 대한 상세 정보를 표시합니다.

curl이 전송하는 기본 헤더를 확인하려면 다음 명령을 실행하세요:

curl -v http://httpbin.org/headers

출력 결과는 다음과 같아야 합니다:

*   Trying 50.16.63.240...
* TCP_NODELAY set
* Connected to httpbin.org (50.16.63.240) port 80 (#0)
> GET /headers HTTP/1.1
> Host: httpbin.org
> User-Agent: curl/7.55.1
> Accept: */*
>
< HTTP/1.1 200 OK
< Date: Fri, 22 Mar 2024 07:18:00 GMT
< Content-Type: application/json
< Content-Length: 173
< Connection: keep-alive
< Server: gunicorn/19.9.0
< Access-Control-Allow-Origin: *
< Access-Control-Allow-Credentials: true
<
{
  "headers": {
    "Accept": "*/*",
    "Host": "httpbin.org",
    "User-Agent": "curl/7.55.1",
    "X-Amzn-Trace-Id": "Root=1-65fd30a8-624365ad52781957578cd5b1"
  }
}
* 호스트 httpbin.org에 대한 연결 #0은 그대로 유지됨

> 기호가 있는 줄은 클라이언트(curl)가 엔드포인트로 보낸 내용을 보여줍니다. 이 출력은 다음 헤더가 전송되었음을 확인합니다:

  • 엔드포인트/헤더에 대한GET(HTTP 메서드)
  • Host:httpbin.org
  • User-Agent:curl/7.55.1
  • Accept*/*

출력에서 < Content-Type: application/json과 같이 작은보다 기호( <)가 있는 줄은 귀하가 보낸 헤더를 반영한 것입니다.

-H 플래그를 사용하여 기본 헤더 변경

-H 또는 --header 플래그는 서버에 사용자 정의 헤더를 전달하는 데 사용되며 테스트 용도로도 사용할 수 있습니다.

예를 들어, User-Agentcurl/7.55.1 에서 Your-New-User-Agent로 변경하려면 다음 명령을 사용하십시오:

curl -H "User-Agent: Your-New-User-Agent" http://httpbin.org/headers

출력 결과는 다음과 같습니다:

{
  "headers": {
    "Accept": "*/*",
    "Host": "httpbin.org",
    "User-Agent": "Your-New-User-Agent",
    "X-Amzn-Trace-Id": "Root=1-65fd5123-3ebe566a4681427c6996c72c"
  }
}

모든 유형의 콘텐츠를 허용하는 */* Accept 헤더를 JSON 형식의 콘텐츠만 허용하는 application/json으로 변경하려면 다음 명령을 사용하세요:

curl --header "Accept: application/json" http://httpbin.org/headers

출력 결과는 다음과 같습니다:

{
  "headers": {
    "Accept": "application/json",
    "Host": "httpbin.org",
    "User-Agent": "curl/7.55.1",
    "X-Amzn-Trace-Id": "Root=1-65fd55c3-05c21f81770c1c5e6343b1fc"
  }
}

참고: 두 번째 예시에서는 -H 대신 --header를 사용했습니다. --header와 -H는 상호 교환 가능하며 동일한 기능을 수행합니다.

curl 버전 7.55.0부터는 헤더가 포함된 파일을 전달할 수도 있습니다. 예를 들어, 헤더가 포함된 파일의 이름이 header_file인 경우, 다음 명령어를 사용하여 헤더가 포함된 파일을 전달할 수 있습니다:

Curl -H @header_file

사용자 정의 헤더 전송

사용자 정의 헤더는 개발자가 정의하며, 표준 헤더가 제공하는 정보 외에 HTTP 요청에 대한 추가 정보를 포함합니다.

curl로 사용자 정의 헤더를 전송하려면 -H 플래그를 사용합니다. 예를 들어, 값 custom header를 가진 My-Custom-Header 라는 사용자 정의 헤더를 전송하려면 다음 명령을 실행합니다:

curl -H "My-Custom-Header: Value of custom header" http://httpbin.org/headers

출력 결과는 다음과 같습니다:

{
  "headers": {
    "Accept": "*/*",
    "Host": "httpbin.org",
    "My-Custom-Header": "Value of custom header",
    "User-Agent": "curl/7.55.1",
    "X-Amzn-Trace-Id": "Root=1-65fd7d2a-3b683be160ff2965023b3a31"
  }
}

빈 헤더 전송

특정 API 요구사항을 준수하기 위해 콘텐츠가 없더라도 특정 헤더를 반드시 전송해야 하는 경우처럼 빈 헤더를 전송해야 하는 시나리오가 있습니다. 예를 들어,HTTP Strict Transport Security(HSTS) 헤더는웹사이트에서 안전한 HTTPS 연결을 강제 적용하는 데 사용됩니다. 이 헤더는 일반적으로 HSTS 기간 및 동작에 대한 지시 사항을 포함하지만, 빈 값으로 전송하면 HSTS가 즉시 적용됩니다.

빈 헤더는 헤더를 지우거나 재설정하는 데도 사용할 수 있습니다. 예를 들어, 이전에 기본값으로 설정된 헤더를 재설정하거나 지우고 싶다면 빈 헤더를 전송하여 해당 헤더의 값을 지울 수 있습니다.

curl로 빈 헤더를 전송하려면 헤더 이름 뒤에 빈 값을 나타내는 세미콜론을 지정해야 합니다. 다음 명령어는 My-Custom-Header라는 빈 사용자 정의 헤더를 전송하는 방법을 보여줍니다:

curl -H "My-Custom-Header;" http://httpbin.org/headers

출력 결과는 빈 값을 가진 My-Custom-Header를 보여줍니다:

{
  "headers": {
    "Accept": "*/*",
    "Host": "httpbin.org",
    "My-Custom-Header": "",
    "User-Agent": "curl/7.55.1",
    "X-Amzn-Trace-Id": "Root=1-65fd84e2-7a42d9d62a42741e448c426f"
  }
}

헤더 제거

curl로 헤더를 제거하려면 헤더 이름 뒤에 값 없이 콜론을 지정해야 합니다.

예를 들어 기본 User-Agent 헤더를 제거하려면 다음 명령을 전송하세요:

curl -H "User-Agent:" http://httpbin.org/headers

응답에는 User-Agent 헤더가 포함되지 않아 헤더가 제거되었음을 확인할 수 있습니다:

{
  "headers": {
    "Accept": "*/*",
    "Host": "httpbin.org",
    "X-Amzn-Trace-Id": "Root=1-65fd862d-13b181583501ae11046374a1"
  }
}

여러 헤더 전송

지금까지 하나의 헤더만 포함하는 예제를 살펴보았지만, curl을 사용하면 여러 헤더를 동시에 전송할 수 있습니다. -H 플래그를 여러 번 포함하기만 하면 됩니다.

예를 들어, 두 개의 헤더(Custom-Header-1Custom-Header-2)를 각각 값 one과 two로 전송하려면 다음 명령을 실행하세요:

curl -H "Custom-Header-1: one" -H "Custom-Header-2: two" http://httpbin.org/headers

출력 결과는 다음과 같습니다:

{
  "headers": {
    "Accept": "*/*",
    "Custom-Header-1": "one",
    "Custom-Header-2": "two",
    "Host": "httpbin.org",
    "User-Agent": "curl/7.55.1",
    "X-Amzn-Trace-Id": "Root=1-65fd8781-143be3502c559bc5605fc6f1"
  }
}

결론

이 글에서는 HTTP 헤더와 curl을 사용해 HTTP 헤더를 전송하는 방법을 알아보았습니다.

포괄적인 웹 스크래핑 솔루션을 찾고 계시다면Bright Data를 사용해 보세요. 익명성을 보장하고 IP 차단을 방지하는프록시 서비스와 CAPTCHA 없이 지역 제한 콘텐츠에 접근할 수 있도록 도와주는Web Unlocker 같은 도구와 서비스를 제공합니다.

지금 바로 무료 체험을 시작하세요!