Profile picture

[Linux] curl 사용 방법

JaehyoJJAng2023년 03월 15일

▶︎ Client URL

curl 명령어는 프로토콜들을 이용해 URL로 데이터를 전송하여 서버에 데이터를 보내거나 가져올 때 사용하기 위한 명령줄 도구 및 라이브러리이다.

쉽게 말하면 SHELL(커맨드 라인 환경)에서 REST API(http) 테스트 하고 싶으면 curl 명령어를 사용하면 된다

▶︎ curl 설치

# ubuntu
$ sudo apt update
$ sudo apt-get install -y curl

# centos
$ sudo yum update
$ sudo yum install curl

▶︎ curl 사용법

특정 URL을 대상으로 동작하고 URL 앞에는 curl 옵션을 사용하면 된다.

$ curl [options ..] <url>

short long 설명
-k --insecure https 프로토콜에서 SSL 인증서에 대한 검증없이 연결
-i --head HTTP 헤더만 보여주고 컨텐츠는 표시하지 않음
-D --dump-header HTTP 헤더를 file에 기록 (덤프)
-L --location HTTP 301, 302 응답을 받은 경우 리디렉션 URL로 따라간다
--max-redirs 옵션 뒤에 숫자로 몇 번의 리디렉션까지 따라갈 것인지를 적을 수 있다
기본 값은 50이다
-d --data HTTP POST 요청 데이터 입력
-v --verbose 동작하면서 세세한 내용을 출력
-J --remote-header-name 헤더에 있는 파일 이름으로 다운로드 파일을 저장
-o --output FILE curl로 받아온 내용을 FILE 이라는 이름의 파일로 저장
-O --remote-name 파일 저장시 리모트에 저장되어 있던 이름을 그대로 가져와서 로컬에 저장
-s --silent 진행 내용이나 메시지들을 출력하지 않음
HTTP response code 만 가져오거나 할 경우 유리
-X --request 요청시 사용할 메소드의 종류 (GET, POST, PUT, PATCH, DELETE)
-i --include 응답에 Content 만 출력하지 않고 서버의 Reponse 도 포함해서 출력한다. (디버깅에 유용)
-A --user-agent 서버에 User-Agent 보내기
-H 전송할 헤더를 지정
-J --remote-header-name 어떤 웹서비스는 파일 다운로드시 Content-Disposition Header 를 파싱해야 정확한 파일이름을 알 수 있을 경우가 있다.
-J 옵션을 주면 헤더에 있는 파일 이름으로 저장한다.
-v --verbose 동작하면서 자세한 헤더 통신 옵션을 출력한다.
-C --continue-at 파일 다운로드 재개

‣ GET 요청

  • 터미널 창에 example.com 홈페이지의 소스 코드를 인쇄
  • 프로토콜을 지정하지 않은 경우, curl은 사용할 프로토콜을 추측하려고 시도하며,이 프로토콜은 HTTP로 기본 설정됨
  • 아무 옵션을 적지 않은 경우 기본적으로 GET 방식으로 동작

GET data 전송 방법

$ curl www.example.com
$ curl -X GET www.example.com
$ curl -G http://127.0.0.1/ -d key=value -d key2=value2

‣ POST 요청

  • -d 옵션으로 body 파라미터를 앞에 쓰고, 그 뒤에 POST를 처리하는 주소를 넣는다.
  • 파라미터는 무조건 먼저 인코딩 된 상태여야 한다.
  • POST의 기본 Content-Type 은 application/x-www-form-urlencoded 이다.

POST data 전송방법

$ curl http://127.0.0.1/ -d key=value -d key2=value2
$ curl http://127.0.0.1/ -d "key=value&key2=value2"
$ curl -X POST -d "key=value" http://127.0.0.1/

url 형식 데이터

$ curl -d "key1=value1&key2=value2" \ # -d 옵션으로 body 데이터를 기재
-H "Content-Type: application/x-www-form-urlencoded" \ # -H 옵션으로 전송할 헤더 지정 (디폴트 : application/x-www-form-urlencoded)
-X POST http://localhost:80/test-data # -X 옵션으로 POST 메소드 지정하고 요청할 url명시

JSON 형식 데이터

$ curl -d '{"key1":"value1", "key2":"value2"}' \
-H "Content-Type: application/json" \
-X POST http://localhost:8000/data

파라미터값을 파일로 지정해서 보내기

curl -d "@data.txt" -X POST http://localhost:3000/data

curl -d "@data.json" -X POST http://localhost:3000/data

‣ 출력을 파일로 저장

  • -o는 미리 정의된 파일 이름을 사용하여 파일을 저장
  • -O는 파일을 원래 파일 이름으로 저장
  • -o 옵션과 함께 curl 명령어를 실행하면 다운로드에 대한 진행률 표시기가 표시됨.
# mygettext.html 라는 파일로 저장
$ curl -o mygettext.html http://www.gnu.org/software/gettext/manual/gettext.html

