메뉴

문서정보

목차

CURL 예제

웹 서버에 대한 배치작업이 필요한 경우가 있다. 이런 작업에 웹 브라우저를 사용할 수 없는 노릇이니 CLI 도구를 사용해야 한다. curl은 가장 널리 사용하는 인터넷 데이터 전송을 위한 도구다.

CURL 버전확인

# curl --version
curl 7.58.0 (x86_64-pc-linux-gnu) libcurl/7.58.0 OpenSSL/1.1.0g zlib/1.2.11 libidn2/2.0.4 libpsl/0.19.1 (+libidn2/2.0.4) nghttp2/1.30.0 librtmp/2.3
Release-Date: 2018-01-24
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtmp rtsp smb smbs smtp smtps telnet tftp 
Features: AsynchDNS IDN IPv6 Largefile GSS-API Kerberos SPNEGO NTLM NTLM_WB SSL libz TLS-SRP HTTP2 UnixSockets HTTPS-proxy PSL 

파일 다운로드

$ curl -O http://yourdomain.com/yourfile.tar.gz  # yourfile.tar.gz 으로 저장된다.
$ curl -o newfile.tar.gz http://yourdomain.com/yourfile.tar.gz # newfile.tar.gz 으로 저장된다.

-C 옵션을 이용해서 이어받기를 할 수 있다. 네트워크 문제 등으로 다운로드가 끊겼을 때 유용하게 사용 할 수 있다. -C 다음에 -를 주면 된다.
# 중간에 Ctrl+C로 연결을 끊었다. 
$ curl -O http://mirror.kakao.com/ubuntu-releases/18.10/ubuntu-18.10-desktop-amd64.iso 
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  1 1906M    1 26.2M    0     0  22.1M      0  0:01:26  0:00:01  0:01:25 22.1M^C

# 이어 받기 하는 걸 확인 할 수 있다.
$ curl -C - -O http://mirror.kakao.com/ubuntu-releases/18.10/ubuntu-18.10-desktop-amd64.iso
** Resuming transfer from byte position 46292992
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  4 1862M    4 81.2M    0     0  30.4M      0  0:01:01  0:00:02  0:00:59 30.4M

두 개 이상의 파일을 다운로드 할 수 있다.
$ curl -O http://yoursite.com/info.html -O http://mysite.com/about.html 

파일에 있는 URL로 부터 다운로드 하기

# cat listurls.txt
https://www.joinc.co.kr/w/FrontPage
https://www.joinc.co.kr/w/man/1/at
https://www.joinc.co.kr/w/man/12/Kafka/QuickStart
# xargs -n 1 curl -O < listurls.txt
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 25110    0 25110    0     0   415k      0 --:--:-- --:--:-- --:--:--  415k
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 18986    0 18986    0     0   240k      0 --:--:-- --:--:-- --:--:--  240k
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 32524    0 32524    0     0   365k      0 --:--:-- --:--:-- --:--:--  365k
FrontPage, at, QuickStart 3개의 파일을 확인 할 수 있다.
# ls FrontPage at QuickStart -al
-rw-rw-r-- 1 yundream yundream 25110  6월 10 11:57 FrontPage
-rw-rw-r-- 1 yundream yundream 32524  6월 10 11:57 QuickStart
-rw-rw-r-- 1 yundream yundream 18986  6월 10 11:57 at

다운로드 속도 제한

100KB/s로 다운로드 속도를 제한해보자.
$ curl --limit-rate 100K http://yourdomain.com/yourfile.tar.gz -O

HTTP Basic Authentication

HTTP Basic Authentication 인증을 수행 할 수 있다. Basic Authentication은 아이디/패스워드 기반의 간단한 인증 수단을 제공한다.
# curl -U yundream:password -x http://localhost:3000
전송 헤더 정보는 아래와 같다.
GET / HTTP/1.1
Host: localhost:3000
Authorization: Basic eXVuZHJlYW06cGFzc3dvcmQ=
User-Agent: curl/7.58.0
Accept: */*
아이디/패스워드는 암호화하지는 않고 단지 base64 인코딩만 수행한다.

프로토콜 디버깅

verbose와 trace, --trace-ascii를 이용해서 HTTP 데이터 통신 과정에 대한 상세정보를 얻을 수 있다. verbose로 불충분하다면 trace-ascii를 사용하자.
# curl --trace-ascii debug.dump http://www.test.co.kr/testpage
디버깅 정보는 debug.dump에 저장된다. 로컬 pc에 간단한 http 서버를 올려서 테스트를 진행했다.
# curl -XPOST http://localhost:8081 -d "Hi ?" --trace-ascii debug.dump
# cat debug.dump
== Info: Rebuilt URL to: http://localhost:8081/
== Info:   Trying 127.0.0.1...
== Info: TCP_NODELAY set
== Info: Connected to localhost (127.0.0.1) port 8081 (#0)
=> Send header, 147 bytes (0x93)
0000: POST / HTTP/1.1
0011: Host: localhost:8081
0027: User-Agent: curl/7.58.0
0040: Accept: */*
004d: Content-Length: 4
0060: Content-Type: application/x-www-form-urlencoded
0091:
=> Send data, 4 bytes (0x4)
0000: Hi ?
== Info: upload completely sent off: 4 out of 4 bytes
<= Recv header, 17 bytes (0x11)
0000: HTTP/1.1 200 OK
<= Recv header, 20 bytes (0x14)
0000: Content-Length: 11
<= Recv header, 41 bytes (0x29)
0000: Content-Type: text/plain; charset=utf-8
<= Recv header, 37 bytes (0x25)
0000: Date: Mon, 10 Jun 2019 02:20:40 GMT
<= Recv header, 12 bytes (0xc)
0000: X-Ben: Rad
<= Recv header, 2 bytes (0x2)
0000:
<= Recv data, 11 bytes (0xb)
0000: Hello World
== Info: Connection #0 to host localhost left intact
HTTP 요청과 응답 헤더와 데이터등 모든 데이터에 대한 입/출력을 테스트 할 수 있다.

