cURL 코드 변환기

cURL 명령어를 Python requests, JavaScript fetch, Go net/http, PHP curl, Node.js axios 코드로 즉시 변환. 회원가입 불필요, 브라우저에서 실행.

  • 브라우저에서 처리
  • 데이터가 브라우저 밖으로 나가지 않습니다
  • 무료 · 회원가입 불필요
현재 명령어를 변환하세요. 코드 맨 위에 나오는 미변환 옵션을 확인하세요. Ctrl/⌘+Enter로도 변환할 수 있습니다. 명령어를 수정하는 것만으로는 변환하지 않습니다.
Content-Type과 Authorization 헤더가 있는 JSON POST 예시로 입력을 바꾸고 선택한 언어로 변환합니다.
명령어, 생성 코드, 상태를 지우고 선택한 언어는 유지합니다. 도구 안에서 Ctrl/⌘+L로도 지울 수 있습니다.
출력 언어 Python, JavaScript, Go, PHP, Node.js 중 선택하세요. 탭은 마지막으로 변환한 명령의 코드를 생성합니다. 명령을 수정한 뒤에는 변환을 눌러 적용하세요.
cURL 명령어를 입력하세요. 백슬래시 줄 연결과 DevTools의 Copy as cURL (bash) 따옴표를 지원합니다. 요청을 전송하지 않고 코드만 생성합니다.
생성 코드
선택한 언어의 표시된 코드 전체를 복사합니다. 빈 출력은 복사하지 않습니다. 프로젝트에서 실행하기 전에 생성된 요청을 검토하세요.

cURL 명령어를 입력하거나 예시를 불러온 뒤 코드로 변환하세요.

예시·자세한 설명·자주 묻는 질문 실제 출력이 있는 예시, 다른 도구와의 차이, 자주 묻는 질문.

주요 사용 사례

  • API 통합: 문서의 cURL 예제를 원하는 언어로 변환.
  • 디버깅: 브라우저 DevTools에서 복사한 cURL을 코드로 변환하여 테스트.
  • 팀 협업: cURL에 익숙하지 않은 팀원에게 요청 내용 설명.
  • 빠른 개발: 보일러플레이트 없이 HTTP 요청 빠르게 구현.

예시: JSON POST 요청

curl -X POST https://api.example.com/users \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer TOKEN" \
  -d '{"name": "Alice", "email": "alice@example.com"}'

Python 출력:

import requests

headers = {
    "Content-Type": "application/json",
    "Authorization": "Bearer TOKEN",
}

data = "{\"name\": \"Alice\", \"email\": \"alice@example.com\"}"

response = requests.post(
    "https://api.example.com/users",
    headers=headers,
    data=data,
    allow_redirects=False,
)
print(response.text)

Go 출력:

package main

import (
	"fmt"
	"io"
	"log"
	"net/http"
	"strings"
)

func main() {
	body := strings.NewReader("{\"name\": \"Alice\", \"email\": \"alice@example.com\"}")
	req, err := http.NewRequest("POST", "https://api.example.com/users", body)
	if err != nil {
		log.Fatal(err)
	}
	req.Header.Add("Content-Type", "application/json")
	req.Header.Add("Authorization", "Bearer TOKEN")

	client := &http.Client{
		CheckRedirect: func(req *http.Request, via []*http.Request) error {
			return http.ErrUseLastResponse
		},
	}
	resp, err := client.Do(req)
	if err != nil {
		log.Fatal(err)
	}
	defer resp.Body.Close()

	respBody, err := io.ReadAll(resp.Body)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(string(respBody))
}

본문은 입력한 문자열 그대로라서 서버가 받는 바이트는 curl과 같습니다. allow_redirects=False와 http.ErrUseLastResponse가 있는 이유는 curl이 -L 없이는 리다이렉트를 따라가지 않지만 requests와 Go의 http.Client는 기본으로 따라가기 때문입니다. Go 코드는 오류를 버리지 않고 모든 오류에서 log.Fatal로 멈춥니다.

코드 검증 방법

도구의 테스트는 각 예시 명령을 로컬 HTTP 서버로 두 번 보냅니다. 한 번은 실제 curl, 한 번은 생성한 Python, Go, JavaScript 코드입니다. 서버는 메서드, 경로와 쿼리, 헤더, 본문을 비교합니다. multipart 본문은 경계 문자열이 무작위라서 파트별로 비교합니다. Node.js 출력은 node --check로 ES 모듈인지 확인합니다. 예시는 여러 개의 -d, -G, --json, --data-urlencode, -F 파일 업로드, -d @file, Basic 인증, HEAD, -L 유무에 따른 리다이렉트, Chrome이 쓰는 $'...' 따옴표를 포함합니다.

옵션 변환 방식

규칙은 curl 매뉴얼을 따릅니다:

