Linux

[ Linux ] curl GET 요청 시 URL 인코딩이 꼭 필요한 이유와 처리 방법

soyali 2025. 6. 13. 15:20

API 호출을 위해 curl을 사용하시는 분들이라면, GET 요청 시 쿼리 파라미터에 공백, 콜론, 쉼표 등 특수 문자가 포함될 경우 서버에서 요청을 제대로 인식하지 못하는 문제를 경험하신 적이 있을 것입니다.

 

 

왜 인코딩이 필요할까?

GET 요청에서 파라미터는 보통 다음과 같이 URL 쿼리 문자열에 포함됩니다:

https://호스트명:포트/경로?key=value

하지만 이 쿼리 문자열에 다음과 같은 문자가 포함되면 문제가 발생할 수 있습니다:

  • 공백 ( )
  • 쉼표 (,)
  • 콜론 (:)
  • 더하기 기호 (+)

 

 

예를 들어, RFC 2822 형식의 날짜를 쿼리 파라미터 값으로 전달해야 할 경우, 날짜 문자열은 다음과 같은 구조를 가집니다:

Fri, 13 Jun 2025 15:30:00 +0900

이 문자열에는 공백, 쉼표, 콜론, 더하기 기호 등 여러 특수 문자가 포함되어 있어, 이를 URL에 그대로 전달하면 구문 오류가 발생하거나 파라미터가 잘못 해석될 수 있습니다.

 

인코딩하지 않고 아래와 같이 전송할 경우,

curl "https://호스트명:포트/경로?time=Fri, 13 Jun 2025 15:30:00 +0900"

서버는 time 파라미터를 정확하게 인식하지 못하거나 오류를 반환할 수 있습니다.

 

반면, URL 인코딩을 적용하면,

curl "https://호스트명:포트/경로?time=Fri%2C%2013%20Jun%202025%2015%3A30%3A00%20%2B0900"

공백, 쉼표, 콜론, 더하기 기호가 모두 인코딩되어 쿼리 파라미터로 정상 전달되고, 서버에서 올바르게 해석할 수 있습니다.

 

 

 

1. curl 호출 시 자동으로 인코딩하는 방법

curl에서 --data-urlencode 옵션을 사용하면, 쿼리 파라미터 값을 자동으로 URL 인코딩하여 전송할 수 있습니다.

curl -G \
   "https://${호스트명}:${포트}/${경로}" \
   --data-urlencode "input_datetime=$rfc2822_datetime" \
   -H "accept: application/json"

 

  • -G 옵션은 GET 요청임을 의미하며,
  • --data-urlencode는 파라미터 값을 URL 인코딩해 줍니다.

 

 

2. Shell script 함수로 수동 인코딩하기

urlencode() {
   local raw="$1"
   local encoded=""
   local i c

   for ((i=0; i<${#raw}; i++)); do
       c="${raw:i:1}"
       case "$c" in
          [a-zA-Z0-9.~_-])
             encoded+="$c"
             ;;
          *)

             # ASCII 문자를 %HEX 형식으로 변환
             printf -v hex '%%%02X' "'$c"
             encoded+="$hex"
             ;;
          esac
       done

       echo "$encoded"
}


rfc2822_datetime="Fri, 13 Jun 2025 15:30:00 +0900"
encoded_datetime=$(urlencode "$rfc2822_datetime")


curl "https://${호스트명}:${포트}/${경로}?time=${encoded_datetime}" \
   -H "accept: application/json"