# 파일 이름 그대로 저장
$ curl -O http://www.gnu.org/software/gettext/manual/gettext.html

# 출력 재지정 연산자로 파일 저장
$ curl -L http://www.gnu.org/software/gettext/manual/gettext.html > mygettext.html

‣ 헤더 보기

  • -I : 헤더만 가져오기
  • -i : 헤더와 바디까지 가져오기

헤더정보 보기 -I

$ curl -I google.com

HTTP/1.1 302 Found
Cache-Control: private
Content-Type: text/html; charset=UTF-8
Location: http://www.google.co.kr/?gfe_rd=cr&ei=NKoMV5TZCILD8AfCsqToCw
Content-Length: 261
Date: Tue, 12 Apr 2016 07:56:36 GMT

헤더 + 본문 보기 -i

# 헤더 + 본문 보기 -i

$ curl -i google.com
HTTP/1.1 302 Found
Cache-Control: private
Content-Type: text/html; charset=UTF-8
Location: http://www.google.co.kr/?gfe_rd=cr&ei=gqoMV9mPLczU8AefxoxA
Content-Length: 259
Date: Tue, 12 Apr 2016 07:57:54 GMT

<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
<A HREF="http://www.google.co.kr/?gfe_rd=cr&amp;ei=gqoMV9mPLczU8AefxoxA">here</A>.
</BODY></HTML>

‣ 페이지 상태체크

  • -o /dev/null : 응답을 /dev/null로 리다이렉트하여 출력을 없애는 옵션입니다. '/dev/null'은 특수한 파일로, 모든 데이터가 무시되는 빈 파일입니다. 이 옵션을 사용하면 실제 응답 내용을 화면에 출력하지 않고 버릴 수 있습니다.
  • -w "%{http_code}" : -w 옵션은 curl이 출력하는 정보를 형식화하는 옵션입니다. 이 경우, "%{http_code}"는 HTTP 상태 코드를 형식화하여 출력하도록 지정한 것입니다. "%{http_code}"는 curl이 받은 HTTP 응답의 상태 코드를 나타냅니다. 예를 들어, 200은 OK, 404는 Not Found, 500은 Internal Server Error 등의 상태 코드가 될 수 있습니다.
  • -s : 이 옵션을 사용하면 curl 명령어가 실행될 때 진행 상황이 출력되지 않고, 결과만 반환 됩니다.

$ curl -s -o /dev/null -w "%{http_code}" https://blog.leocat.kr

위의 curl 명령어를 실행하면 "https://blog.leocat.kr/" 주소로 HTTP GET 요청을 보내고,

서버로부터 받은 응답을 /dev/null로 리다이렉트하여 출력을 없애고, 응답의 HTTP 상태 코드를 출력하게 됩니다.

예를 들어, 만약 서버로부터의 응답이 200이라면 "200"이라는 상태 코드가 curl에 의해 출력될 것입니다.


▶︎ wget / curl 차이점

wgetcurl 두 명령어 모두 웹 서버로부터 컨텐츠를 가져오는 Linux 커맨드이다.


curl

$ curl -X GET http://127.0.0.1:8080/animal
$ curl -X POST http://127.0.0.1:8080/animal
$ curl -d 'cat,dog' -H "Content-Type: application/text" -X POST http://127.0.0.1:8080/animal

wget

$ wget GET http://127.0.0.1:8080/animal
$ wget POST http://127.0.0.1:8080/animal
$ wget -O- --post-data='cat,dog' --header='Content-Type:application/text' 'POST http://127.0.0.1:8080/animal'

❗️ INFO


[ wget / curl 공통점 ]

  • HTTP, HTTPS, FTP 프로토콜을 통해 컨텐츠를 다운로드 하는 커맨트 라인툴

  • HTTP POST request 를 지원

  • HTTP 쿠키를 지원

❗️ INFO


[ wget / curl 차이점 ]

wget

  • 간단하고 직관적 (만약, 별다른 옵션없이 컨텐츠를 조금 더 빠르게 다운로드하려고 한다면 wget 이 적합)

  • 별도의 라이브러리를 지원하지 않음

  • 재귀적으로 다운로드즉, 페이지에 있는 모든 내용이나 FTP 디렉터리에 있는 모든 파일들을 한 번에 그대로 복사

  • curl 에 비하여 더 오래되었음

curl

  • 복잡한 컨텐츠를 다운로드 하려고 한다면 wget 보다는 curl 이 적합

  • libcurl 라이브러리로 더 강력한 기능들을 추가/사용할 수 있음

  • stdin 또는 stdout 의 pipe 를 이용하는 전통적인 unix 스타일의 방식도 지원

  • LDAP 이나 Samba 공유도 지원양방향 (wget 은 일반 HTTP POST request 만 지원)

  • SSL 을 지원gzip 압축 및 해지를 지원


Loading script...