cURL → 코드 변환기

curl 명령을 붙여 넣으면 fetch / axios / Go net/http / Python requests에 해당하는 코드를 생성합니다. `-X` / `-H` / `-d` / `-u` / `--form` / 백슬래시 줄바꿈을 지원합니다.

Loading…

모든 처리는 브라우저 내부에서 실행됩니다 — 파일·입력은 서버로 전송되지 않습니다.

사용법

`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→코드 변환기는 흔치 않은 플래그 조합의 의도까지 모두 추측하지는 못합니다.

예제

인증 헤더가 있는 단순한 GET

입력
curl https://api.example.com/users/42 \
  -H "Authorization: Bearer eyJhbGciOi..." \
  -H "Accept: application/json"
출력
// fetch
await fetch("https://api.example.com/users/42", {
  headers: {
    "Authorization": "Bearer eyJhbGciOi...",
    "Accept": "application/json",
  },
});

# requests
requests.get(
  "https://api.example.com/users/42",
  headers={
    "Authorization": "Bearer eyJhbGciOi...",
    "Accept": "application/json",
  },
)

본문 없는 GET이 가장 단순한 경우입니다. `\`로 줄을 이은 여러 줄 입력은 파싱 전에 한 줄로 합쳐지므로 붙여 넣은 순서나 공백은 영향을 주지 않습니다. 출력은 모두 헤더명 대소문자를 원본 그대로 유지합니다. HTTP 헤더는 본래 대소문자를 구분하지 않지만, 드물게 문자열을 엄격하게 비교하는 버그가 있는 서비스가 있기 때문입니다.

JSON 본문의 POST

입력
curl -X POST https://api.example.com/orders \
  -H "Content-Type: application/json" \
  -d '{"item_id": 42, "quantity": 2}'
출력
// fetch
await fetch("https://api.example.com/orders", {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({ "item_id": 42, "quantity": 2 }),
});

# requests
requests.post(
  "https://api.example.com/orders",
  json={"item_id": 42, "quantity": 2},
)

curl의 `-d`·`--data` 플래그는 묵시적으로 메서드를 POST로 바꾸고 `-H`로 덮어쓰지 않는 한 `Content-Type: application/x-www-form-urlencoded`를 설정합니다. 이 컨버터는 JSON 본문을 감지해 언어별 관용 헬퍼(JS의 `JSON.stringify`, Python의 `json=` 인자처럼 Content-Type을 자동 설정하는 방식)를 출력합니다. 리터럴 form-urlencoded 데이터를 보내고 싶다면 `-d "key=value&key=other"`로 쓰면 컨버터가 `URLSearchParams`·`data=`로 전환합니다.

인증이 있는 멀티파트 업로드

입력
curl -X POST https://api.example.com/upload \
  -u admin:secret \
  --form "[email protected]" \
  --form "caption=hello"
출력
// fetch
const form = new FormData();
form.append("file", fileInput.files[0]);
form.append("caption", "hello");
await fetch("https://api.example.com/upload", {
  method: "POST",
  headers: { "Authorization": "Basic " + btoa("admin:secret") },
  body: form,
});

# requests
requests.post(
  "https://api.example.com/upload",
  auth=("admin", "secret"),
  files={"file": open("photo.jpg", "rb")},
  data={"caption": "hello"},
)

`--form`은 multipart/form-data를 만듭니다. `-u user:pass`는 HTTP Basic 인증으로 변환되며, Python `requests`는 튜플 인자를 쓰고 JS fetch는 `Basic ` + `user:pass`의 base64를 직접 만들어야 합니다. curl의 `@filename` 구문은 디스크에서 파일을 읽지만 JS 출력은 브라우저에서 이를 재현할 수 없어 폼 입력에서 얻은 `File`을 기대하는 형태(스니펫에 주석이나 힌트 포함)로 내놓습니다. 실제 소스로 바꿔 넣으세요.

자주 묻는 질문

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과 에디터 코드를 가장 단순한 형태로 연결합니다.

관련 글

관련 도구