HTTP 요청 테스터·curl 변환
HTTP 요청 보내기, 요청 코드 생성·curl 변환
HTTP 요청 보내기, 요청 코드 생성·curl 변환
URL·메서드·헤더·바디를 채워 실제 HTTP 요청을 보내고 응답을 그대로 확인합니다. curl 명령을 붙여넣어 불러오거나, 지금 만든 요청을 curl 로 복사할 수도 있습니다.
보낼 주소를 입력하면 이 요청이 어디로 가는지 여기에 표시됩니다.
이 도구가 요청을 보내는 방식 (자세히)
- 기본은 직접 전송입니다. ‘보내기’를 누르면 브라우저가 대상 서버로 직접 요청합니다. 이 경우 요청 내용은 저희 서버를 지나가지 않습니다.
- 브라우저가 막는 경우가 있습니다. 대상 서버가 응답에
Access-Control-Allow-Origin(CORS)을 붙이지 않으면 브라우저가 응답을 읽지 못하게 막습니다. 대부분의 실서비스 API 가 그렇습니다. - 그때만 중계를 제안합니다. 직접 전송이 막히면 ‘서버를 거쳐 다시 보내기’ 버튼이 나타납니다. 이 버튼을 누를 때만, 요청 주소·헤더·바디가 저희 중계 서버(api.everytooleverywhereallatonce.com, Cloudflare Worker)를 지나 대상 서버로 전달됩니다. Authorization·Cookie 같은 인증 값도 그대로 지나갑니다.
- 중계 서버는 요청 내용을 저장하지 않습니다. 받은 즉시 대상 서버로 넘기고, 응답을 그대로 돌려준 뒤 버립니다. 로그에도 남기지 않습니다. 저장되는 건 남용을 막기 위한 IP별 ‘요청 횟수’ 카운터뿐입니다.
- 중계할 때
x-forwarded-*·cf-*·host처럼 접속 IP 를 위조할 수 있는 헤더는 제거합니다.User-Agent를 직접 지정하지 않으면 이 도구임을 밝히는 값이 붙습니다. - 사설망·localhost 주소는 중계하지 않습니다(내부망 스캔 방지). 그런 주소는 직접 전송으로만 확인할 수 있습니다.
- 제한: 요청 바디 512KB · 응답 2MB(넘으면 잘림) · 20초 타임아웃 · IP당 분당 20회.
curl 명령 불러오기 / 내보내기
끄면 리다이렉트 응답 자체를 봅니다. 브라우저 직접 전송에서는 끄더라도 응답 내용을 읽을 수 없습니다(브라우저 제약).
탭을 닫으면 해제됩니다. 켜두더라도 응답마다 어느 경로로 받아왔는지 배지로 표시됩니다.
이 요청을 저희 서버를 거쳐 보냅니다
지금부터 이 요청은 브라우저에서 대상 서버로 곧장 가지 않고, 저희 중계 서버(api.everytooleverywhereallatonce.com)를 한 번 지나갑니다. 계속하기 전에 아래를 확인해 주세요.
- 요청 주소·헤더·바디 전체가 저희 서버를 지나갑니다. Authorization·Cookie·API 키를 넣었다면 그 값도 포함됩니다.
- 저희 서버는 그 내용을 저장하지도, 로그로 남기지도 않습니다. 받아서 대상 서버로 넘기고 응답을 돌려준 뒤 버립니다.
- 대상 서버가 보는 접속 IP 는 당신이 아니라 저희 중계 서버의 IP 가 됩니다.
- 중요한 실서비스 자격증명 대신 테스트용 키를 쓰는 것을 권합니다.
사용법
- 메서드와 주소를 넣고 ‘보내기’를 누르면 됩니다. 헤더 탭에서 이름·값을 줄 단위로 추가하고, 바디 탭에 JSON 등을 붙여넣습니다.
- 브라우저 개발자도구에서 ‘Copy as cURL’ 한 명령을 그대로 붙여넣고 ‘불러오기’를 누르면 메서드·주소·헤더·바디가 채워집니다.
- 브라우저는 User-Agent·Cookie·Referer 같은 일부 헤더를 스크립트가 지정하지 못하게 막습니다. 그런 헤더를 적으면 헤더 탭 아래에 알려줍니다.
- 직접 전송에서는 응답 헤더도 CORS 안전 목록(Content-Type·Cache-Control 등)만 보입니다. 전체 응답 헤더가 필요하면 서버를 거쳐 보내세요.
- 입력한 내용은 어디에도 저장하지 않습니다 — 새로고침하면 사라집니다.
요청이 어디로 가는지
- 기본 경로 — 브라우저 → 대상 서버. ‘보내기’는 언제나 브라우저에서 직접 보내는 것으로 시작합니다. 이때 요청은 저희 서버를 지나가지 않고, 대상 서버가 보는 접속 IP 도 당신의 IP 입니다.
- 중계 경로 — 브라우저 → api.everytooleverywhereallatonce.com → 대상 서버. 직접 전송이 CORS 로 막혔을 때, 당신이 ‘서버를 거쳐 다시 보내기’를 눌렀을 때만 사용됩니다. 자동으로 전환되지 않습니다(‘이번 방문 동안 자동 재시도’를 직접 켠 경우는 제외하며, 그때도 응답마다 경로 배지가 붙습니다).
- 중계 서버가 하는 일. 요청을 받아 대상 서버로 그대로 전달하고, 응답을 그대로 돌려줍니다. 요청 주소·헤더·바디·응답을 저장하거나 로그로 남기지 않으며, 캐시하지도 않습니다. 남는 것은 남용 방지를 위한 IP별 요청 횟수 카운터뿐입니다.
- 중계 서버가 바꾸는 것. 접속 IP 를 위조할 수 있는 헤더(
x-forwarded-*,cf-*,forwarded,host등)와 연결 단위 헤더는 제거합니다.User-Agent를 지정하지 않으면 이 도구임을 밝히는 값을 붙여, 대상 서버 운영자가 트래픽의 정체를 알 수 있게 합니다. - 중계하지 않는 것. localhost·사설망·클라우드 메타데이터 주소로는 중계하지 않습니다. 그런 주소는 브라우저 직접 전송으로만 확인할 수 있습니다.
- 제한. 요청 바디 512KB, 응답 2MB(초과분 잘림), 20초 타임아웃, IP당 분당 20회.
- 이 도구는 이 사이트에서 몇 안 되는 ‘서버를 지나갈 수 있는’ 도구입니다. 그 경우와 처리 방식은 개인정보처리방침 4항에 적혀 있습니다.
불러오는 중…
처리 중…
0.0
멈춘 것이 아닙니다. 계산이 끝나면 결과가 표시됩니다.
HTTP 요청 테스터·curl 변환 소개
이 페이지에는 세 가지 모드가 있습니다. 요청 테스트는 실제로 요청을 보내고 응답을 보여 주고, 요청 빌더는 쿼리 파라미터·헤더·바디를 표로 채워 curl 명령을 만들어 주며(보내지는 않습니다), curl 변환은 curl 명령을 JavaScript fetch, Python requests, Node.js axios, PHP cURL 코드로 옮깁니다.
요청 테스트는 기본적으로 여러분 브라우저가 대상 서버로 직접 fetch를 보냅니다. 그래서 터미널의 curl로는 200이 나오는 API가 여기서는 실패하는 일이 흔합니다. 아래에서는 그 이유와, 실패했을 때 무엇을 선택할 수 있는지를 설명합니다.
curl은 되는데 브라우저에서는 안 되는 이유
브라우저는 페이지와 출처(스킴+호스트+포트)가 다른 서버의 응답을, 그 서버가 Access-Control-Allow-Origin 헤더로 허락하지 않으면 스크립트에 넘겨주지 않습니다. 이것이 CORS입니다. curl에는 「페이지」라는 개념이 없어 이 규칙이 적용되지 않습니다. 결제·지도·공공데이터 API 대부분은 서버 대 서버 호출을 전제로 해서 이 헤더를 주지 않습니다.
요청이 「단순 요청」이 아니면 브라우저는 본 요청 전에 OPTIONS 메서드로 사전 요청(preflight)을 먼저 보냅니다. Content-Type: application/json을 붙이거나, Authorization 같은 헤더를 넣거나, PUT·DELETE를 쓰면 preflight 대상입니다. 서버가 OPTIONS에 Access-Control-Allow-Methods·Allow-Headers로 답하지 않으면 본 요청은 아예 나가지 않습니다. 같은 API라도 GET은 되고 JSON POST는 안 되는 경우가 이것입니다.
CORS 차단과 DNS 실패·연결 거부는 브라우저가 스크립트에 똑같이 「Failed to fetch」(TypeError)로만 알려 줍니다. 보안상 일부러 구분하지 않는 것이라, 이 도구도 둘을 「CORS 또는 네트워크」로 묶어 표시합니다. 개발자 도구 콘솔에는 실제 원인이 찍히니 거기서 확인하세요. 따로 판별되는 경우는 두 가지뿐입니다. 이 페이지는 https라 http:// 주소는 혼합 콘텐츠로 막히고, 취소 버튼을 누른 경우입니다.
직접 보낼 때 브라우저가 바꾸는 것
- Cookie, Host, Origin, Referer, Content-Length, Connection 같은 금지 헤더는 스크립트가 설정할 수 없어 조용히 빠집니다. 도구는 입력하는 즉시 이름을 표시합니다(User-Agent도 같은 이유로 안내합니다).
- 쿠키는 보내지 않습니다. fetch를 credentials: omit으로 호출하므로, 여러분이 그 사이트에 로그인해 있어도 세션이 실려 가지 않습니다.
- 응답 헤더는 Cache-Control, Content-Language, Content-Length, Content-Type, Expires, Last-Modified, Pragma만 보입니다. 서버가 Access-Control-Expose-Headers로 더 열어 주지 않으면 X-RateLimit-Remaining 같은 값은 읽을 수 없습니다.
- 「리디렉션 따라가기」를 끄면 브라우저는 3xx 응답을 내용 없는 opaqueredirect로 돌려줍니다. 상태 코드와 Location을 보려면 중계 경로를 써야 합니다.
중계(프록시)로 보낼 때
직접 전송이 막힌 뒤 「서버를 통해 보내기」를 누르면, 요청이 이 사이트의 중계 서버를 거쳐 대상에 갑니다. 서버 대 서버라 CORS가 없고 금지 헤더도 그대로 전달됩니다. 대신 URL·헤더·바디 전체가 중계 서버를 지나가므로, 도구는 Authorization이나 api_key처럼 보이는 항목 이름을 짚어 동의를 받습니다. 운영 키보다 테스트 키를 쓰는 편이 낫습니다.
제한: 요청 바디 512KB, 응답 2MB(초과분 잘림), 대기 20초, IP당 분당 20회. localhost·사설 IP(10.x, 192.168.x 등)·클라우드 메타데이터 주소는 중계하지 않으므로 사내 개발 서버는 직접 전송으로만 시험할 수 있습니다. 대상 서버에는 여러분 IP가 아니라 중계 서버 IP가 찍힙니다.
curl 옵션이 어떻게 옮겨지는가
개발자 도구의 「Copy as cURL」 결과를 붙여 넣으면 다음 규칙으로 메서드·URL·헤더·바디가 채워집니다.
- -d, --data-raw, --data-binary: 바디가 되고, -X가 없으면 POST, Content-Type이 없으면 application/x-www-form-urlencoded가 붙습니다(curl 자체의 동작과 같음). 여러 개는 &로 이어집니다. -d @파일처럼 @로 시작하는 값은 curl이라면 파일 내용을 읽지만 여기서는 파일을 읽을 수 없어 글자 그대로 바디에 넣고 경고를 띄웁니다. 이 도구가 만드는 curl 명령은 이런 오해가 없도록 바디를 --data-raw로 넘깁니다.
- --json: 바디와 함께 Content-Type·Accept: application/json을 추가합니다.
- -G: -d 데이터를 URL 쿼리로 옮기고 GET으로 보냅니다. --data-urlencode 값은 퍼센트 인코딩됩니다.
- -u user:pass: Authorization: Basic 헤더로 바뀝니다. 단 -H로 Authorization을 직접 줬다면 curl처럼 -H 값을 쓰고 -u는 무시한 뒤 알려 줍니다. -I는 HEAD, -b는 Cookie 헤더, -A는 User-Agent, -e는 Referer입니다.
- -F(파일 업로드), -T, --proxy, 인증서 옵션은 옮기지 못하고 경고를 띄웁니다. -k는 브라우저도 중계도 인증서 검사를 끌 수 없어 무시됩니다. -L, -s, --compressed 같은 출력용 옵션은 조용히 무시됩니다.
요청 빌더와 curl 변환 모드
요청 빌더는 체크된 행만 쿼리스트링에 encodeURIComponent로 붙이고, 바디 종류가 JSON이면 먼저 JSON.parse로 검사해서 틀리면 명령을 만들지 않습니다. JSON이나 폼을 고르고 Content-Type을 비워 두면 알맞은 값이 자동으로 들어갑니다. 결과 명령은 바디를 --data-raw로 넘기는데, -d는 값이 @로 시작하면 파일 이름으로 읽기 때문입니다.
curl 변환은 같은 curl 명령을 네 언어 코드로 씁니다. 언어마다 관용 표현이 달라서 -u는 fetch·axios에서는 Basic 헤더로, requests에서는 auth=("user", "pass")로, PHP에서는 CURLOPT_USERPWD로 나옵니다. -k는 requests에서 verify=False가 되지만, 브라우저 fetch에는 인증서 검사를 끄는 방법이 없습니다.
예시
Copy as cURL 결과 불러오기
- 입력
curl 'https://api.example.com/v1/items?page=2' -H 'Authorization: Bearer abc' -u admin:secret --json '{"name":"pen"}' -k -F file=@a.png- 결과
POST https://api.example.com/v1/items?page=2 Authorization: Bearer abc Content-Type: application/json Accept: application/json 바디: {"name":"pen"} 경고: -k 무시, -F 파일 업로드 미지원, -H Authorization이 있어 -u 무시
-H Authorization과 -u가 함께 있으면 curl은 직접 준 -H 값을 보내고 -u로 만든 Basic 헤더는 버립니다. 이 도구도 같게 처리해 Authorization을 한 줄만 남기고 경고로 알립니다. Basic 인증을 쓰려면 -H 줄을 지우고 다시 가져오세요(admin:secret은 Basic YWRtaW46c2VjcmV0이 됩니다).
-G로 쿼리 만들기
- 입력
curl -G https://api.example.com/search -d q=hello --data-urlencode 'city=São Paulo'- 결과
GET https://api.example.com/search?q=hello&city=S%C3%A3o+Paulo
ã는 UTF-8 두 바이트(C3 A3)로 인코딩되고, 쿼리에서는 공백이 +로 표기됩니다.
curl 변환: Python requests
- 입력
curl -X POST https://api.example.com/v1/items -H 'Content-Type: application/json' -u admin:secret -d '{"name":"pen"}'- 결과
headers = {"Content-Type": "application/json"} data = "{\"name\":\"pen\"}" auth = ("admin", "secret") requests.request("POST", url, headers=headers, data=data, auth=auth)
바디를 json=이 아니라 data= 문자열로 넘기므로 curl과 똑같은 바이트가 전송됩니다.
사용 방법
- 메서드와 URL을 입력하거나 curl 명령을 붙여 넣고 불러오기를 누릅니다.
- 헤더·바디 탭을 채우고 보내기를 누릅니다.
- CORS로 막히면 원인 안내를 읽고, 필요할 때만 서버를 통해 다시 보냅니다.
- 코드가 필요하면 빌더나 curl 변환 탭에서 명령·코드를 복사합니다.
자주 묻는 질문
Postman에서는 되는데 여기서는 CORS 오류가 납니다.
Postman 데스크톱 앱은 브라우저가 아니라 CORS 검사를 하지 않습니다. 이 도구의 직접 전송은 브라우저 규칙을 그대로 따르므로, 서버가 CORS를 허용하지 않으면 중계로 보내야 합니다.
내 API가 CORS를 제대로 설정했는지 확인할 수 있나요?
직접 전송으로 보내 보면 됩니다. 성공하면 이 사이트 출처에 대해 허용된 것이고, 실패하면 콘솔 메시지에서 어느 헤더가 빠졌는지 볼 수 있습니다. 중계 성공은 CORS와 무관합니다.
localhost API를 시험할 수 있나요?
직접 전송으로만 됩니다. 로컬 서버가 이 사이트 출처를 CORS로 허용하고 https 또는 브라우저가 허용하는 방식으로 열려 있어야 합니다. 중계는 사설 주소를 거부합니다.
응답 헤더가 몇 개밖에 안 보입니다.
직접 전송에서는 CORS 안전 목록에 있는 헤더만 스크립트가 읽을 수 있습니다. 전부 보려면 서버를 통해 보내세요.
출처
- MDN: Cross-Origin Resource Sharing (CORS)
- WHATWG Fetch Standard: forbidden request header
- WHATWG Fetch Standard: CORS-safelisted response-header name
- curl man page
- MDN: Mixed content
기준일: