url-encode url-decode percent-encoding developer-tools rfc3986

URL 인코드 온라인 무료: 퍼센트 인코딩 완벽 가이드

온라인에서 무료로 URL을 인코딩 및 디코딩하세요. RFC 3986 퍼센트 인코딩, 예약 문자 및 URL 구조의 일반적인 문제에 대해 알아보세요.

URL 인코드 온라인 무료: 퍼센트 인코딩 완벽 가이드

URL 인코딩(또는 퍼센트 인코딩(Percent-encoding))은 URI(Uniform Resource Identifier) 내에서 정보를 인코딩하기 위한 메커니즘입니다. 단순한 기술적 세부 사항처럼 보일 수 있지만, 이는 웹이 작동하는 방식의 근간이며 브라우저와 서버 간에 데이터가 올바르게 전송되도록 보장합니다.

이 가이드에서는 URL 인코딩이 왜 필요한지, 어떻게 작동하는지 깊이 있게 살펴보고 편리한 온라인 도구를 소개합니다.

URL 인코딩이 왜 필요한가요?

URL(Uniform Resource Locator)은 RFC 3986에 정의된 제한된 문자 세트만 가질 수 있습니다. 이 세트에 포함되지 않은 문자(공백, 한글과 같은 비 ASCII 문자, 또는 URL 내에서 &=와 같이 특별한 의미를 갖는 문자)를 포함해야 하는 경우 반드시 인코딩해야 합니다.

예약 문자 vs 비예약 문자

사양에 따라 문자는 두 가지 범주로 나뉩니다.

  1. 비예약 문자(Unreserved Characters): 인코딩 없이 URL에서 사용할 수 있는 문자입니다. 다음을 포함합니다:

    • 대문자 및 소문자 (A-Z, a-z)
    • 숫자 (0-9)
    • 하이픈 (-), 밑줄 (_), 마침표 (.), 물결표 (~)
  2. 예약 문자(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 인코드/디코드 도구**를 사용하여 몇 초 만에 처리하세요!