Daily CS) cURL

goldenGlow_21·2024년 12월 5일
0

Daily CS

목록 보기
11/50

cURL

command-line Uniform Resource Locator
client for URLs

오늘의 주제는 cURL이다. 소개하는 글 마다 조금씩 달랐으나, 일단은 명령줄 상에서 데이터 전송을 수행하기 위한 라이브러리/커맨드 라인 도구를 제공하는 소프트웨어(tool)이다. 지난번 수행한 "서비스 포트 스캐너 구현하기" 프로젝트가 마무리된 후, 피드백 시간에 포트 스캔을 위한 방법 중 하나로 제시받은 바 있어 조사를 결심하게 되었다.


1. cURL의 개요

1.1 cURL의 정의와 특징

cURL(Command-line URL)은 다양한 프로토콜을 지원하며 데이터 전송을 처리할 수 있는 명령줄 기반 도구이다. 주로 HTTP/HTTPS 요청을 테스트하거나 API 호출, 파일 다운로드와 업로드, 서버 상태 확인 등에 사용된다. cURL은 간단한 명령으로 복잡한 요청을 수행할 수 있어, 개발자와 시스템 관리자가 애용하는 도구 중 하나다.

주요한 특징

  • 다양한 프로토콜 지원: HTTP, HTTPS, FTP, SCP, SMTP 등 다수의 프로토콜을 처리할 수 있다.
  • 플랫폼 독립적: Windows, macOS, Linux 등 다양한 운영 체제에서 사용 가능하다.
  • 경량성: 가벼운 명령줄 인터페이스로 구성되어 빠르고 효율적이다.
  • 유연성: 인증, 쿠키, 헤더 추가 등 다양한 요청 커스터마이징을 지원한다.

1.2 cURL이 지원하는 프로토콜

cURL은 다음과 같은 프로토콜을 지원하며, 각각의 프로토콜에 대해 특정 명령어 옵션을 제공한다.(혹시 추가할 사항이나 변경점이 있다면 댓글 부탁합니다~)

프로토콜설명
HTTP/HTTPS웹 요청/응답 처리 및 REST API 호출에 주로 사용
FTP/SFTP파일 전송 프로토콜. FTP 서버에서 파일 업로드 및 다운로드 가능
SMTP이메일 전송 프로토콜. 이메일 전송 및 SMTP 서버 테스트에 사용
SCP보안 복사 프로토콜로, SSH를 통해 파일을 전송
LDAPLightweight Directory Access Protocol. 디렉토리 서비스와의 상호작용에 사용
  • HTTPS 요청을 통해 API 호출하는 예시!
curl https://jsonplaceholder.typicode.com/posts/1

1.3 cURL의 설치

cURL은 대부분의 운영 체제에 기본적으로 설치되어 있다. 만약 없는 경우, 아래 명령어를 통해 설치할 수 있다. 그러고 보니까 난 없던 거 같은데... WSL이라 그런가

  • Linux (Ubuntu 기준)
sudo apt update
sudo apt install curl
  • macOS
brew install curl
  • Windows

https://curl.se/

위의 공식 사이트에서 다운로드 받기!


2. cURL의 기본 사용법

2.1 HTTP 요청과 응답 확인

cURL은 HTTP 요청을 테스트하거나 서버 응답을 확인하는 데 유용하다. 아래는 기본적인 HTTP 요청 명령어 예시다.

  • GET 요청
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"
}

진짜 저렇게 나온다... 무슨 뜻일까

  • HEAD 요청

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

2.2 cURL을 이용한 데이터 전송 (GET, POST, PUT, DELETE)

cURL은 RESTful API 요청을 테스트하는 데 필수적인 도구로, 다양한 HTTP 메서드를 지원한다.

  • POST 요청

서버에 데이터를 전송하려면 -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
}
  • PUT 요청

데이터를 업데이트할 때는 -X PUT을 사용한다.

curl -X PUT https://jsonplaceholder.typicode.com/posts/1 \
-H "Content-Type: application/json" \
-d '{"title": "updated title", "body": "updated body"}'
  • DELETE 요청

데이터를 삭제하려면 -X DELETE를 사용한다.

curl -X DELETE https://jsonplaceholder.typicode.com/posts/1

2.3 cURL 옵션의 활용 (헤더 추가, 인증 등)

cURL은 다양한 옵션을 제공하여 요청을 커스터마이징할 수 있다.

  • 헤더 추가

