Search
Duplicate

cURL이란?

간단소개
정보) cURL 사용하면 먼가 해커같아보이고 먼가 멋져보일 수 있다
팔만코딩경 컨트리뷰터
ContributorNotionAccount
주제 / 분류
잡지식
Shell
태그
shell
잡지식
Scrap
8 more properties

cURL이란?

cURL = ‘Client for URLs’
다양한 통신 프로토콜(HTTP/HTTPS, FTP, SCP, POP3 …)을 이용하여 데이터를 전송하기 위한 라이브러리와 커맨드 라인 도구를 제공하는 컴퓨터 소프트웨어 오픈소스 프로젝트.
현재 2022년 8월 31일 7.85.0 버전이 최신이다.

cURL 알쓸신잡

‘Client URL Request Library’로 대충 끼워맞출 수도 있다.
단순히 컴퓨터 뿐만 아니라 자동차, TV, 라우터, 프린터, 셋업 박스 등… 무수히 많이 쓰인다고…
웹 서버로부터 컨텐츠를 가져오는 wget 프로그램을 대체하기 위해 노력하고 있다.
wget vs. curl (영어 주의)
[kurl]로 발음할 수도 있지만, ‘see URL’로 발음해도 무방하다고…
프로그래밍 언어에서 cURL을 사용하고자 한다면, libcurl 라이브러리를 사용하면 된다.

cURL 설치

일반적으로 Linux 배포 환경에 cURL 패키지가 미리 설치되어 있다.
하지만 cURL이 설치되지 않았다면, 패키지 관리자를 사용하여 cURL을 설치하자.
# Ubuntu 예시 sudo apt update sudo apt install curl
Shell
Window에서 사용할 땐, MinGW로 빌드한 것보단, Visual Studio로 빌드한 버전을 사용하는게 좋다고…
바이너리 cURL 파일 다운로드 경로 : https://curl.se/download.html

cURL 사용법

