LINUX
2018.10.01 / 21:45

curl

Chitta
추천 수 2

curl 은 커맨드 라인에서 동작하는 데이타 송수신 툴로 HTTP, HTTPS, FTP, LDAP, SCP, TELNET, SMTP, POP3 등 주요한 프로토콜을 지원한다.

리눅스와 Mac OS X, 유닉스와 윈도등 주요 OS 에서 구동되므로 플랫폼과 OS에 구애 받지 않고 유용하게 사용할 수 있다.

curl 의 하위 모듈로는 libcurl 이라는 C 언어 기반 라이브러리가 있는데 C, C++ 프로그램 개발시 HTTP, HTTPS, FTP, LDAP 등의 protocol 과 연계가 필요하다면 libcurl 을 사용하여 손쉽게 연계할 수 있다. 

 

사용법

curl [options...] <url> 형식으로 사용하면 된다.

option 처리는 GNU getopt 를 사용하므로 하이픈 하나를 붙이는 short 형식의 옵션과 하이픈 두개로 시작되는 long 형식의 options 이 있다. 

 

주요 options

curl은 다양한 프로토콜과 기능을 지원하므로 많은 명령어와 옵션을 갖고 있다. 여기에서 제일 많이 사용되는 http/https 관련 옵션을 살펴 보자.

short
long
설명
비고
-k--insecurehttps 사이트를 SSL certificate 검증없이 연결한다.wget 의 --no-check-certificate 과 동일한 역할 수행
-l--headHTTP header 만 보여주고 content 는 표시하지 않는다 
-D--dump-header <file><file> 에 HTTP header 를 기록한다. 
-L--location서버에서 HTTP 302 redirection 응답이 왔을 경우 redirection URL 로 따라간다.

curl -v daum.net 을 실행하면 결과값으로 다음과 같이 HTTP 302 가 리턴된다.

< HTTP/1.1 302 Object Moved
< Location: http://www.daum.net/

-L 옵션을 추가하면 www.daum.net 으로 재접속하여 결과를 받아오게 된다.

-d--dataHTTP Post dataFORM 을 POST 하는 HTTP나 JSON 으로 데이타를 주고받는 REST 기반의 웹서비스 디버깅시 유용한 옵션이다
-v--verbose 동작하면서 자세한 옵션을 출력한다. 
-J--remote-header-name어떤 웹서비스는 파일 다운로드시 Content-Disposition Header 를 파싱해야 정확한 파일이름을 알 수 있을 경우가 있다. -J 옵션을 주면 헤더에 있는 파일 이름으로 저장한다.curl 7.20 이상부터 추가된 옵션
-o--output FILEcurl 은 remote 에서 받아온 데이타를 기본적으로는 콘솔에 출력한다. -o 옵션 뒤에 FILE 을 적어주면 해당 FILE 로 저장한다. (download 시 유용) 
-O--remote-namefile 저장시 remote 의 file 이름으로 저장한다. -o 옵션보다 편리하다. 
-s--silent정숙 모드. 진행 내역이나 메시지등을 출력하지 않는다. -o 옵션으로 remote data 도 /dev/null 로 보내면 결과물도 출력되지 않는다HTTP response code 만 가져오거나 할 경우 유리
curl 주요 옵션

이제 curl을 사용하여 HTTP/HTTPS 요청을 보내고 받는 예제를 알아 보자.

 

HTTP/HTTPS 연결

curl 명령과 함께 URL 을 명시하면 URL 에 있는 컨텐츠를 다운로드 받아서 콘솔로 출력한다. 다음 명령어는 index.html 을 전송후 사용자의 콘솔에 출력하게 된다.

curl http://www.gnu.org/software/bash/manual/html_node/index.html

 

서버 컨텐츠 다운로드

콘솔로 다운로드 받는 건 그리 유용하지 않는 경우가 많다. 특히 바이너리 파일을 출력하면 터미널이 깨져서 이후 입력/출력되는 문자가 깨져 보여서 정상적인 작업이 불가능하여 reset 명령어로 터미널을 초기화해야 할 수 있다.

curl 실행시 -o, --output 옵션으로 출력 파일을 지정하면 콘솔로 출력하지 않고 파일로 저장할 수 있다. 다음은 index.html 을 bash_manual.html 로 저장한다.

curl -o bash_manual.html http://www.gnu.org/software/bash/manual/html_node/index.html

매번 출력 파일을 지정하는 것은 번거로운 일이다. -O, --remote-name 옵션을 사용하면 URL 에서 파일명을 추출하여 저장하므로 출력 파일을 생략할 수 있어서 -o 보다 편리한 경우가 많다.

다음은 URL 에서 컨텐츠 이름인 index.html 을 추출하여 파일로 저장한다.

curl -O http://www.gnu.org/software/bash/manual/html_node/index.html

컨텐츠 이동시 따라가기

웹 서버에서 HTTP 응답값으로 해당 컨텐츠가 다른 곳에 있다는 301 Moved Permanently 나 302 Found 를 보냈을 경우 curl 의 기본 동작은 더 이상 진행하지 않는 것이다.

curl http://www.google.com

 

<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>302 Moved</TITLE></HEAD><BODY>
<H1>302 Moved</H1>
The document has moved

 