-H 옵션을 사용해 HTTP 요청 헤더를 추가할 수 있다.

curl -H "Authorization: Bearer YOUR_TOKEN" https://api.example.com/secure-data
  • Basic 인증

-u 옵션으로 사용자 이름과 비밀번호를 제공한다.

curl -u username:password https://api.example.com/login
  • 쿠키 사용

--cookie 옵션을 사용하여 쿠키를 전송한다.

curl --cookie "session_id=abcd1234" https://www.example.com/profile

2.4 파일 다운로드와 업로드

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. @ 기호는 로컬 파일 경로를 지정하는 데 사용


3. cURL의 고급 기능

3.1 JSON 데이터와 API 호출

cURL은 REST API 호출에서 JSON 데이터를 다루는 데 매우 유용하다. POST, PUT 요청을 통해 JSON 데이터를 전송하거나, GET 요청을 통해 JSON 응답을 받을 수 있다.

  • POST 요청으로 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
}
  • GET 요청으로 JSON 데이터 수신
curl https://jsonplaceholder.typicode.com/posts/1 | jq

3.2 HTTPS 요청 및 SSL 인증서 처리

HTTPS 요청은 기본적으로 SSL/TLS 인증서를 통해 보안을 보장한다. 그러나 인증서 유효성 검증이 필요한 경우가 있으므로, 이 경우에 대해서 알아보자.

  • 인증서 검증을 비활성화

인증서 검증 문제를 해결하지 못할 경우, -k 옵션을 사용하여 이를 비활성화할 수 있다.

curl -k https://self-signed.badssl.com/
  • 특정 인증서 사용

--cert 옵션을 사용해 특정 인증서를 제공한다.

curl --cert /path/to/cert.pem https://secure.example.com/
  • CA 인증서 경로 지정

신뢰할 수 있는 CA 인증서를 수동으로 제공하려면 --cacert 옵션을 사용한다.

curl --cacert /path/to/ca-bundle.crt https://secure.example.com/

3.3 cURL로 데이터 스트리밍 처리

cURL은 데이터 스트리밍 처리에도 사용할 수 있다. 예를 들어, 실시간 로그 데이터를 가져오거나 스트리밍 미디어를 다운로드하는 데 활용된다.

  • 실시간 로그 스트리밍

서버의 로그 데이터를 실시간으로 출력한다.

curl -N https://streaming-service.example.com/logs
  • 미디어 스트리밍 다운로드

스트리밍 URL에서 미디어 데이터를 저장한다.

curl https://streaming.example.com/video.mp4 -o video.mp4

3.4 배치 파일에서 cURL 자동화

cURL은 배치 파일이나 스크립트에서 자동화 작업에 자주 사용된다.

  • 배치 파일에서 API 호출

다음은 여러 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

4. cURL의 실제 사용 예시

4.1 REST API 테스트

cURL은 REST API 테스트에서 가장 널리 사용되는 도구 중 하나다. JSON 데이터를 포함한 POST 요청, 사용자 인증이 필요한 GET 요청 등 다양한 테스트를 수행할 수 있다.

  • GET 요청으로 데이터 가져오기
curl -X GET https://jsonplaceholder.typicode.com/posts/1
  • POST 요청으로 데이터 생성
curl -X POST https://jsonplaceholder.typicode.com/posts \
-H "Content-Type: application/json" \
-d '{"title": "foo", "body": "bar", "userId": 1}'

4.2 웹사이트 상태 확인

서버의 상태를 확인하기 위해 HTTP 헤더만 확인할 수 있다.

  • HEAD 요청으로 상태 확인
curl -I https://www.example.com
  • 응답 예시
HTTP/1.1 200 OK
Date: Wed, 29 Nov 2024 10:00:00 GMT
Content-Type: text/html
  • 특정 HTTP 상태 코드 확인

웹사이트의 상태 코드만 출력하는 예시 코드는 다음과 같다.

curl -o /dev/null -s -w "%{http_code}\n" https://www.example.com

4.3 파일 전송 자동화

cURL은 FTP 또는 SFTP 프로토콜을 활용하여 파일 업로드 및 다운로드를 자동화할 수 있다.

  • FTP 파일 업로드
curl -T localfile.txt ftp://ftp.example.com --user username:password
  • SFTP 파일 다운로드
curl sftp://sftp.example.com/remote/file.txt -o localfile.txt --user username:password