curl [options] [URL...]
Shell
options에 POSIX 스타일로 한 개의 하이픈을 붙이거나, 두 개의 하이픈을 붙여서 처리할 수 있다. (이번 글에선 한 개의 하이픈 옵션만 소개합니다.)
아무런 옵션을 붙이지 않고, URL만 적는 경우, 해당 URL의 컨텐츠(HTML, file…)를 받아서 보여준다.
curl parrot.live .cccccccc. .,,,;;cc:cccccc:;;,. .cdxo;..,::cccc::,..;l. ,do:,,:c:coxxdllll:;,';:,. .cl;.,oxxc'.,cc,.';;;'...oNc ;Oc..cxxxc'.,c;..;lll;...cO; .;;',:ldxxxdoldxc..;lll:'...'c, ;c..cxxxxkxxkxxxc'.;lll:'','.cdc. .c;.;odxxxxxxxxxxxd;.,cll;.,l:.'dNc .:,''ccoxkxxkxxxxxxx:..,:;'.:xc..oNc .lc,.'lc':dxxxkxxxxxxxol,...',lx:..dNc .:,',coxoc;;ccccoxxxxxxxxo:::oxxo,.cdc. .;':;.'oxxxxxc''''';cccoxxxxxxxxxxxc..oc ,do:'..,:llllll:;;;;;;,..,;:lllllllll;..oc cNo.....................................oc
Shell

자주 사용되는 옵션

파일 다운로드 관련

-O : URL이 지시하는 파일과 동일한 이름으로 로컬에 파일을 저장한다.
-o 옵션을 사용하면 원하는 이름으로 로컬에 파일을 저장할 수 있다.
만약 위 플래그를 사용하지 않고 파일 주소를 curl 하려 한다면, 해당 파일의 바이너리 정보가 터미널을 어지럽게 할 수 있다는 메세지가 뜨면서 명령이 실행되지 않을 수 있다.
curl -O https://www.digitalocean.com/robots.txt # Output # 현재 디렉토리 위치에 robots.txt 파일이 저장된다. % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 286 0 286 0 0 5296 0 --:--:-- --:--:-- --:--:-- 5296 # 파일을 원하는 이름(가령 do-bots.txt)으로 저장하기 위해선... curl -o do-bots.txt https://www.digitalocean.com/robots.txt
Shell
-L : 만약 URL이 다른 URL로 redirect 하도록 설정되었다면(HTTP 301, HTTP 302 Response), redirect된 URL을 따라간다. 따라서, URL의 리다이렉트와 관계없이 파일을 바로 다운받고자 한다면, -L 옵션을 함께 사용하는 것이 좋다.
curl -L -o do-bots.txt www.digitalocean.com/robots.txt
Shell
-C : 만약 대용량 파일을 다운로드하다가 중간에 연결이 끊어졌을 경우, 다시 이어서 다운로드 할 수 있도록 한다.
curl -C - -O http://releases.ubuntu.com/18.04/ubuntu-18.04-live-server-amd64.iso
Shell

REST API 관련

-v : cURL이 요청을 처리하는 자세한 과정을 확인할 수 있다. (verbose)
-s : cURL이 요청을 처리하는 과정을 생략한다. (silent)
-X : 리퀘스트에 사용할 메서드(method) 종류를 명시한다.
GET, POST, DELETE, PUT, PATCH
-i : 헤더를 포함하여 서버의 응답 내용을 표시한다.
-I 옵션을 사용하면, 컨텐츠를 제외하고 헤더의 정보와 함께 서버의 응답을 표시한다.
curl -i https://randomuser.me/api/ HTTP/2 200 date: Fri, 30 Sep 2022 13:36:59 GMT content-type: application/json; charset=utf-8 x-powered-by: Express access-control-allow-origin: * cache-control: no-cache etag: W/"4a3-2FtEGJgIotz6KA7Wj3iNmMa5IPM" vary: Accept-Encoding cf-cache-status: DYNAMIC report-to: {"endpoints":[{"url":"..."}],"group":"cf-nel","max_age":604800} nel: {"success_fraction":0,"report_to":"cf-nel","max_age":604800} server: cloudflare cf-ray: 752d59bffc343d7c-HKG alt-svc: h3=":443"; ma=86400, h3-29=":443"; ma=86400 {"results":[{"gender": ...}]}
Shell
-H : 요청에 헤더를 추가하여 서버에 전송한다.
-A : User-agent를 변경하여, 특정 브라우저에서 전송하는 요청인 것처럼 에뮬레이트한다.
curl -X GET \ -H 'Accept: application/json' \ -H 'Authorization: Bearer 12345' \ -A 'Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Firefox/60.0' \ https://randomuser.me/api/
Shell

GET

API 주소일 경우, 별다른 옵션을 사용하지 않아도 GET 요청을 수행할 수 있다.
혹은 -X 옵션에 GET을 명시할 수 있다.
터미널에서 json 응답을 확인할 경우, jq 와 같은 프로그램을 사용할 수도 있지만, python3가 로컬에 설치되어 있다면, python3 -m json.tool 로 별다른 설치 없이 확인할 수도 있다.
curl https://randomuser.me/api/ | python3 -m json.tool curl -X GET https://randomuser.me/api/ | python3 -m json.tool # Output: { "results": [ { "gender": "male", "name": { "title": "Mr", "first": "Renato", "last": "V\u00e9liz" }, ... }
Shell
URL에 ? 로 파라미터를 지정하여 보낼 수도 있지만, -G 옵션과 -d 옵션을 함께 사용할 수도 있다.
일반적으로 -d 옵션은 POST 메서드 옵션이지만, -G 옵션과 함께 사용하면, URL 파라미터로 인식된다.
curl -G -d 'gender=female' https://randomuser.me/api/ | python3 -m json.tool # Output: { "results": [ { "gender": "female", "name": { "title": "Miss", "first": "Shobha", "last": "Gugale" }, ... }
Shell

POST

POST를 테스트할 수 있는 URL이 없어서 예제에 127.0.0.1을 사용하겠습니다…
-X POST 로 POST 요청을 보내지만, -d 옵션으로 데이터를 추가해서 보내는 경우, 자동으로 POST 요청으로 인식되기에, -X 옵션을 생략할 수 있다.
--data-urlencode 옵션을 사용하면, 데이터를 인코딩한다.
curl -d 'key=value' https://127.0.0.1/api curl --data-urlencode 'msg=메롱' https://127.0.0.1/api
Shell
JSON 형식으로 데이터를 보낼 수 있다.
하지만 content-type 헤더를 같이 지정해서 보내야 서버가 json 형식을 받을 수 있다.
curl -H 'Conetnt-Type: application/json' \ -d '{"a": "amoeba", "b": "boom"}'\ https://127.0.0.1/api
Shell
만약 파일을 POST하는 경우, 파일 이름 앞에 골뱅이(@)를 붙인다.
만약 text 데이터가 아니라면, --data-binary 옵션을 추가해야 한다.
curl -d @myBeautifulText http://127.0.0.1/trashbin curl --data-binary @myPreciousPicture http://127.0.0.1/trashbin
Shell

DELETE

GET와 비슷하게 사용하면 된다.
curl -G -d 'test=test' -X DELETE https://127.0.0.1/api
Shell

그 외…

유저-패스워드 인증이 필요한 URL이라면, -u 옵션을 사용하면 된다.
curl -u ID:PASSWORD https://127.0.0.1/youshallnotpass
Shell
만약 유효하지 않은 인증서를 사용하는 사이트여서 요청이 실패한다면, -k 옵션을 사용하면 된다.
curl -k -L https://trustme.fulltrust/api
Shell

참고자료

^^^ 위 사이트에 curl 관련 정보가 아주 잘 나와있습니다. (강추) ^^^