-L, –location 옵션을 주면 변경된 URL 로 따라 가서 결과를 가져온다. 변경된 URL 에 연결했더니 또 다른 곳에 컨텐츠가 있다는 응답을 보낼 수 있다. curl 은 이렇게 다른 위치를 보낼 경우 몇 번을 따라갈 지 여부를  --max-redirs 뒤에 숫자로 지정할 수 있고 기본 설정은 50이다.

curl -L http://www.google.com

 

HTTP 인증

특정 사이트나 컨텐츠는 인증을 거쳐야 하는 경우가 있다.  -u, –user 옵션 뒤에 아이디:암호 를 지정하여 인증할 수 있다. 다음은 ID 로 myuserid 를 암호로 mypwd 를 설정하여 웹 사이트에 인증을 요청하는 예제이다.

curl -u myuserid:mypwd http://www.example.com

 

HTTP 헤더 설정

서버에 연결시 특정 HTTP 헤더를 설정해야 하는 경우가 있다. 예로 서버가 REST API 를 제공할 경우 데이타 형식이 XML 인지 JSON 인지를 Content-Type 에 지정해야 하는 경우가 있으며 이럴 경우 -H, –header 옵션으로 설정할 HTTP 헤더의 이름과 값을 지정할 수 있다. 
JSON 형식일 경우 컨텐츠 형식이 "Content-Type: application/json" 이어야 하므로 다음과 같이 사용할 수 있다.

curl -u userid:password -H "Content-Type: application/json" http://www.example.com/user/login

 

HTTP 데이타 POST 

HTTP 로 서버에 요청시 기본 방식은 GET 이다. POST 방식을 사용할 경우  -X,–request  옵션 뒤에 POST 를 명시하여 요청 방식을 지정할 수 있으며 POST 할 데이타는 -d, –data 옵션으로 설정할 수 있다. 다음은 데이타를 POST 하는 예제로 HTTP 요청을 서버단에서 확인하기 위해 HTTP 요청을 검사해 주는 서비스인 http://requestb.in 을 통해 전송한 내용을 확인해 보자.

curl -d "name=Bruce+Wayne&age=30" http://requestb.in/1ap5m1g1

 

포스트할 데이타는 특수 문자가 있을 경우 일일이 변환해 주어야 한다. 위에서는 name 파라미터의 값에 공백이 있으므로 + 로 변환해서 전송했지만 데이타가 많을 경우 일일이 수작업으로 변환해 주는 것은 번거로운 일이다.

--data-urlencode 옵션을 사용하면 curl 이 URL 형식으로 인코딩해 주므로 편리하다.

주의할 점은 모든 특수 문자를 인코딩 해 주므로 파라미터의 구분자인 & 도 인코딩하므로 파라미터가 여러 개일 경우 옵션을 여러 번 사용하여 분리해 주어야 한다. 다음은 --data-urlencode 옵션으로 위 POST 데이타를 수행하는 예제이다.

curl --data-urlencode "name=Bruce Wayne" --data-urlencode "age=30" http://requestb.in/1ap5m1g1

POST 할 데이타가 파일로 존재할 경우 -d 옵션뒤에 @ 를 붙이고 파일명을 명시하면 된다. REST API 를 제공하는 서비스가 있는데 사용자 인증이 필요하고 데이타는 JSON 형식으로 전송해야 한다고 가정해 보자. 서버에 보낼 데이타는 data.js 라는 파일에 기술되어 있다.

data.js
{
    "string""foo",
    "number"5
}

이제 curl 을 이용하여 다음과 같이 사용자 인증 및 REST API 를 호출할 수 있다. 

curl -d @data.js -u userid:password  -H "Content-Type: application/json" http://requestb.in/1ap5m1g1

 

전송할 파일이  이미지나 압축 파일등의 바이너리 파일일 경우 -d 옵션 대신 --data-binary 옵션을 추가하면 바이너리로 처리하므로 데이타가 깨지지 않고 전송된다.

curl --data-binary @myBinary.jpg http://requestb.in/1ap5m1g1

 

활용

curl 은 다양한 프로토콜을 지원하는 유용한 URL 처리기로서 특히 HTTP/HTTPS 서버와 연결하여 데이타를 주고 받을 필요가 있을때 편리하다. 웹 서버나 WAS 를 구축했을 때 제대로 동작하는지를 curl 을 이용하여 간단하게 확인해 볼 수 있고  원격지 서버에서 파일을 다운받거나 서버에 데이타를 전송할 수 도 있다.

특히 REST 기반 API 를 제공하는 웹서비스가 있을 경우 curl 의 POST 기능을 이용하면 REST API 의 정상 동작 여부를 손쉽게 디버깅할 수 있으며 Atalssian JIRA나 SalesForce.com 등의 많은 REST API 설명서의 예제로 curl 로 REST API 호출하는 방법을 설명하고 있다.

 

향후 설치할 redmine 이나 sonatype nexus, jenkins 서버등도 REST API 를 제공하므로 서버의 기능을 외부에서 API 로 사용하려면 REST API 에 대한 이해와 사용은 필수이며 이때 curl 은 유용한 도구로 활용할 수 있다.

 

같이 보기