4.4 서버 간 데이터 동기화

서버 간 데이터를 동기화할 때에도 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

5. cURL의 유용한 팁과 도구

cURL은 이미 강력한 명령줄 도구이지만, 사용 목적이나 사용자 경험에 따라 이를 보완하거나 대체할 수 있는 도구들도 있다.

5.1 cURL을 대체하거나 보완할 수 있는 도구 (Postman, Wget 등)

1. Postman

Postman은 API 테스트를 위한 GUI 기반 도구로, cURL 명령어와는 달리 시각적 인터페이스를 제공한다. JSON 데이터를 입력하거나 응답을 구조화된 형태로 확인할 수 있어, 초보자에게 특히 유용하다. Postman은 팀 협업 기능, 자동화된 테스트 스크립트 작성 기능도 제공하여 복잡한 API 작업에서 강력한 성능을 발휘한다.

2. Wget

Wget은 cURL과 유사하게 명령줄에서 동작하며, 주로 파일 다운로드 작업에 최적화되어 있다. 특히, 웹 페이지나 전체 디렉토리를 다운로드할 수 있는 기능이 cURL과 차별화된다.

wget https://example.com/file.zip

3. HTTPie

HTTPie는 cURL보다 사용자 친화적인 명령줄 도구로, 간결한 문법과 컬러 출력 지원이 특징이다. RESTful API 호출이 간단하며, JSON 데이터 처리가 편리하다.

http GET https://jsonplaceholder.typicode.com/posts/1

5.2 cURL 명령어 디버깅

복잡한 cURL 명령어를 실행할 때, 오류 원인을 파악하는 것이 중요하다. cURL은 디버깅을 위한 여러 옵션을 제공한다.

1. -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

2. --trace 옵션: 상세 로그 출력

--trace 옵션은 요청 및 응답 데이터를 포함한 모든 디버깅 정보를 파일로 저장한다.

curl --trace debug.log https://www.example.com

3. --stderr 옵션: 에러 메시지 출력

에러 로그를 특정 파일로 리디렉션하거나, 에러 메시지를 보다 명확히 파악할 수 있다.

curl https://www.example.com --stderr error.log

5.3 cURL과 스크립트 언어(Python, Bash) 연동

cURL은 다양한 스크립트 언어와 연동하는 경우 자동화 작업에서 강력한 도구로 활용될 수 있다.

1. Bash 스크립트에서 cURL 활용

Bash에서 cURL을 사용하여 REST API를 호출하고 결과를 파일에 저장하거나 다른 명령어와 결합할 수 있다.

#!/bin/bash
URL="https://jsonplaceholder.typicode.com/posts/1"
RESPONSE=$(curl -s $URL)
echo "Response: $RESPONSE"

2. Python에서 cURL 명령 호출

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)

3. Requests 라이브러리로 대체

Python에서는 requests 라이브러리를 사용해 cURL의 기능을 대체할 수 있다.

import requests

url = "https://jsonplaceholder.typicode.com/posts/1"
response = requests.get(url)
print(response.json())

5.4 cURL 사용 중 흔히 발생하는 문제와 해결 방법

1. 인증서 검증 오류

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/

2. 403 Forbidden 오류

서버가 요청을 거부하는 경우 발생한다.

  • 해결: User-Agent 헤더를 추가하거나, 인증 정보를 제공한다.
curl -H "User-Agent: Mozilla/5.0" https://www.example.com
curl -u username:password https://secure.example.com

3. 요청 시간 초과

네트워크 지연으로 요청이 완료되지 않는 경우 발생한다.

  • 해결: --connect-timeout 옵션으로 연결 제한 시간을 설정한다.
curl --connect-timeout 10 https://www.example.com

4. JSON 데이터 형식 오류

API 요청에서 JSON 데이터가 잘못된 형식으로 전달될 경우 발생한다.

  • 해결: 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}'

6. 마무리

이전에도 몇 번 사용해본 적은 있지만, 직접 조사하고 보니 생각보다 훨씬 더 유용하게 써먹을 여지가 많은 도구인 것 같다. 추후 네트워크 관련하여 다뤄볼 것이 생기면 아마 가장 먼저 찾지 않을까 싶다. 그렇게 되면 사용 후기? 같은 것도 한번 새로 남겨봐야겠다!

profile
안드로이드는 리눅스의 꿈을 꾸는가

0개의 댓글