cURL이란?
•
cURL = ‘Client for URLs’
•
다양한 통신 프로토콜(HTTP/HTTPS, FTP, SCP, POP3 …)을 이용하여 데이터를 전송하기 위한 라이브러리와 커맨드 라인 도구를 제공하는 컴퓨터 소프트웨어 오픈소스 프로젝트.
•
현재 2022년 8월 31일 7.85.0 버전이 최신이다.
cURL 알쓸신잡
•
‘Client URL Request Library’로 대충 끼워맞출 수도 있다.
•
단순히 컴퓨터 뿐만 아니라 자동차, TV, 라우터, 프린터, 셋업 박스 등… 무수히 많이 쓰인다고…
•
웹 서버로부터 컨텐츠를 가져오는 wget 프로그램을 대체하기 위해 노력하고 있다.
◦
•
[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 관련 정보가 아주 잘 나와있습니다. (강추) ^^^