본문 바로가기
C.W.K.
Stream
Lesson 05 of 08 · published

curl: 셸의 HTTP 클라이언트

~13 min · curl, http, api

Level 0창 구경꾼
0 XP0/95 lessons0/14 achievements
0/100 XP to next level100 XP to go0% complete

셸에서 HTTP 요청 보내기

curl은 URL로 요청을 보내고 응답을 출력하는 범용 클라이언트야. curl https://example.com은 응답 본문을 stdout에 쓰므로 파일 저장, 파이프, 상태 검사 가운데 무엇을 원하는지 옵션으로 분명히 정해야 해.

자주 쓰는 플래그

  • -L: 리디렉션을 따라가.
  • -sS: 진행 표시는 숨기되 오류는 보여 줘.
  • -o file: 지정한 파일에 쓰고, -O는 URL의 파일명을 사용해.
  • -X POST-X PUT: 요청 메서드를 정해.
  • -H 'Header: Value': 헤더를 추가해.
  • -d 'data': 요청 본문을 보내.
  • --data-urlencode 'key=value with spaces': 값을 URL 인코딩해.
  • --data @body.json: 파일에서 본문을 읽어.
  • -u user:pass: 기본 인증 정보를 보내.
  • -i-I: 각각 응답 헤더 포함, 헤더만 출력을 뜻해.
  • -w '%{http_code}\n': 상태 코드나 걸린 시간을 별도로 출력해.

JSON 본문을 POST하기

curl -sS https://api.example.com/items \
  -H 'Authorization: Bearer ${TOKEN}' \
  -H 'Content-Type: application/json' \
  -d '{"name":"sample","qty":3}'

인증한 GET 응답을 jq로 읽기

curl -sS -H 'Authorization: token ghp_xxx' \
  https://api.github.com/user/repos | jq '.[].name'

큰 파일을 진행률과 함께 받기

curl -L -o ubuntu.iso --progress-bar https://...

상태 코드와 시간을 확인하기

curl -sS -o /dev/null -w '%{http_code} %{time_total}s\n' https://api

네트워크 연결 성공만으로 애플리케이션 요청이 성공한 것은 아니야. 상태 코드와 응답 본문을 함께 확인해.

받은 스크립트를 바로 실행하지 마

curl --fail-with-body --connect-timeout 5 --max-time 30 \
  -o installer.sh https://example.com/install.sh
less installer.sh

curl ... | bash는 서버가 보내는 내용을 곧바로 실행해. 파일로 받은 뒤 출처와 체크섬, 내용을 확인하고 실행 여부를 결정해.

HTTP 성공에는 여러 층이 있어

curl은 기본적으로 404나 500 응답도 본문과 함께 반환할 수 있어. 지원되는 버전에서는 --fail-with-body로 HTTP 오류를 실패 상태로 만들고, 연결 제한 시간과 전체 제한 시간을 정해. 리디렉션과 응답 데이터도 작업 계약에 맞는지 확인해야 해.

재시도 전에 멱등성을 확인해

GET은 다시 시도하기 쉬운 경우가 많지만 결제나 생성 POST는 중복 부수 효과를 만들 수 있어. 재시도 횟수와 지연을 제한하고, 변경 요청에는 멱등성 키나 서비스가 제공하는 복구 계약을 사용해.

Code

실제 API 호출 패턴·bash
# 인증 없이 공개 GitHub 저장소 조회
curl -sS https://api.github.com/users/cli/repos | jq '.[].full_name' | head
# 상태 확인
curl -sS -o /dev/null -w 'http=%{http_code} dns=%{time_namelookup}s total=%{time_total}s\n' \
  https://api.openai.com
# 파일의 JSON을 POST
curl -sS -X POST https://example/api \
  -H 'Content-Type: application/json' \
  --data @body.json

External links

Exercise

먼저 curl -sS https://api.github.com/repos/cli/cli | jq '.stargazers_count, .forks_count'로 응답 필드를 읽어. 다음으로 curl -sS -o /dev/null -w '%{http_code} %{time_total}s\n' https://example.com을 실행해 상태와 시간을 확인해. 작은 파일은 curl -O https://...로 받아.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.