URL의 퍼센트 인코딩
퍼센트 인코딩은 특수 문자, 국제 텍스트 및 바이너리 데이터가 있는 URL을 가능하게 하는 메커니즘입니다.
인코딩 프로세스
프로세스는 간단합니다: ASCII 값(또는 UTF-8 바이트)을 가져와 %XX로 작성합니다. 여기서 XX는 16진수입니다.
예제: 공백은 ASCII 32 = 16진수 20이므로 %20이 됩니다. & 문자는 ASCII 38 = 16진수 26이므로 %26이 됩니다. % 문자 자체는 ASCII 37 = 16진수 25이므로 %25가 됩니다.
ASCII가 아닌 문자의 경우 먼저 UTF-8 바이트로 변환합니다. 유로 문자 €는 UTF-8 바이트 E2 82 AC이며 %E2%82%AC가 됩니다.
디코딩은 프로세스를 역으로 수행합니다: %XX 시퀀스를 찾고, 16진수를 바이트로 변환하고, 바이트를 UTF-8로 해석합니다.
16진수 숫자의 대소문자 구분: %2F와 %2f는 모두 유효하고 동등합니다. 관례는 일관성을 위해 대문자를 선호합니다.
일반적인 실수
이중 인코딩은 이미 인코딩된 URL이 다시 인코딩될 때 발생합니다. %20이 %2520이 됩니다. 이는 두 레벨 모두에서 인코딩을 제어하지 않을 때 발생합니다. 증상: 공백 대신 문자 그대로 %20을 표시하는 URL입니다.
언더 인코딩은 인코딩해야 할 문자를 인코딩하지 않은 채로 둡니다. 이는 URL을 깨뜨리거나 보안 취약점을 생성합니다. 사용자 입력을 항상 완전히 인코딩하세요.
JavaScript에서 잘못된 함수 사용: encodeURI() vs encodeURIComponent(). 기억하세요: 값에는 encodeURIComponent, 전체 URL에는 encodeURI(거의 필요 없음).
공백을 +로 인코딩하는 것은 쿼리 문자열에서만 작동하며 일부 컨텍스트에서만 작동합니다. 범용 호환성을 위해 %20을 사용하세요. 많은 시스템에서 경로 부분의 공백으로 +를 허용하지 않습니다.
유니코드 정규화는 종종 잊혀집니다. 동일한 가시적 문자가 다르게 인코딩되는 다른 유니코드 표현을 가질 수 있습니다. 일관성이 중요한 경우 인코딩하기 전에 정규화하세요.
무엇을 언제 인코딩해야 하는가
쿼리 매개변수는 사용자 입력이 포함되어 있으면 항상 인코딩해야 합니다. '?search=' + encodeURIComponent(userQuery)는 인젝션 공격과 깨진 URL을 방지합니다.
URL 경로는 /(경로 구분자)를 인코딩하지 않아야 하지만 다른 특수 문자는 인코딩해야 합니다. 'Tom & Jerry.pdf'와 같은 파일 이름의 경우: '/files/' + encodeURIComponent(filename).
프래그먼트 식별자(# 뒤)는 다른 규칙이 있습니다. 일부 애플리케이션은 인코딩되지 않은 프래그먼트를 기대하고 다른 애플리케이션은 인코딩된 프래그먼트를 기대합니다. 플랫폼 문서를 확인하세요.
사용자의 완전한 URL은 살균되어야 합니다. 프로토콜을 검증하세요(http/https만 허용, javascript: 차단), 인코딩 남용을 확인하고 URL 검증 라이브러리를 고려하세요.
API 요청: 대부분의 HTTP 라이브러리는 인코딩을 자동으로 처리합니다. URL을 수동으로 빌드하는 경우 각 매개변수 값을 개별적으로 인코딩한 다음 &로 결합하세요.
도구 사용해보기
URL 인코더/디코더