Computer >> 컴퓨터 >  >> 프로그래밍 >> Bash 프로그래밍

cURL로 POST 요청 보내기 – 폼 데이터, 파일 업로드, JSON/XML 전송 완벽 가이드

cURL은 원격 서버 간에 데이터를 전송할 수 있는 다양한 도구를 포함하는 패키지입니다. FTP, Windows 공유 폴더, 메일 서버는 물론 HTTP를 사용하는 웹 서버까지 폭넓게 지원합니다.

리눅스 셸에서 파일을 다운로드할 때는 보통 다음과 같이 cURL 명령어를 사용합니다:

curl https://example.org/file.zip --output file.zip

이 명령은 GET 방식으로 파일을 요청해 단순히 다운로드합니다.

이 글에서는 cURL을 사용해 POST 요청을 보내는 방법을 자세히 살펴봅니다. 폼 데이터 전송 방법도 함께 다루는데, 서버가 파일 다운로드 시 인증 정보를 요구하거나, 웹 폼에 데이터를 자동으로 제출해 데이터베이스에 저장하는 스크립트를 작성할 때 특히 유용합니다.

또한 REST API와 연동하기 위해 XML 또는 JSON 데이터를 파일에서 읽어 전송하는 방법도 소개합니다.

cURL로 URL 인코딩된 필드 POST하기

예제에서는 다음과 같은 폼 데이터를 전송한다고 가정합니다:

필드명
field1 value1
field2 value2

데이터는 https://example.org/submit.php로 전송됩니다. example.org의 주소는 실제로 존재하지 않으며, 예제에서 안전하게 사용할 수 있는 도메인일 뿐입니다. submit.php 역시 폼 제출 스크립트의 예시 이름일 뿐, 특정 대상을 가리키지 않습니다.

폼 데이터는 각 필드와 값을 name=value 형태로 정의하고 &로 구분한 하나의 문자열로 만든 뒤, --data 옵션으로 전송할 수 있습니다:

curl --data "field1=value1&field2=value2" https://example.org/submit.php

다만 이 방식은 데이터가 반드시 URL 인코딩되어 있어야 한다는 점에서 이상적이지 않습니다. 즉, 공백과 슬래시 같은 문자를 HTTP 전송에 적합한 특수 코드로 변환해야 합니다. 수동으로 변환할 수도 있지만, --data-urlencode 옵션을 사용하면 cURL이 자동으로 처리해 줍니다:

curl --data-urlencode "field1=value1&field2=value2" https://example.org/submit.php

필드 이름은 기본적으로 URL 인코딩되지 않습니다. 이름까지 인코딩하려면 앞에 =를 붙이면 됩니다:

curl --data-urlencode "=user name=Linus Torvalds" https://example.org

이후 예제에서는 편의상 --data 대신 --data-urlencode를 사용해 POST 요청을 만들겠습니다.

URL 인코딩된 필드를 개별적으로 지정하기

각 폼 필드의 이름/값 쌍을 개별적으로 전달할 수도 있습니다. 이렇게 하면 명령어가 훨씬 읽기 쉬워집니다:

curl --data-urlencode "field1=value1" --data-urlencode "field2=value2" https://example.org/submit.php

cURL로 멀티파트/파일 업로드하기

파일을 포함한 멀티파트 폼 요청은 --form 옵션을 사용해 POST 방식으로 전송할 수 있습니다. 아래 예제는 myfile.txt를 fileupload 폼 필드로 업로드합니다:

curl --form "fileupload=@myfile.txt" https://example.org/submit.php

필드·파일·파일명을 함께 포함한 멀티파트 전송

파일 업로드 시 폼 필드의 이름/값 쌍도 함께 포함할 수 있으며, filename을 지정해 업로드되는 파일의 이름을 변경할 수도 있습니다:

curl --form "fileupload=@myfile.txt;filename=newfilename.txt" --form field1=value1 --form field2=value2 https://example.org/submit.php

데이터 없이 POST 요청 보내기

본문 없이 POST 요청만 보내려면 빈 문자열을 전달하면 됩니다:

curl --data-urlencode '' https://example.org/submit.php

파일 업로드 진행 상황 표시하기

업로드 진행 상황을 눈으로 확인하려면 -o output 옵션과 함께 진행률 표시줄(-#)을 추가합니다:

curl --tr-encoding -X POST -v -# -o output -T myfile.dat https://example.org/submit.php

파일에 저장된 데이터 전송하기

이미 파일에 저장된 데이터를 업로드할 때는 내용을 일일이 cURL 명령으로 분해하지 않고, 파일 전체를 한 번에 전송할 수 있습니다:

curl --data-urlencode @myfile.txt https://example.org/submit.php

JSON과 XML 데이터는 적절한 헤더를 추가하면 프로그래밍 방식 API 서비스로 POST할 수 있습니다:

curl -X POST --data-urlencode @myfile.txt https://example.org/submit.php --header "Content-Type:text/xml"

curl -X POST --data-urlencode @myfile.txt https://example.org/submit.php --header "Content-Type:application/json"

참고: JSON이나 XML처럼 구조화된 데이터를 전송할 때는 URL 인코딩이 데이터 구조를 손상시킬 수 있으므로, --data-binary "@myfile.json"처럼 -d 또는 --data-binary 옵션을 사용하는 것이 더 안전합니다.

마무리

리눅스 명령줄에서 자주 작업한다면 cURL을 능숙하게 다루는 것이 매우 중요합니다. cURL은 프로그래밍 API와 연동하거나 자신의 서버 간에 데이터를 주고받는 용도뿐 아니라, 평소에는 웹 브라우저가 필요했던 다양한 작업까지 수행할 수 있는 강력한 도구입니다.

다른 리눅스 셸 및 스크립팅 관련 글도 확인해 보세요!