사용법
`curl ...` 명령을 붙여 넣으세요. 한 줄이든 백슬래시로 이어진 여러 줄이든, 값이 따옴표로 감싸졌든, API 문서가 제시하는 어떤 형태든 괜찮습니다. 파서가 메서드·URL·헤더·본문·인증으로 분해해 JavaScript fetch, axios, Python requests, Go `net/http` 동등 코드를 생성합니다. 탭을 전환해 대상 언어를 고르고 스니펫을 복사해 에디터에 붙여 넣으세요.
API 문서에 curl 예제가 있고 자신의 스택이 다른 언어일 때 사용하세요. 브라우저의 네트워크 요청을 리버스 엔지니어링할 때(Chrome·Firefox DevTools에서 우클릭 → cURL로 복사)나, Postman·Insomnia에서 요청을 작성해 동등 코드를 남기고 싶을 때도 유용합니다. 변환은 일반적인 옵션(`-X`, 여러 `-H` 헤더, `-d`·`--data`·`--data-raw`, Basic 인증의 `-u`, 멀티파트의 `--form`, `\`로 줄 잇기 등)을 다루지만, 출력이 실제로 동작하는지는 반드시 확인하세요. 언어마다 자체 이스케이프 규칙이 있고, curl→코드 변환기는 흔치 않은 플래그 조합의 의도까지 모두 추측하지는 못합니다.
자주 묻는 질문
DevTools "cURL로 복사" 출력이 매우 깁니다 — 다 중요한가요?
대부분은 브라우저가 자동으로 붙이는 헤더입니다 — `User-Agent`·`Accept-Language`·`sec-ch-ua-*`·`Cookie`·`Origin`·`Referer` 같은 것들입니다. 서버가 실제로 요구하는 것(보통 `Authorization`·`Content-Type`과 자체 `X-...` 헤더)으로 좁히세요. Cookie 헤더는 특히 세션에 묶여 있어 로그아웃 후에는 실패하게 됩니다. 서버 간 재현이 필요하다면 적절한 API 토큰을 받아 교체하세요. 본 컨버터는 주어진 입력을 모두 출력하므로 입력 측에서 좁히는 것이 올바른 사용법입니다.
`--data-raw`·`--data`·`--data-binary`의 차이는?
셋 다 요청 본문을 보냅니다. **`--data`·`-d`**는 줄바꿈과 `\r\n`을 제거해 form-urlencoded에는 충분하지만 JSON이나 의도된 공백이 든 내용은 손상시킵니다. **`--data-raw`**는 모든 것을 리터럴로 유지합니다(Chrome DevTools 기본 출력). **`--data-binary`**도 모두 유지하며 추가로 Content-Type 자동 추정을 하지 않습니다. stdin을 통한 파일 업로드나 바이너리 블롭에 쓰입니다. API 호출의 99%는 `--data-raw`가 무난하며 본 컨버터는 셋을 동등한 요청 본문으로 다룹니다.
`-k`나 `--cert` 같은 TLS·인증서 플래그도 처리되나요?
부분적으로 지원합니다. `-k`·`--insecure`(인증서 검증 비활성화)는 Node의 `rejectUnauthorized: false`, Python `requests`의 `verify=False`, Go의 `InsecureSkipVerify: true`로 매핑되어 경고와 함께 출력됩니다. 클라이언트 인증서 플래그(`--cert`·`--key`·`--cacert`)는 언어 간 이식성이 크게 낮아져 본 컨버터는 보통 주석으로 표시하고 손으로 배선하도록 합니다. 이 설정들은 어느 것도 보안 리뷰 없이 운영 코드에 들어가서는 안 됩니다.
변환된 코드가 동작하지 않습니다 — 왜죠?
흔한 원인입니다. **CORS**: 브라우저 fetch는 동일 출처와 프리플라이트 규칙을 강제하지만 curl은 이를 무시합니다. 터미널 curl이 동작해도 브라우저에서는 서버 측 협조(`Access-Control-Allow-Origin`)가 없으면 실패합니다. **Cookie 범위**: 브라우저 fetch는 페이지가 볼 수 있는 쿠키만 보내지만 `-b`를 단 curl은 작성한 것을 모두 보냅니다. **압축**: curl은 `--compressed`로 gzip·brotli를 자동 해제하지만 fetch와 `requests`는 명시 처리해야 합니다. **리다이렉트**: curl은 `-L`을 붙여야 따라가지만 대상 라이브러리 중에는 기본으로 따라가는 것도 있습니다. 스니펫은 반드시 한 번 실행해 실응답을 curl과 비교하고 헤더·옵션을 맞추세요.
Python 출력이 `requests`였다가 `httpx`였다가 하는 이유는?
이 도구는 기본적으로 `requests`를 출력합니다 — 가장 널리 쓰이고 이미 설치되어 있을 가능성도 높아서입니다. async나 HTTP/2 컨텍스트에서는 `httpx`가 거의 동일한 API의 현대적 선택이며 양쪽을 함께 제공하는 컨버터도 있습니다. `asyncio`에서 호출해야 한다면 `requests.post`를 `httpx.AsyncClient().post`로 바꾸세요. 나머지 호출은 동일합니다. Go 출력에서 `resty` 등 서드파티가 아닌 표준 라이브러리 `net/http`를 쓰는 이유도 같습니다 — 추가로 설치할 의존성이 없어서입니다.
역방향(코드 → curl) 변환도 되나요?
이 도구는 단방향(curl → 코드)입니다. 역방향은 Postman이 저장한 요청을 curl로 내보내고, Chrome DevTools 네트워크 패널이 캡처한 요청에도 같은 동작을 하며, Insomnia·Bruno도 마찬가지입니다. 프로그램적인 코드 → curl 변환은 흔치 않습니다. 언어별 HTTP 라이브러리에는 curl에 없는 기능(인터셉터·커넥션 풀·미들웨어)이 있어서 왕복되지 않기 때문입니다. "소스 코드"보다 "실제로 발생한 요청"에서 curl을 얻는 편이 더 신뢰할 수 있습니다.
관련 개념
curl(1997년, Daniel Stenberg 작)은 HTTP의 공통어입니다. 모든 Linux 배포판, macOS, Windows 10 이상, Docker 베이스 이미지, CI 러너에 포함되는 명령줄 클라이언트입니다. 구문은 문서 역할도 합니다. 임의의 HTTP 요청을 한 줄 curl로 표현할 수 있어 Stripe·GitHub·Twilio·AWS 등 대부분의 API 문서는 내부 SDK가 무엇이든 curl 예제를 함께 싣습니다. curl에서의 변환은 문서의 네이티브 형식에서 자신의 스택 형식으로 옮기는 일과 같습니다.
파싱은 보기보다 까다롭습니다. 셸 토큰화(따옴표·이스케이프·백슬래시 줄 잇기·`$variable` 치환)는 curl에 도달하기 전에 일어나므로 견고한 파서는 POSIX 셸을 충분히 흉내 내 입력을 올바르게 분리해야 합니다. 다음으로 각 플래그가 고유한 의미를 가집니다. `-d`는 메서드를 POST로 바꾸고 Content-Type을 설정하고, `-G`는 이를 뒤집어 GET + 쿼리 파라미터로, `-H`는 반복 가능, `-u user:pass`는 Basic 인증 헤더를 생성, `--data-urlencode key=value`는 값을 전송 전에 URL 인코드하는 식입니다. 본격적인 컨버터는 `man curl`에서 가져온 플래그 표를 보유하지만, 이 도구는 실환경 curl 명령의 99%에 등장하는 30여 개 플래그를 다룹니다.
인접한 3가지 개념이 있습니다. **OpenAPI·Swagger**는 같은 요청을 코드 생성기가 여러 언어로 클라이언트를 만들 수 있을 만큼 추상적으로 기술합니다. 단발성 curl→코드 문제에 대한 체계적 해답입니다. **HAR(HTTP Archive)**는 DevTools의 "모두 HAR로 저장"으로 내보내는 JSON 형식이며 헤더와 본문을 포함한 요청·응답 전체를 보존하고 `har2curl` 같은 도구로 curl이나 코드로 변환할 수 있습니다. **Postman·Insomnia·Bruno**는 같은 워크플로의 GUI 버전으로, curl을 붙여 넣으면 편집 가능한 요청이 되고 여러 언어로 익스포트할 수 있습니다. 이 컨버터는 curl과 에디터 코드를 가장 단순한 형태로 연결합니다.