Punycode 란 무엇입니까?
Punycode는 RFC 3492에서 정의된 인코딩 구문으로 유니코드 문자열을 DNS에 의해 지원되는 제한된 ASCII 문자로 변환합니다. 그것은 가능한 국제화 된 도메인 이름 (IDNs)을 만드는 기술 기반, 기존의 DNS 인프라와 작업 할 수있는 모든 언어의 도메인 이름을 허용.
문제 Punycode 해결
도메인 네임 시스템은 ASCII 문자를 염두에 두고 1980년대에 설계되었습니다. DNS 상표는 포함될 수 있습니다:
- 낮은 케이스 문자 (a-z)
- 손가락 (0-9)
- 하이픈 (-)
이 제한은 주로 라틴 알파벳을 사용하지 않는 인터넷 사용자의 억을 제외. Punycode는 유효한 ASCII로 Unicode 문자열을 인코딩하여이 간격을 브릿지합니다.
Punycode 인코딩 작동 방법
Punycode는 ASCII 문자를 인코딩하면서 ASCII 문자를 컴팩트한 ASCII 표현으로 보존하는 clever 알고리즘을 사용합니다.
Encoding 프로세스
1. 캐릭터 : ASCII 및 비 ASCII 문자로 분할
2. Copy ASCII : 모든 ASCII 문자를 원래 위치에 유지
3. 인코딩 Non-ASCII: 일반 변수 길이 정수 인코딩 사용
4. Add Prefix: Punycode 인코딩을 나타내는 Prepend "xn--"
이름 *
| 원본 (Unicode) | 인코딩 (Punycode) |
|---|---|
| 스낵 바 | xn--mnchen-3ya의 |
| 北京 한국어 | 사이트맵 |
| 인기 카테고리 | xn--mnchen-3ya.de |
| 한국어 (ko) | xn--fiq228c.com |
| 카페.com | xn--caf-dma.com |
"xn--" 접두사
"xn--" 접두사는 ACE (ASCII 호환 인코딩) 접두사라고합니다. 레이블이 Punycode-encoded 콘텐츠를 포함 하는 DNS 해결자와 응용 프로그램에 신호. 이 접두사:
- 항상 더 낮은 케이스
- 일반 ASCII 도메인 이름에서 나타나지 마십시오.
- Triggers Unicode decoding in 호환 소프트웨어
연습의 Punycode
브라우저 처리
현대 브라우저는 자동으로 Punycode를 처리 :
User types: 中文.com
Browser sends: xn--fiq228c.com (to DNS)
Browser displays: 中文.com (in address bar)
개발자 구현
JavaScript (Node.js) :const punycode = require('punycode/');
// Encode to Punycode
const encoded = punycode.toASCII('münchen.de');
// Result: xn--mnchen-3ya.de
// Decode from Punycode
const decoded = punycode.toUnicode('xn--mnchen-3ya.de');
// Result: münchen.de
Python :
domain = 'münchen.de'
encoded = domain.encode('idna').decode('ascii')
# Result: xn--mnchen-3ya.de
URL 처리
IDN을 포함하는 URL로 일할 때:
// URL API handles Punycode automatically
const url = new URL('https://中文.com/path');
console.log(url.hostname); // xn--fiq228c.com
console.log(url.href); // https://xn--fiq228c.com/path
보안 Implications
모든 Unicode 문자를 나타내는 Punycode의 능력은 보안 위험을 만듭니다.
시각적인 Spoofing
Attackers는 합법적인 사이트와 동일하게 보이는 도메인을 등록할 수 있습니다:
аррlе.com (Cyrillic 'а' and 'р')
apple.com (Latin letters)
일부 글꼴에서 동일하게 표시하지만 다른 도메인입니다.
브라우저 보호
spoofing 전투에, 브라우저는 보호를 실행:
1. Mixed Script Detection: 도메인 믹싱 스크립트를 위한 Display Punycode
2. Confusable 탐지 : ASCII 처럼 보이는 문자를 사용하여 플래그 도메인
3. 화이트리스트 : 잘 알려진 TLD에서만 Unicode 디스플레이 허용
API에서 Punycode 작업
도메인 도구를 구축 할 때:
Always Store Punycode: 일관성과 데이터베이스 인덱스를 위해 내부적으로 ASCII 양식을 사용합니다. 모든 양식을 수락 : 사용자가 Unicode 또는 Punycode를 입력하자, 필요에 따라 변환. Display Unicode: 사용자 인터페이스에서 인간의 읽기 쉬운 형태를 보여줍니다.function normalizeDomain(input) {
const punycode = require('punycode/');
// Convert to lowercase Punycode for internal use
return punycode.toASCII(input.toLowerCase());
}
Punycode는 대부분의 사용자에게 투명하지만 개발자가 국제 웹 응용 프로그램을 구축하는 데 필수적인 지식입니다.