GET

데이터 요청을 위한 가장간단한 방법이다. URL만 명시하는 것으로 테스트 할 수 있다.
# curl http://www.joinc.co.kr
# curl http://www.joinc.co.kr\?action\=getinfo\&id\=12345 

POST

GET 방식은 URL만으로 정보를 보낼 수 있지만, POST 방식의 경우 메시지를 body에 담아서 보내야 한다. -d, --data 옵션을 이용해서 데이터를 보낼 수 있다. 혹은 파일의 내용을 POST 데이터로 보낼 수도 있다. 파일을 읽어서 body로 보낼 경우 -d @filename 하면 된다.
# curl -d "name=yundream&age=19&address=Seoul ... ..." http://www.joinc.co.kr/curltest.php
# curl -X POST http://192.168.57.3:5984/mywiki/ -d @curl.json -H "Content-Type: application/json"

파일 업로드

# curl -F upload=@dump.tar.gz -F "username=yundream" http://www.joinc.co.kr/curltest.php

User Agent

반응형 웹 페이지를 만들 경우 user-agent에 따른 테스트가 필요하다. --user-agent 옵션을 이용해서 user agent 값을 변경할 수 있다.
#  curl --user-agent "Mozilla/4.73 [en] (X11; U; Linux 2.2.15 i686)" http://www.joinc.co.kr 

HTTP Header dump

"-D(--dump-header) <filename>"로 헤더 정보를 파일로 보낼 수 있다. filename을 "-"로 하면 헤더를 표준출력할 수 있다.
# curl -D header.txt http://www.joinc.co.kr
# cat header.txt
HTTP/1.1 200 OK
Date: Thu, 04 Jul 2013 01:54:40 GMT
Server: Apache/2.2.14 (Ubuntu)
Last-Modified: Fri, 22 Jun 2012 06:58:22 GMT
ETag: "c43e-76-4c30a286a7f80"
Accept-Ranges: bytes
Content-Length: 118
Vary: Accept-Encoding
Content-Type: text/html

헤더정보만 출력

디버깅 목적으로 요청 헤더만 보고 싶을 수 있다. -I 옵션을 사용하자.
curl https://www.joinc.co.kr/w/Site/Tip/curl -I
HTTP/1.1 200 OK
Server: nginx/1.4.6 (Ubuntu)
Date: Mon, 10 Jun 2019 02:36:50 GMT
Content-Type: text/html
Connection: keep-alive
X-Upstream: 127.0.0.1:8100

헤더 정보 추가하기

# curl -H "X-App-Pinpoint: app-trace-001918884" http://www.joinc.co.kr

전송된 헤더 정보는 아래와 같다.
GET / HTTP/1.1
Host: localhost:3000
User-Agent: curl/7.58.0
Accept: */*
X-App-Pinpoint: app-trace-001918884
두 개 이상 헤더 정보를 추가하는 것도 가능하다.
# curl -H "X-App-Pinpoint: app-trace-001918884" \
-H "X-App-Version: 1.0.5" localhost:3000

전송 헤더
GET / HTTP/1.1
Host: localhost:3000
User-Agent: curl/7.58.0
Accept: */*
X-App-Pinpoint: app-trace-001918884
X-App-Version: 1.0.5

User Agent 설정하기

HTTP는 User-Agent 헤더를 가지고 있으며, 여기에 Agent(HTTP 클라이언트) 정보를 입력할 수 있다. 이 정보는 서버통계와 디버깅등의 목적으로 사용한다. curl로 테스트해보자.
GET / HTTP/1.1
Host: localhost:3000
Authorization: Basic eXVuZHJlYW06cGFzc3dvcmQ=
User-Agent: curl/7.58.0
Accept: */*
요청한 HTTP 클라이언트가 curl 7.58.0 버전이라는 걸 확인 할 수 있다. --user-agent로 agent 이름을 설정 할 수 있다.
# curl -u yundream:password  http://localhost:3000 --user-agent "qa-test/1.0.0"

전송 헤더
GET / HTTP/1.1
Host: localhost:3000
Authorization: Basic eXVuZHJlYW06cGFzc3dvcmQ=
User-Agent: qa-test/1.0.0
Accept: */*
이 요청은 qa-test agent가 보낸 것임을 알 수 있다.

참고