command-line Uniform Resource Locator
client for URLs
오늘의 주제는 cURL이다. 소개하는 글 마다 조금씩 달랐으나, 일단은 명령줄 상에서 데이터 전송을 수행하기 위한 라이브러리/커맨드 라인 도구를 제공하는 소프트웨어(tool)이다. 지난번 수행한 "서비스 포트 스캐너 구현하기" 프로젝트가 마무리된 후, 피드백 시간에 포트 스캔을 위한 방법 중 하나로 제시받은 바 있어 조사를 결심하게 되었다.
cURL(Command-line URL)은 다양한 프로토콜을 지원하며 데이터 전송을 처리할 수 있는 명령줄 기반 도구이다. 주로 HTTP/HTTPS 요청을 테스트하거나 API 호출, 파일 다운로드와 업로드, 서버 상태 확인 등에 사용된다. cURL은 간단한 명령으로 복잡한 요청을 수행할 수 있어, 개발자와 시스템 관리자가 애용하는 도구 중 하나다.
cURL은 다음과 같은 프로토콜을 지원하며, 각각의 프로토콜에 대해 특정 명령어 옵션을 제공한다.(혹시 추가할 사항이나 변경점이 있다면 댓글 부탁합니다~)
프로토콜 | 설명 |
---|---|
HTTP/HTTPS | 웹 요청/응답 처리 및 REST API 호출에 주로 사용 |
FTP/SFTP | 파일 전송 프로토콜. FTP 서버에서 파일 업로드 및 다운로드 가능 |
SMTP | 이메일 전송 프로토콜. 이메일 전송 및 SMTP 서버 테스트에 사용 |
SCP | 보안 복사 프로토콜로, SSH를 통해 파일을 전송 |
LDAP | Lightweight Directory Access Protocol. 디렉토리 서비스와의 상호작용에 사용 |
curl https://jsonplaceholder.typicode.com/posts/1
cURL은 대부분의 운영 체제에 기본적으로 설치되어 있다. 만약 없는 경우, 아래 명령어를 통해 설치할 수 있다. 그러고 보니까 난 없던 거 같은데... WSL이라 그런가
sudo apt update
sudo apt install curl
brew install curl
위의 공식 사이트에서 다운로드 받기!
cURL은 HTTP 요청을 테스트하거나 서버 응답을 확인하는 데 유용하다. 아래는 기본적인 HTTP 요청 명령어 예시다.
curl https://jsonplaceholder.typicode.com/posts/1
{
"userId": 1,
"id": 1,
"title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
"body": "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto"
}
진짜 저렇게 나온다... 무슨 뜻일까
HTTP 응답 헤더만 확인하려면 -I
옵션을 사용한다.
curl -I https://www.example.com
HTTP/1.1 200 OK
Date: Wed, 29 Nov 2024 08:00:00 GMT
Content-Type: text/html; charset=UTF-8
cURL은 RESTful API 요청을 테스트하는 데 필수적인 도구로, 다양한 HTTP 메서드를 지원한다.
서버에 데이터를 전송하려면 -X POST
와 -d
옵션을 사용한다.
curl -X POST https://jsonplaceholder.typicode.com/posts \
-H "Content-Type: application/json" \
-d '{"title": "foo", "body": "bar", "userId": 1}'
{
"id": 101,
"title": "foo",
"body": "bar",
"userId": 1
}
데이터를 업데이트할 때는 -X PUT
을 사용한다.
curl -X PUT https://jsonplaceholder.typicode.com/posts/1 \
-H "Content-Type: application/json" \
-d '{"title": "updated title", "body": "updated body"}'
데이터를 삭제하려면 -X DELETE
를 사용한다.
curl -X DELETE https://jsonplaceholder.typicode.com/posts/1
cURL은 다양한 옵션을 제공하여 요청을 커스터마이징할 수 있다.
-H
옵션을 사용해 HTTP 요청 헤더를 추가할 수 있다.
curl -H "Authorization: Bearer YOUR_TOKEN" https://api.example.com/secure-data
-u
옵션으로 사용자 이름과 비밀번호를 제공한다.
curl -u username:password https://api.example.com/login
--cookie
옵션을 사용하여 쿠키를 전송한다.
curl --cookie "session_id=abcd1234" https://www.example.com/profile
cURL은 파일 다운로드와 업로드를 간단한 명령어로 처리할 수 있다.
curl -O https://www.example.com/file.zip
curl -X POST https://www.example.com/upload \
-F "file=@/path/to/localfile.txt"
c.f.
@
기호는 로컬 파일 경로를 지정하는 데 사용
cURL은 REST API 호출에서 JSON 데이터를 다루는 데 매우 유용하다. POST, PUT 요청을 통해 JSON 데이터를 전송하거나, GET 요청을 통해 JSON 응답을 받을 수 있다.
아래 명령은 Content-Type
헤더를 JSON으로 설정하고, JSON 데이터를 API에 전송한다.
curl -X POST https://jsonplaceholder.typicode.com/posts \
-H "Content-Type: application/json" \
-d '{"title": "foo", "body": "bar", "userId": 1}'
{
"id": 101,
"title": "foo",
"body": "bar",
"userId": 1
}
curl https://jsonplaceholder.typicode.com/posts/1 | jq
HTTPS 요청은 기본적으로 SSL/TLS 인증서를 통해 보안을 보장한다. 그러나 인증서 유효성 검증이 필요한 경우가 있으므로, 이 경우에 대해서 알아보자.
인증서 검증 문제를 해결하지 못할 경우, -k
옵션을 사용하여 이를 비활성화할 수 있다.
curl -k https://self-signed.badssl.com/
--cert
옵션을 사용해 특정 인증서를 제공한다.
curl --cert /path/to/cert.pem https://secure.example.com/
신뢰할 수 있는 CA 인증서를 수동으로 제공하려면 --cacert
옵션을 사용한다.
curl --cacert /path/to/ca-bundle.crt https://secure.example.com/
cURL은 데이터 스트리밍 처리에도 사용할 수 있다. 예를 들어, 실시간 로그 데이터를 가져오거나 스트리밍 미디어를 다운로드하는 데 활용된다.
서버의 로그 데이터를 실시간으로 출력한다.
curl -N https://streaming-service.example.com/logs
스트리밍 URL에서 미디어 데이터를 저장한다.
curl https://streaming.example.com/video.mp4 -o video.mp4
cURL은 배치 파일이나 스크립트에서 자동화 작업에 자주 사용된다.
다음은 여러 REST API 엔드포인트를 순차적으로 호출하는 배치 파일의 예시이다.
#!/bin/bash
ENDPOINTS=("https://api.example.com/endpoint1" "https://api.example.com/endpoint2")
for endpoint in "${ENDPOINTS[@]}"; do
curl -X GET $endpoint
done
cURL과 크론(Cron)을 결합하여 서버 데이터를 주기적으로 백업할 수 있다.
curl -O https://backup.example.com/database.sql
cURL은 REST API 테스트에서 가장 널리 사용되는 도구 중 하나다. JSON 데이터를 포함한 POST 요청, 사용자 인증이 필요한 GET 요청 등 다양한 테스트를 수행할 수 있다.
curl -X GET https://jsonplaceholder.typicode.com/posts/1
curl -X POST https://jsonplaceholder.typicode.com/posts \
-H "Content-Type: application/json" \
-d '{"title": "foo", "body": "bar", "userId": 1}'
서버의 상태를 확인하기 위해 HTTP 헤더만 확인할 수 있다.
curl -I https://www.example.com
HTTP/1.1 200 OK
Date: Wed, 29 Nov 2024 10:00:00 GMT
Content-Type: text/html
웹사이트의 상태 코드만 출력하는 예시 코드는 다음과 같다.
curl -o /dev/null -s -w "%{http_code}\n" https://www.example.com
cURL은 FTP 또는 SFTP 프로토콜을 활용하여 파일 업로드 및 다운로드를 자동화할 수 있다.
curl -T localfile.txt ftp://ftp.example.com --user username:password
curl sftp://sftp.example.com/remote/file.txt -o localfile.txt --user username:password
서버 간 데이터를 동기화할 때에도 cURL은 빠르고 신뢰성 높은 도구로 사용된다.
서버 A에서 서버 B로 데이터 백업을 전송하는 경우!
curl -T /path/to/file.txt sftp://serverB.example.com/backup/ --user username:password
원격 서버의 데이터를 주기적으로 수집하여 로컬에 저장한다.
curl https://serverA.example.com/data.json -o local_data.json
cURL은 이미 강력한 명령줄 도구이지만, 사용 목적이나 사용자 경험에 따라 이를 보완하거나 대체할 수 있는 도구들도 있다.
Postman은 API 테스트를 위한 GUI 기반 도구로, cURL 명령어와는 달리 시각적 인터페이스를 제공한다. JSON 데이터를 입력하거나 응답을 구조화된 형태로 확인할 수 있어, 초보자에게 특히 유용하다. Postman은 팀 협업 기능, 자동화된 테스트 스크립트 작성 기능도 제공하여 복잡한 API 작업에서 강력한 성능을 발휘한다.
Wget은 cURL과 유사하게 명령줄에서 동작하며, 주로 파일 다운로드 작업에 최적화되어 있다. 특히, 웹 페이지나 전체 디렉토리를 다운로드할 수 있는 기능이 cURL과 차별화된다.
wget https://example.com/file.zip
HTTPie는 cURL보다 사용자 친화적인 명령줄 도구로, 간결한 문법과 컬러 출력 지원이 특징이다. RESTful API 호출이 간단하며, JSON 데이터 처리가 편리하다.
http GET https://jsonplaceholder.typicode.com/posts/1
복잡한 cURL 명령어를 실행할 때, 오류 원인을 파악하는 것이 중요하다. cURL은 디버깅을 위한 여러 옵션을 제공한다.
-v
옵션: 요청 및 응답의 세부 정보를 출력-v
옵션은 요청 및 응답의 모든 세부 정보를 출력하여, 어떤 단계에서 문제가 발생했는지 확인할 수 있다.
curl -v https://www.example.com
* Trying 93.184.216.34...
* Connected to www.example.com (93.184.216.34) port 443 (#0)
> GET / HTTP/1.1
> Host: www.example.com
> User-Agent: curl/7.79.1
> Accept: */*
< HTTP/1.1 200 OK
< Date: Wed, 29 Nov 2024 10:00:00 GMT
< Content-Type: text/html
--trace
옵션: 상세 로그 출력--trace
옵션은 요청 및 응답 데이터를 포함한 모든 디버깅 정보를 파일로 저장한다.
curl --trace debug.log https://www.example.com
--stderr
옵션: 에러 메시지 출력에러 로그를 특정 파일로 리디렉션하거나, 에러 메시지를 보다 명확히 파악할 수 있다.
curl https://www.example.com --stderr error.log
cURL은 다양한 스크립트 언어와 연동하는 경우 자동화 작업에서 강력한 도구로 활용될 수 있다.
Bash에서 cURL을 사용하여 REST API를 호출하고 결과를 파일에 저장하거나 다른 명령어와 결합할 수 있다.
#!/bin/bash
URL="https://jsonplaceholder.typicode.com/posts/1"
RESPONSE=$(curl -s $URL)
echo "Response: $RESPONSE"
Python의 subprocess
모듈을 사용하여 cURL 명령어를 실행할 수 있다.
import subprocess
url = "https://jsonplaceholder.typicode.com/posts/1"
response = subprocess.run(["curl", "-s", url], capture_output=True, text=True)
print("Response:", response.stdout)
Python에서는 requests
라이브러리를 사용해 cURL의 기능을 대체할 수 있다.
import requests
url = "https://jsonplaceholder.typicode.com/posts/1"
response = requests.get(url)
print(response.json())
HTTPS 요청 시 인증서 검증 오류가 발생할 수 있다.
SSL certificate problem: unable to get local issuer certificate
-k
옵션을 사용하거나, --cacert
옵션으로 신뢰할 수 있는 CA 인증서를 제공한다.curl -k https://self-signed.badssl.com/
curl --cacert /path/to/ca-bundle.crt https://secure.example.com/
서버가 요청을 거부하는 경우 발생한다.
curl -H "User-Agent: Mozilla/5.0" https://www.example.com
curl -u username:password https://secure.example.com
네트워크 지연으로 요청이 완료되지 않는 경우 발생한다.
--connect-timeout
옵션으로 연결 제한 시간을 설정한다.curl --connect-timeout 10 https://www.example.com
API 요청에서 JSON 데이터가 잘못된 형식으로 전달될 경우 발생한다.
-H "Content-Type: application/json"
옵션을 사용한다.curl -X POST https://jsonplaceholder.typicode.com/posts \
-H "Content-Type: application/json" \
-d '{"title": "foo", "body": "bar", "userId": 1}'
이전에도 몇 번 사용해본 적은 있지만, 직접 조사하고 보니 생각보다 훨씬 더 유용하게 써먹을 여지가 많은 도구인 것 같다. 추후 네트워크 관련하여 다뤄볼 것이 생기면 아마 가장 먼저 찾지 않을까 싶다. 그렇게 되면 사용 후기? 같은 것도 한번 새로 남겨봐야겠다!