URL 인코드 온라인 무료: 퍼센트 인코딩 완벽 가이드
URL 인코딩(또는 퍼센트 인코딩(Percent-encoding))은 URI(Uniform Resource Identifier) 내에서 정보를 인코딩하기 위한 메커니즘입니다. 단순한 기술적 세부 사항처럼 보일 수 있지만, 이는 웹이 작동하는 방식의 근간이며 브라우저와 서버 간에 데이터가 올바르게 전송되도록 보장합니다.
이 가이드에서는 URL 인코딩이 왜 필요한지, 어떻게 작동하는지 깊이 있게 살펴보고 편리한 온라인 도구를 소개합니다.
URL 인코딩이 왜 필요한가요?
URL(Uniform Resource Locator)은 RFC 3986에 정의된 제한된 문자 세트만 가질 수 있습니다. 이 세트에 포함되지 않은 문자(공백, 한글과 같은 비 ASCII 문자, 또는 URL 내에서 &나 =와 같이 특별한 의미를 갖는 문자)를 포함해야 하는 경우 반드시 인코딩해야 합니다.
예약 문자 vs 비예약 문자
사양에 따라 문자는 두 가지 범주로 나뉩니다.
비예약 문자(Unreserved Characters): 인코딩 없이 URL에서 사용할 수 있는 문자입니다. 다음을 포함합니다:
- 대문자 및 소문자 (A-Z, a-z)
- 숫자 (0-9)
- 하이픈 (
-), 밑줄 (_), 마침표 (.), 물결표 (~)
예약 문자(Reserved Characters): URL 내에서 특별한 의미를 갖는 문자입니다(예:
/,?,#,&,=와 같은 구분자). 이러한 문자가 구분자가 아닌 전송되는 데이터(예: 검색 쿼리)의 일부인 경우 반드시 인코딩해야 합니다.
퍼센트 인코딩 작동 방식
퍼센트 인코딩은 예약 문자를 %와 해당 문자의 ASCII 값을 나타내는 두 자리 16진수로 대체합니다.
예시:
- 공백은
%20이 됩니다 (ASCII 값 32, 16진수 20). - **느낌표(!)**는
%21이 됩니다 (ASCII 값 33, 16진수 21). - **앰퍼샌드(&)**는
%26이 됩니다 (ASCII 값 38, 16진수 26).
주요 인코딩 문자 표
| 문자 | 인코딩된 값 | 설명 |
|---|---|---|
| 공백 | %20 또는 + |
URL의 부분에 따라 다름 |
! |
%21 |
느낌표 |
# |
%23 |
해시 (프래그먼트 식별자) |
$ |
%24 |
달러 기호 |
& |
%26 |
앰퍼샌드 (쿼리 구분자) |
' |
%27 |
작은따옴표 |
( |
%28 |
왼쪽 괄호 |
) |
%29 |
오른쪽 괄호 |
* |
%2A |
별표 |
+ |
%2B |
플러스 기호 |
, |
%2C |
쉼표 |
/ |
%2F |
슬래시 (경로 구분자) |
: |
%3A |
콜론 |
; |
%3B |
세미콜론 |
= |
%3D |
등호 (쿼리 파라미터) |
? |
%3F |
물음표 (쿼리 시작) |
@ |
%40 |
At 기호 |
공백 처리: %20 vs +
공백이 때로는 %20으로, 때로는 +로 인코딩되는 것을 보셨을 것입니다.
- **
%20**은 URI의 모든 부분에서 공백을 인코딩하는 표준 방식입니다. - **
+**는 특히 URL의 쿼리 스트링 부분(?이후)에서 공백을 위해 사용됩니다. 이는 HTML 폼에서 사용되는 레거시application/x-www-form-urlencoded미디어 유형에서 유래되었습니다.
최신 도구와 라이브러리는 대개 이를 자동으로 처리하지만, 개발자들에게는 여전히 혼란스러운 부분입니다.
프로그래밍에서의 URL 인코딩
대부분의 프로그래밍 언어는 URL 인코딩 및 디코딩을 위한 내장 함수를 제공합니다.
JavaScript
// URI 컴포넌트 인코딩
const query = "hello world & friends";
const encoded = encodeURIComponent(query);
console.log(encoded); // 출력: hello%20world%20%26%20friends
// 디코딩
const decoded = decodeURIComponent(encoded);
console.log(decoded); // 출력: hello world & friends
Python
import urllib.parse
query = "hello world & friends"
encoded = urllib.parse.quote(query)
print(encoded) # 출력: hello%20world%20%26%20friends
decoded = urllib.parse.unquote(encoded)
print(decoded) # 출력: hello world & friends
PHP
<?php
$query = "hello world & friends";
$encoded = urlencode($query);
echo $encoded; // 출력: hello+world+%26+friends
$decoded = urldecode($encoded);
echo $decoded; // 출력: hello world & friends
?>
자주 묻는 질문 (FAQ)
1. URL 전체를 인코딩해야 하나요, 아니면 일부만 해야 하나요?
일반적으로 쿼리 파라미터의 값이나 경로의 특정 세그먼트만 인코딩해야 합니다. 전체 URL(http://, :, / 구분자 포함)을 인코딩하면 유효하지 않은 URI가 됩니다. 값에는 encodeURIComponent()를, 전체 URI에는 encodeURI()를 사용하세요(구분자는 건너뜁니다).
2. URL 인코딩은 Base64 인코딩과 같나요?
아니요, 다릅니다. URL 인코딩(퍼센트 인코딩)은 URL 내의 문자를 이스케이프하는 데 사용됩니다. Base64는 이진 데이터를 64개의 ASCII 문자 문자열로 표현하는 데 사용됩니다. 용도가 완전히 다릅니다.
3. 왜 "Malformed URI" 오류가 발생하나요?
이 오류는 대개 디코딩 중에 문자열에 % 문자가 포함되어 있지만 그 뒤에 유효한 두 자리 16진수가 따라오지 않을 때 발생합니다. 예를 들어 index.php?name=100%는 마지막의 %가 유효한 인코딩 시퀀스의 시작이 아니기 때문에 오류를 일으킵니다.
4. URL 인코딩은 유니코드를 지원하나요?
네, 지원합니다. 최신 URL 인코딩(UTF-8 기반)은 문자를 먼저 UTF-8 바이트 시퀀스로 변환한 다음 각 바이트를 퍼센트 인코딩하여 유니코드를 처리합니다. 예를 들어 '한'(UTF-8: ED 95 9C) 문자는 %ED%95%9C가 됩니다.
결론
URL 인코딩은 웹 데이터의 무결성을 보장하는 간단하지만 필수적인 도구입니다. 웹 애플리케이션을 구축하든, API 호출을 디버깅하든, 웹의 작동 원리에 대해 궁금하든 퍼센트 인코딩을 이해하는 것은 필수적입니다.
문자열을 빠르게 인코딩하거나 디코딩해야 하나요? 저희의 **URL 인코드/디코드 도구**를 사용하여 몇 초 만에 처리하세요!