CURL(Client for URL): URL을 받아 서버로 요청을 보내고 받은 응답을 출력하는 도구
CURL이란?
CURL(Client for URL)
은 개발을 하면서, 상당히 많이 듣고 활용도 자주 했지만 실제로 약자에 대해서는 이번에 처음 알게 되었다.
맥북 같은 경우는 감사하게도 자체적으로 curl이 내장 기능으로 탑재되어 있다.
# mac
which curl
curl https://dummyjson.com/comments/1
# {"id":1,"body":"This is some awesome thinking!","postId":242,"likes":3,"user":{"id":105,"username":"emmac","fullName":"Emma Wilson"}}%
bash
실제로, 이런식으로 CURL을 활용해서 서버에 요청을 보내서 응답을 출력할 수 있다.
윈도우 같은 경우에는 https://curl.se/windows/ 이 쪽에서 설치를 해야 하는 것으로 알고 있다.
조금 더 요청에 대한 자세한 정보를 보고싶으면 아래와 같이 하면된다.
# mac
which curl
curl https://dummyjson.com/comments/1 --verbose
bash
실제로 보면, 엄청 자세한 정보들이 담겨서 오게 된다.
다양한 정보들이 보이지만, 오늘은 요청과 응답에 대해 알아보는 것이 목표이므로 아래를 중점으로 다루어볼려고 한다.
> : 클라이언트 → 서버로 보내는 요청 헤더
> GET /comments/1 HTTP/2
> Host: dummyjson.com
> User-Agent: curl/8.7.1
> Accept: */*
bash
항목 | 설명 |
---|---|
GET /comments/1 HTTP/2 | 클라이언트가 /comments/1 경로에 대해 GET 메서드로 요청을 보냄. HTTP/2는 클라이언트가 지원하는 HTTP 버전 (curl이 제안한 ALPN 중 서버가 선택한 것). |
Host: dummyjson.com | 가상 호스팅 서버를 위해 요청하는 대상 도메인을 명시. |
User-Agent: curl/8.7.1 | 요청을 보낸 클라이언트의 정보. 여기서는 curl이라는 HTTP 클라이언트 도구의 버전. |
Accept: */* | 어떤 타입의 응답도 받아들일 수 있다는 의미. (*/* = all media types) |
< : 서버 → 클라이언트로 보낸 응답 헤더
< HTTP/2 200
< access-control-allow-origin: *
< content-type: application/json; charset=utf-8
< date: Tue, 29 Jul 2025 10:25:21 GMT
< etag: W/"85-FEb3h4CPX0SmhhGt/sXFy+BW+u4"
< server: railway-edge
< strict-transport-security: max-age=15552000; includeSubDomains
< vary: Accept-Encoding
< x-content-type-options: nosniff
< x-dns-prefetch-control: off
< x-download-options: noopen
< x-frame-options: SAMEORIGIN
< x-powered-by: Cats on Keyboards
< x-railway-edge: railway/asia-southeast1-eqsg3a
< x-railway-request-id: 2Ra3kcGnQU-7SbdeAQeqjw
< x-ratelimit-limit: 100
< x-ratelimit-remaining: 99
< x-ratelimit-reset: 1753784724
< x-xss-protection: 1; mode=block
< content-length: 133
bash
항목 | 설명 |
---|---|
HTTP/2 200 | 응답 상태줄. 서버가 HTTP/2로 요청에 성공적으로 응답했고, 상태 코드는 200 OK . |
access-control-allow-origin: * | CORS 정책 허용. 모든 출처에서의 접근 허용. |
content-type: application/json; charset=utf-8 | 응답 본문이 JSON 형식이고, UTF-8 문자 인코딩 사용. |
date | 서버가 응답을 생성한 시간 (RFC 1123 포맷). |
etag | 응답 본문의 고유한 식별자. 캐싱이나 변경 감지에 사용. |
server | 서버 소프트웨어 정보 (railway-edge ). |
strict-transport-security | HTTPS 연결을 강제하는 보안 정책. |
vary: Accept-Encoding | 클라이언트의 Accept-Encoding 에 따라 응답이 달라질 수 있음을 나타냄. |
x-content-type-options: nosniff | 브라우저가 MIME 타입을 추측하지 못하게 방지 (보안). |
x-dns-prefetch-control: off | 브라우저의 DNS prefetching 비활성화. |
x-download-options: noopen | 파일 다운로드 시 자동 실행 방지 (IE용). |
x-frame-options: SAMEORIGIN | XSS 공격을 막기 위해 iframe 삽입 제한. |
x-powered-by: Cats on Keyboards | 서버가 장난스럽게 자신을 소개. 실질적 의미 없음. |
x-railway-* | Railway(호스팅 서비스)에서 붙이는 정보. 엣지 위치 및 요청 ID. |
x-ratelimit-* | API 호출 제한 관련 정보. (예: 100개 중 아직 99개 남음) |
content-length: 133 | 응답 본문의 바이트 수. |
✅ 응답 본문 (Body)
응답 헤더가 끝나고 한 줄 비운 뒤에 실제 데이터(JSON)가 내려온다:
{
"id": 1,
"body": "This is some awesome thinking!",
"postId": 242,
"likes": 3,
"user": { "id": 105, "username": "emmac", "fullName": "Emma Wilson" }
}
json