curl생성 코드
-X, --requestHTTP 메서드. 없으면 데이터가 있는 요청은 POST
-H, --header헤더(이름과 값 그대로). Name;은 빈 값을 보냄
-d, --data, --data-ascii, --data-raw, --data-binary본문. 여러 개면 &로 연결. Content-Type 헤더가 없으면 curl과 같이 Content-Type: application/x-www-form-urlencoded를 붙임
-d @file, --data-binary @file코드가 파일을 읽음. -d는 curl과 같이 CR과 LF를 제거
--data-urlencodename=content, =content, content를 URL 인코딩(공백은 +)
--json본문, Content-Type: application/json, Accept: application/json, POST. 여러 개면 & 없이 이어 붙임
-G, --get데이터를 쿼리 문자열에 넣고 메서드는 GET
-F, --formmultipart 본문: name=value, name=@file(업로드, ;type=과 ;filename= 지원), name=<file(파일 내용을 값으로). 경계가 있는 Content-Type은 라이브러리가 씀
-u user:passwordAuthorization: Basic … 헤더(alice:s3cret → Basic YWxpY2U6czNjcmV0)
--oauth2-bearer, -A, -e, -b name=valueAuthorization: Bearer, User-Agent, Referer, Cookie 헤더
-I, --headHEAD 요청
-L리다이렉트를 따라감. 없으면 따라가지 않음
--url, --url-queryURL과 쿼리 문자열. 스킴이 없는 URL에는 curl처럼 http://를 붙임
-s, -S, -v, -i, -o, -w, --compressed뺌(curl의 출력이나 저장만 바꿈)
그 밖의 옵션과 -k코드 맨 위 주석과 상태 표시줄에 표시. -k가 있어도 코드는 TLS 검증을 유지

옵션은 묶어 쓰거나(-sSL) 값을 붙여 쓸 수 있습니다(-XPUT, -H'X: 1'). curl 8.7에 없는 옵션은 오류가 나며 URL로 읽히지 않습니다.

실행 전에 확인할 것

  • **JavaScript(fetch)**는 페이지 안에서 실행되므로 로컬 경로를 열 수 없습니다. 업로드할 파일과 @file 본문은 <input type="file">에서 가져오며, 주석에 적힌 순서대로 고릅니다. fetch는 리다이렉트도 따라가고, Cookie, Host 같은 금지된 요청 헤더는 브라우저가 뺍니다.
  • JavaScript 탭의 name=<file 텍스트는 CRLF 줄바꿈으로 전송됩니다. FormData가 HTML 폼 인코딩 규칙에 따라 텍스트 값의 줄바꿈을 맞추기 때문입니다. Python, Go, PHP, Node.js는 파일 내용을 그대로 보냅니다.
  • Node.js는 axios를 쓰며 4xx, 5xx 응답에서 예외를 던집니다(curl은 던지지 않음). maxRedirects: 0은 -L 없는 curl에 맞춘 것이라 3xx 응답에서도 예외가 납니다. 파일 업로드는 fs.openAsBlob을 쓰므로 Node.js 19.8 이상이 필요합니다.
  • PHP에서는 같은 이름의 -F 필드가 하나만 전송됩니다. PHP 배열은 키마다 값을 하나만 가지기 때문입니다.
  • $VAR, $(...), 파이프 같은 셸 문법은 펼치지 않습니다. "$TOKEN"은 글자 그대로 $TOKEN이 됩니다.

브라우저에서 요청 복사하기

Chrome이나 Edge 개발자 도구의 Network 패널에서 요청을 오른쪽 클릭하고 **Copy → Copy as cURL (bash)**를 고릅니다. 값에 따옴표나 줄바꿈이 있으면 이 형식은 $'...' 따옴표를 쓰며, 변환기는 이를 읽습니다. Windows에서도 bash 버전을 고르세요. cmd 버전은 ^로 이스케이프하며 이 변환기는 읽지 않습니다. 이렇게 복사한 요청에는 쿠키와 토큰이 들어 있는 경우가 많지만, 이 페이지는 분석 도구와 광고를 불러오지 않으며 변환은 브라우저에서 이루어집니다.

FAQ

어떤 cURL 플래그를 지원하나요?

curl 8.7의 모든 옵션을 읽습니다. 변환하는 옵션은 -X, -H, -d / --data / --data-raw / --data-binary / --data-ascii / --data-urlencode, --json, -G, -F / --form-string(파일 업로드 포함), -u, --oauth2-bearer, -A, -e, -b, -I, -L, --url, --url-query입니다. curl의 출력만 바꾸는 옵션(-s, -v, -o, -i, --compressed)은 빼고, 그 밖의 옵션은 코드 맨 위 주석에 적습니다.

cURL 명령어가 서버로 전송되나요?

아니요. 모든 파싱과 코드 생성은 JavaScript를 통해 브라우저 내에서 완전히 처리됩니다. 명령어나 포함된 인증 정보는 기기 밖으로 나가지 않습니다.

생성된 코드에 await가 사용되는 이유는?

JavaScript(fetch) 코드는 브라우저 콘솔과 ES 모듈에서 실행됩니다. Node.js 코드는 ES 모듈(import axios from 'axios')이라 최상위 await를 쓸 수 있습니다. .mjs 파일로 저장하거나 package.json에 "type": "module"이 있는 프로젝트에 두세요.

Basic Auth 인증은 어떻게 처리되나요?

-u user:password는 Authorization: Basic 헤더가 되며, 값은 user:password의 UTF-8 바이트를 Base64로 바꾼 것으로 curl이 보내는 값과 같습니다. 콜론이 없으면 curl이 비밀번호를 물어보므로 -u user는 변환하지 않은 옵션으로 표시합니다.

여러 줄로 된 cURL 명령어도 지원하나요?

완전히 지원됩니다. 백슬래시로 줄을 연속한 여러 줄 cURL 명령어를 그대로 붙여넣으면 올바르게 처리됩니다.