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"
'Linux' 카테고리의 다른 글
| [ Linux ] su / su - / sudo 로그 확인 및 감사 방법 (0) | 2026.01.28 |
|---|---|
| [ Linux ] su, su -, sudo 차이점 정리 (운영 서버 기준) (0) | 2026.01.28 |
| [ Linux ] 사용자 입력 값을 RFC 2822 형식으로 변환하는 방법 - Shell script (0) | 2025.06.13 |
| [ Linux ] curl로 REST API 호출하는 방법 (0) | 2025.06.13 |
| [ Linux ] 리눅스에서 API 호출을 할 때 curl이 거의 표준처럼 사용되는 이유 (1) | 2025.06.13 |