알아두면 좋은 내용
어떻게 사용하나요?
- 변환 탭 — cURL을 붙여넣으면 5개 언어 코드가 동시에 나옵니다. async/await, try/catch 오류 처리, 민감 헤더 마스킹을 옵션으로 고를 수 있습니다.
- 요청 구조 탭 — 메서드·URL·쿼리·헤더·인증·쿠키·본문을 나눠 보여 주고, Content-Type을 자동으로 판별합니다. 코드가 기대와 다르면 여기서 도구가 명령을 어떻게 읽었는지 먼저 확인하세요.
- 예시 탭 — 카카오·네이버·토스·쿠팡·GitHub·OpenAI·Slack·AWS·GraphQL·multipart 등 12개 카드를 누르면 바로 입력됩니다.
- 가이드 탭 — 옵션 요약, 언어별 비교, 미지원 옵션, 보안 주의를 도구 안에서 바로 볼 수 있습니다.
도구가 cURL을 해석하는 규칙
cURL은 메서드를 적지 않아도 다른 옵션으로 요청 방식을 정합니다. 이 도구는 메서드를 다음 순서로 결정합니다. ① -X로 지정한 값 → ② -I면 HEAD → ③ -G면 GET → ④ 본문 옵션(-d·--data-*·--json·-F)이 있으면 POST → ⑤ 그 밖에는 GET. 그래서 -X PUT -d …는 PUT, -d …만 있으면 POST가 됩니다.
본문 형식은 Content-Type 헤더가 있으면 그 값을 따르고, 없으면 본문 모양으로 추정합니다. key=value&key2=value2 꼴이면 폼(urlencoded),{나 [로 시작하는 올바른 JSON이면 JSON, 둘 다 아니면 원문 그대로 보냅니다.-F가 하나라도 있으면 multipart가 우선하고, Content-Type이 JSON인데 본문이 JSON 문법에 맞지 않으면 원문 전송 코드로 바꾸고 경고를 띄웁니다. 아래 표는 이 페이지를 만들 때 도구의 파서로 직접 돌린 결과입니다.
| 입력한 cURL | 메서드 | 본문 | Content-Type | 비고 |
|---|---|---|---|---|
curl https://api.example.com/users | GET | 없음 | — | 옵션이 없으면 curl도 GET |
curl -d 'name=kim&age=30' https://api.example.com/users | POST | 폼 (urlencoded) | application/x-www-form-urlencoded | curl과 같음 — -d가 있으면 POST + 폼 Content-Type |
curl -d '{"name":"kim"}' https://api.example.com/users | POST | JSON | application/json | curl 자체는 폼 Content-Type으로 보냄 — 도구는 본문 모양을 보고 JSON으로 추정 |
curl --json '{"name":"kim"}' https://api.example.com/users | POST | JSON | application/json | curl 7.82+ 단축 옵션 — Accept: application/json도 함께 |
curl -G -d 'q=coffee' -d 'page=2' https://api.example.com/search | GET | 없음 | — | 본문이 쿼리 문자열로 이동 → https://api.example.com/search?q=coffee&page=2 |
curl -F 'file=@photo.jpg' -F 'title=trip' https://api.example.com/upload | POST | multipart | boundary 포함 자동 생성 | 파일은 자리표시 코드 — 실제 경로·파일 입력은 직접 연결 |
curl -I https://api.example.com/health | HEAD | 없음 | — | 본문 대신 fetch·Node 코드는 상태·헤더, Python 코드는 헤더를 출력 — axios·Go 코드는 빈 본문을 출력하므로 상태·헤더(response.status·headers, resp.Status·Header)로 바꿔 쓰기 |
curl -d @body.json https://api.example.com/users | POST | 없음 | — | 메서드는 POST로 맞추지만 파일 내용은 직접 읽어 넣어야 함 (경고 표시) |
-d '{"name":"kim"}'를 보내면 서버에는 application/x-www-form-urlencoded로 전달됩니다. 이 도구는 JSON 본문을 보면 application/json을 붙여 주는데, 원래 명령이 폼 형식으로 서버에서 통하고 있었다면 결과가 달라질 수 있습니다. 원본 그대로 재현하려면 cURL에 -H 'Content-Type: …'를 명시한 뒤 변환하세요.cURL 옵션 치트시트 — 도구가 반영하는 범위
짧은 형식과 긴 형식을 모두 인식하며, --header=값처럼 등호로 붙인 긴 옵션도 읽습니다. ‘표시만’인 옵션은 요청 구조 탭에 표시되지만 생성 코드에는 넣지 않습니다. 특히 -k를 코드에 그대로 옮기면 운영 환경에서 중간자 공격을 막는 인증서 검증이 꺼진 채 남기 쉬워서 일부러 제외했습니다.
| 짧은 형식 | 긴 형식 | curl에서의 의미 | 이 도구의 처리 |
|---|---|---|---|
-X | --request | HTTP 메서드 지정 | 반영 |
-H | --header | 요청 헤더 추가 | 반영 |
-d | --data | 본문 전송 (메서드 미지정 시 POST) | 반영 · @파일은 경고 |
| — | --data-raw | 본문 전송 (@를 파일로 해석하지 않음) | 반영 |
| — | --data-binary | 본문을 가공 없이 전송 | 반영 · @파일은 경고 |
| — | --data-urlencode | 값을 URL 인코딩해 전송 | 반영 |
| — | --json | JSON 본문 + Content-Type·Accept 헤더 | 반영 |
-F | --form | multipart/form-data 필드·파일 | 반영 · 파일은 자리표시 |
-u | --user | Basic 인증 (user:pass) | 반영 |
-b | --cookie | Cookie 헤더 (name=value; …) | 반영 |
-A | --user-agent | User-Agent 헤더 | 반영 |
-e | --referer | Referer 헤더 | 반영 |
-G | --get | -d 본문을 쿼리 문자열로 옮겨 GET | 반영 |
-I | --head | HEAD 요청 (응답 헤더만) | 반영 |
-k | --insecure | TLS 인증서 검증 끄기 | 표시만 — 코드엔 넣지 않음 |
-L | --location | 리다이렉트 따라가기 | 표시만 |
| — | --compressed | 압축 응답 요청·해제 | 표시만 |
-s -S -v -i | — | 진행·로그 출력 제어 | 무시 |
-m | --max-time | 전체 요청 제한 시간 | 건너뜀 (경고) — 타임아웃은 직접 추가 |
5 언어 차이 — fetch · axios · Python · Node.js · Go
같은 요청이라도 언어마다 ‘오류’로 보는 기준과 기본 동작이 다릅니다. 변환된 코드를 고를 때는 실행 환경뿐 아니라 HTTP 오류 상태를 예외로 던지는지, 타임아웃이 기본으로 걸려 있는지를 함께 보세요.
| 코드 | 주로 쓰는 곳 | 장점 | 주의할 점 |
|---|---|---|---|
| fetch | 브라우저 · Node 18+ 내장 | 의존성 없음, 웹 표준 | 4xx·5xx에도 reject하지 않음 → response.ok 확인. JSON은 .json() 호출 |
| axios | 브라우저 · Node (npm 설치) | 인터셉터, 자동 JSON 변환, AbortController 취소 | 2xx가 아니면 기본적으로 예외. 번들 크기 증가 |
| Python requests | 스크립트 · 자동화 · 백엔드 | json= · data= · files=로 본문 구분 | 동기 전용. 4xx·5xx도 예외 없음 → raise_for_status(). 기본 타임아웃 없음 |
| Node http/https | 의존성 없는 Node 스크립트 | 저수준 제어, 추가 설치 없음 | 리다이렉트·압축 해제·JSON 파싱을 직접 처리. 본문은 스트림으로 모아야 함 |
| Go net/http | 백엔드 · CLI | 표준 라이브러리, 동시 요청에 강함 | http.DefaultClient는 타임아웃 없음. resp.Body.Close() 필수 |
변환 후 동작이 달라지는 지점 — 리다이렉트·압축·TLS·쿠키
코드가 문법적으로 같아도 HTTP 클라이언트의 기본값이 curl과 달라서 결과가 바뀌는 경우가 있습니다. cURL에서 잘 되던 요청이 변환 후 다른 응답을 받는다면 아래 네 가지를 먼저 의심해 보세요.
| 항목 | cURL | fetch (브라우저) | Python requests | Node http/https | Go net/http |
|---|---|---|---|---|---|
| 리다이렉트 | -L 없으면 따라가지 않음 | 기본으로 따라감 (redirect: follow) | 기본으로 따라감 (head()는 예외) | 따라가지 않음 | 최대 10회 따라감 |
| 압축 응답 | --compressed 없으면 요청·해제 안 함 | 브라우저가 처리 (Accept-Encoding 설정 불가) | gzip·deflate 자동 해제 (br·zstd는 brotli·zstandard 패키지가 있을 때만) | 해제하지 않음 (zlib로 직접) | Accept-Encoding을 직접 넣지 않았을 때만 자동 해제 (Transport가 gzip 요청) |
| TLS 검증 끄기 | -k | 끌 수 없음 | verify=False | rejectUnauthorized: false | InsecureSkipVerify: true |
| Cookie · Referer 헤더 | -b · -e로 전송 | 금지 헤더라 무시됨 → credentials·referrer 옵션 | 그대로 전송 | 그대로 전송 | 그대로 전송 |
리다이렉트 — curl은 -L이 없으면 301·302 응답을 그대로 돌려주지만, fetch·requests·Go는 기본으로 새 주소를 따라갑니다. 로그인 후 리다이렉트처럼 3xx 응답 자체를 봐야 한다면 Node.js fetch는 redirect: 'manual', requests는 allow_redirects=False를 지정하세요. 브라우저 fetch는 manual로 두어도 보안상 Location 헤더를 읽을 수 없습니다. axios는 브라우저에서는 브라우저 규칙을 따르고, Node.js에서는 기본 21회까지 따라갑니다.
압축 — 복사한 cURL에 Accept-Encoding: gzip, deflate, br 헤더가 남아 있으면 Go·Node http 코드는 압축된 바이트를 그대로 받습니다. Go는 헤더를 직접 넣은 요청의 응답을 자동으로 풀지 않고, Node http는 원래 풀지 않기 때문입니다. Python requests도 gzip·deflate만 기본으로 풀고, br·zstd 응답은 brotli·zstandard 패키지가 설치돼 있지 않으면 압축된 채로 넘겨줍니다(최근 브라우저 복사본은 zstd까지 적습니다). 어느 경우든 JSON 파싱이 실패하므로 이 헤더를 지우고 각 클라이언트가 스스로 압축을 협상하게 두는 것이 가장 간단합니다.
쿠키 — 브라우저의 fetch는 Cookie·Referer·Accept-Encoding 같은 금지 헤더를 스크립트가 설정해도 조용히 무시합니다. 브라우저 코드에서 쿠키를 보내려면 헤더 대신 credentials: 'include'를 쓰고, 다른 도메인이면 서버의 CORS 설정(Access-Control-Allow-Credentials)도 맞아야 합니다.
생성 코드를 운영에 옮기기 전 점검할 것
- 타임아웃 — curl의
-m/--max-time은 코드에 옮기지 않습니다. requests는timeout인자가 없으면 응답을 무기한 기다리고, 생성된 Go 코드가 쓰는http.DefaultClient도 타임아웃이 없습니다.requests.get(…, timeout=10),&http.Client{Timeout: 10 * time.Second}, fetch는signal: AbortSignal.timeout(10000)처럼 명시하세요. - 오류 판정 — fetch와 requests는 404·500에도 예외를 던지지 않습니다. try/catch 옵션을 켜면 Python은
raise_for_status(), fetch는 async / await 모드일 때response.ok로 상태를 검사하는 코드가 함께 생성됩니다. Promise then 모드의 fetch 코드에는 이 검사가 없으니 첫.then에 직접 넣으세요. - 응답 형식 — fetch·Python·Node 코드는 응답을 JSON으로 읽습니다. HTML이나 일반 텍스트를 돌려주는 API라면 fetch는
.text(), Python은response.text로 바꾸고, Node는JSON.parse를 빼고 모은 Buffer 문자열을 그대로 쓰세요. - Basic 인증 —
-u user:pass는 fetch·Node 코드에서 변환 시점에 계산한 Base64 문자열로 들어갑니다. Base64는 암호화가 아니므로 HTTPS로만 보내고, 비밀번호가 바뀌면 다시 변환하거나 코드에서 계산하도록 고치세요.
코드에 반영되지 않는 옵션
아래 옵션은 파일 시스템, 인증서 저장소, 네트워크 경로처럼 실행 환경에 달린 설정이라 코드 한 줄로 옮기기 어렵습니다. 명령에 들어 있으면 파싱 결과에 따로 표시되고, 값까지 함께 건너뛰므로 URL이 잘못 잡히지는 않습니다. 필요한 경우 각 언어의 클라이언트 설정으로 직접 옮기세요.
- 파일 본문
-d @파일·--data-binary @파일·--json @파일— 메서드만 POST로 맞추고 본문은 직접 연결 (multipart-F file=@…는 지원) - TLS 인증서
--cert/-E·--key·--cacert·--cert-type - 프록시
--proxy/-x·--proxy-user·--socks4·--socks5 - 파일 저장
-o·-O·-J, 업로드-T/--upload-file - 범위·이어받기
-r/--range·-C/--continue-at - DNS 고정
--resolve·--connect-to, 전송 제어--limit-rate·--no-buffer
한국 API 자주 쓰는 시나리오
예시 탭에는 국내 백엔드 개발에서 자주 만나는 API 5개가 들어 있습니다. 인증 방식이 서로 달라서, 각 방식이 언어별 코드로 어떻게 바뀌는지 비교해 보기 좋습니다.
- 카카오 메시지 보내기 — Bearer 토큰 헤더 + form-urlencoded 본문
- 카카오 OAuth 토큰 발급 — 인가 코드(authorization_code)를 액세스 토큰으로 교환
- 네이버 검색 API — X-Naver-Client-Id·X-Naver-Client-Secret 헤더 두 개로 인증
- 토스페이먼츠 결제 승인 — 시크릿 키 Basic 인증 + JSON 본문
- 쿠팡 파트너스 검색 — HMAC-SHA256 서명 헤더 (서명은 요청마다 새로 계산해야 함)
process.env.KAKAO_TOKEN, Python os.environ["NAVER_CLIENT_ID"].자주 묻는 질문
fetch와 axios 중 어떤 코드를 쓰는 게 좋나요?
response.ok를 직접 확인해야 하고, JSON은 .json()으로 꺼내야 합니다.axios는 요청·응답 인터셉터, 자동 JSON 변환, 2xx 외 상태 코드의 예외 처리,
AbortController 기반 취소를 기본으로 제공합니다. 인증 토큰 자동 첨부·재시도처럼 공통 처리가 많은 프로젝트라면 axios가 편하고, 단순 호출이라면 fetch로 충분합니다.Python에서 requests와 httpx는 무엇이 다른가요?
httpx.AsyncClient)를 모두 지원해 FastAPI 같은 비동기 프로젝트에 어울립니다. HTTP/2도 쓸 수 있지만 기본값은 HTTP/1.1이며, pip install "httpx[http2]"로 h2 패키지를 설치하고 http2=True로 켜야 합니다.이 도구는 requests 코드를 생성합니다. httpx로 옮길 때는
import requests를 import httpx로, requests.post(...)를 httpx.post(...)로 바꾸면 대부분 그대로 동작합니다. 단 httpx는 기본적으로 리다이렉트를 따라가지 않으므로 필요하면 follow_redirects=True를 추가하세요.Node.js에서 fetch는 언제부터 쓸 수 있나요?
fetch가 전역으로 들어 있어 node-fetch 패키지가 필요 없습니다. Node 18~20에서는 실험적(experimental) 기능이지만 플래그 없이 기본 활성화돼 있고, Node 21부터 안정(stable)으로 표시됩니다. Node 16 이하라면 npm i node-fetch 후 import fetch from 'node-fetch'를 추가하거나, 이 도구의 axios 또는 Node http 코드를 쓰세요.여러 줄로 된 cURL(줄 끝 \)도 붙여넣을 수 있나요?
$'…' 인용도 풀어서 해석합니다. -sSL처럼 붙여 쓴 짧은 옵션과 -XPUT처럼 값을 붙인 옵션도 나눠 읽습니다. 다만 셸을 완전히 흉내 내지는 않으므로 $VAR 변수 치환이나 $(…) 명령 치환은 처리하지 않습니다.-F로 파일을 올리는 multipart 명령은 어떻게 변환되나요?
FormData에 브라우저 파일 입력(fileInput.files[0])을 넣는 형태, Python은 files=에 open('photo.jpg', 'rb'), Node.js는 form-data 패키지와 fs.createReadStream, Go는 mime/multipart와 os.Open을 쓰는 코드가 만들어집니다.multipart는 본문 구분자(boundary)가 Content-Type 헤더에 들어가야 하므로 라이브러리가 헤더를 직접 만들어야 합니다. 원본에
-H 'Content-Type: multipart/form-data'가 있으면 boundary가 빠져 서버가 본문을 못 읽기 때문에, 이 도구는 multipart일 때 입력한 Content-Type을 5개 언어 코드 모두에서 뺍니다.-d @body.json처럼 파일에서 본문을 읽는 명령은 왜 경고가 뜨나요?
data=open('body.json', 'rb'), Node.js는 fs.readFileSync('body.json'), Go는 os.Open("body.json")으로 연 파일을 요청 본문에 넘기면 됩니다. multipart 파일 업로드(-F file=@…)는 이와 달리 자리표시 코드까지 생성됩니다.Authorization 토큰은 생성된 코드에서 어떻게 다뤄야 하나요?
process.env.API_TOKEN과 .env 파일(.gitignore에 등록), Python은 os.environ['API_TOKEN']과 python-dotenv, Go는 os.Getenv("API_TOKEN")을 씁니다. 브라우저용 fetch·axios 코드에 비밀 키를 넣으면 누구나 개발자 도구로 볼 수 있으므로 반드시 백엔드를 거쳐 호출하세요. CI에서는 GitHub Actions Secrets 같은 저장소 비밀값, 운영 환경에서는 시크릿 매니저를 쓰는 편이 안전합니다. 화면 공유·캡처가 걱정되면 마스킹 옵션을 켜 코드 속 민감 헤더를 ***로 가리세요.GraphQL 요청도 변환되나요?
query·variables 필드를 가진 JSON을 POST로 보내는 일반 HTTP 요청이라 그대로 변환됩니다. 예시 탭의 GraphQL 카드를 적용해 보세요. 캐시·타입 생성이 필요한 앱이라면 Apollo Client, urql, graphql-request 같은 전용 클라이언트를 검토하는 것이 좋습니다.AWS S3 cURL을 변환하면 바로 쓸 수 있나요?
Authorization, x-amz-date, x-amz-content-sha256)은 요청 시각과 본문 해시를 넣어 계산하므로, 복사한 서명은 시간이 지나거나 본문이 바뀌면 거부됩니다. 이 도구는 헤더를 있는 그대로 옮기므로 학습·디버깅용으로 쓰고, 실제 코드는 서명을 자동으로 계산하는 SDK(JavaScript @aws-sdk/client-s3, Python boto3, Go aws-sdk-go-v2)를 쓰세요.입력한 cURL이나 토큰이 서버로 전송되나요?
-u 인증이 든 입력은 저장하지 않고 옵션만 저장합니다. 공용 PC에서 썼다면 개발자 도구 → Application → Local Storage에서 youtil_curl_v1 키를 지우세요.참고 자료
- curl 매뉴얼(새 창)curl.se
- Everything curl(새 창)everything.curl.dev
- MDN 금지 요청 헤더(새 창)developer.mozilla.org
- Go net/http(새 창)pkg.go.dev
- 계산 기준
- curl 공식 매뉴얼 옵션 정의 · WHATWG Fetch 금지 헤더 · 각 언어 표준 HTTP 클라이언트 문서
- 오류 제보
- 결과가 다르면 contact@youtil.kr로 입력 조건을 알려 주세요. 평일 기준 1~3일 안에 답변합니다.