귀하는 로그인되어 있지 않습니다. 이대로 편집하면 귀하의 IP 주소가 편집 기록에 남게 됩니다.스팸 방지 검사입니다. 이것을 입력하지 마세요!= 퓨니코드 = {{목차}} == 개요 == 퓨니코드(Punycode)는 유니코드 문자열을 ASCII 문자로 인코딩하는 방식이다. 국제화 도메인 네임(IDN)에서 비-ASCII 문자를 표현할 수 있도록 한다. 2003년 [https://datatracker.ietf.org/doc/html/rfc3492 RFC 3492]에서 정의되었으며, 전 세계의 다양한 문자 체계를 도메인 이름으로 사용할 수 있도록 한다. 예를 들어, 한글 도메인 '''한글.com'''은 퓨니코드 방식으로 변환 시 '''xn--bj0bj06e.com'''과 같이 표현된다. == 작동 원리 == 퓨니코드는 크게 두 부분으로 구성된다. 하나는 '''xn--'''로 시작하는 ACE(ASCII Compatible Encoding) 접두어이며, 다른 하나는 실제로 변환된 문자열이다. 변환 과정은 다음과 같은 단계로 이루어진다. === 인코딩 과정 === # '''문자 분리''': 입력 문자열에서 ASCII(기본) 문자와 비ASCII 문자를 분리한다. # '''기본 문자 처리''': ASCII 문자들은 그대로 유지한다. # '''비ASCII 문자 인코딩''': 비ASCII 문자들은 델타 인코딩(bootstring 알고리즘)을 이용해 변환한다. # '''최종 조합''': 기본 문자와 인코딩된 비ASCII 문자들을 하이픈(-) 등으로 결합한 후 '''xn--''' 접두어를 붙여 최종 결과를 만든다. 다음은 실제 RFC3492 알고리즘의 복잡한 모든 예외를 처리하지 않은, 단순화된 의사코드 예시이다: <syntaxhighlight lang="javascript"> // 단순화된 퓨니코드 변환 예시 (모든 예외 처리를 포함하지 않음) function processPunycode(input) { // 1. ASCII(기본) 문자와 비ASCII 문자 분리 const basicChars = input.match(/[\x00-\x7F]+/g) || []; const nonBasicChars = input.match(/[^\x00-\x7F]+/g) || []; // 2. 기본 문자는 그대로, 비ASCII 문자들은 별도 인코딩 let result = basicChars.join(''); if (nonBasicChars.length > 0) { result += '-' + encodeDelta(nonBasicChars); } // 3. ACE 접두어 추가 return 'xn--' + result; } // 비ASCII 문자에 대한 델타 인코딩 (의사코드) function encodeDelta(chars) { let n = 0x80; // 초기 기본값 let delta = 0; let bias = 72; // 초기 bias 값 let result = ''; for (let char of chars) { const point = char.codePointAt(0); delta += (point - n) * (delta + bias); n = point; while (delta > 0) { const t = Math.min(delta, 36); result += encodeDigit(t); delta = Math.floor(delta / 36); } } return result; } // 인코딩 시 숫자를 문자로 매핑하는 단순 예시 함수 function encodeDigit(digit) { // 0~25는 a-z, 26~35는 0-9에 매핑 (예시) if (digit < 26) { return String.fromCharCode(97 + digit); } else { return String.fromCharCode(48 + (digit - 26)); } } </syntaxhighlight> ''※ 위 코드는 RFC3492의 복잡한 알고리즘을 단순화한 의사코드임을 유의한다.'' === 델타 인코딩 세부 사항 === 퓨니코드는 Bootstring 알고리즘을 기반으로 하며, 델타 인코딩과 bias 적응(adapt bias) 방식을 사용한다. 주요 상수와 bias 조정 함수는 다음과 같다: <syntaxhighlight lang="javascript"> const initialN = 0x80; const initialBias = 72; const base = 36; const tmin = 1; const tmax = 26; const skew = 38; const damp = 700; function adaptBias(delta, numPoints, firstTime) { delta = firstTime ? Math.floor(delta / damp) : Math.floor(delta / 2); delta += Math.floor(delta / numPoints); let k = 0; while (delta > ((base - tmin) * tmax) / 2) { delta = Math.floor(delta / (base - tmin)); k += base; } return k + Math.floor(((base - tmin + 1) * delta) / (delta + skew)); } </syntaxhighlight> == 기술적 제약 == 퓨니코드에는 몇 가지 중요한 제약사항이 있다. * '''도메인 레이블 길이 제한''': DNS 시스템 상 한 도메인 레이블은 최대 63자(바이트)로 제한된다. 이 제한은 '''xn--''' 접두어를 포함하므로, 실제 인코딩된 문자열은 최대 59자만 사용할 수 있다. * '''사용 가능한 문자''': 변환 결과는 ASCII 문자 중 알파벳(A~Z, 대소문자 구분 없이), 숫자(0~9) 및 하이픈(-)만 포함한다. 이는 기존 DNS 시스템과의 호환성을 유지하기 위한 제한이다. == 보안 문제 == === 동형이의어 공격 (Homograph Attack) === 동형이의어 공격은 서로 다른 문자 체계에서 모양이 유사한 문자를 사용하여 사용자들을 속이는 공격이다. 예를 들어, 라틴 문자 '''a'''와 키릴 문자 '''а'''는 육안으로 구별하기 어렵지만 서로 다른 문자이다. 또한, '''paypal.com''' 대신 키릴 문자를 사용하여 '''раураl.com'''과 같이 작성하면, 사용자에게 실제와 유사한 도메인으로 보이게 하여 피싱 공격을 시도할 수 있다. 이러한 공격을 막기 위해 주요 브라우저는 의심스러운 도메인에 대해 퓨니코드 형태의 URL을 표시하거나 경고 메시지를 제공한다. == 퓨니코드 변환 도구 == 퓨니코드 변환이 필요하다면 다음과 같은 온라인 도구들을 이용할 수 있다: * [https://punycoder.com/ Punycoder]: 간단한 인터페이스로 도메인을 변환할 수 있는 도구이다. * [https://www.punycoder.com/ Punycode Converter]: 전문적인 기능과 배치 처리를 지원하는 변환기이다. * [https://www.verisign.com/en_US/channel-resources/domain-registry-products/idn/idn-conversion-tool/index.xhtml Verisign IDN Conversion Tool]: 신뢰도가 높은 공식 도구이다. 또한, 프로그래머는 Node.js 환경에서 내장 라이브러리 또는 외부 패키지를 사용하여 직접 변환할 수 있다: <syntaxhighlight lang="javascript"> const punycode = require('punycode'); // '''한글'''을 퓨니코드 인코딩 (출력 결과는 접두어 없이 인코딩된 부분만 반환) console.log(punycode.encode('한글')); // 예: 'bj0bj06e' // 인코딩된 문자열을 원래 문자열로 디코딩 console.log(punycode.decode('bj0bj06e')); // 예: '한글' </syntaxhighlight> == 운영체제 및 브라우저 지원 == === 운영체제별 지원 현황 === * '''Windows''': Windows Vista 이후부터 국제화 도메인(퓨니코드)을 완벽하게 지원한다. * '''macOS''': macOS 10.2 재규어 버전부터 지원되기 시작한다. * '''리눅스''': 대부분의 배포판에서 기본적으로 지원된다. === 브라우저별 처리 방식 === 브라우저들은 동형이의어 공격 등의 보안 문제를 고려하여 퓨니코드 도메인의 표시 방식을 다르게 처리한다. * '''크롬(Chrome)''': 신뢰할 수 있는 최상위 도메인(TLD) 목록에 포함되지 않거나 의심스러운 도메인의 경우 퓨니코드 형태의 URL을 표시한다. * '''파이어폭스(Firefox)''': '''about:config'''에서 '''network.IDN_show_punycode''' 옵션을 '''true'''로 설정하면 모든 퓨니코드 URL을 인코딩된 형태로 확인할 수 있다. == 실제 사용 사례 == === 기업들의 활용 === 퓨니코드는 글로벌 기업들이 현지화 전략의 일환으로 각국의 언어로 된 도메인을 사용할 수 있도록 한다. 예를 들어, 러시아에서는 '''гугл.рф''' 도메인이 사용되며, 퓨니코드로는 '''xn--80asehdb.xn--p1ai'''로 변환된다. === 공공기관의 활용 === 한국에서는 공공기관들이 한글 도메인을 적극적으로 도입한다. 예를 들어, '''대한민국.한국'''이나 '''정부24.코리아'''와 같은 도메인이 있으며, 이는 디지털 소외계층의 정보 접근성을 높이는 데 기여한다. == 향후 전망 == === 확장 가능성 === 현재 퓨니코드는 주로 도메인 이름과 이메일 주소에 사용되나, 앞으로 URL 경로 등 다른 영역에서도 국제화 문자의 사용이 확대될 가능성이 있다. 또한, 일부 최상위 도메인에서는 '''이모지(emoji)''' 도메인의 등록을 허용하므로, 이모지 역시 도메인 이름에 사용할 수 있다. === 새로운 도전과제 === 최근 '''이모지'''를 도메인 이름에 포함시키려는 시도가 증가하고 있다. 일부 최상위 도메인에서는 이모지 도메인의 등록을 허용하며, 이는 기존 퓨니코드 알고리즘에 새로운 도전 과제를 제시한다. == 창의적인 도메인 이름 활용 사례 == 퓨니코드의 특성을 이용하여 도메인 이름을 창의적으로 활용하는 사례가 있다. 예를 들어, 문자나 이모지의 특성을 살려 도메인 이름을 독특하게 표현하는 경우가 있으며, 이는 브랜드 마케팅이나 이벤트용으로 활용된다. 이와 같이 퓨니코드의 유연한 문자 변환 기능을 통해 다양한 도메인 이름 변형이 가능하다. 단, 이는 불법적인 해킹 행위가 아니라 합법적인 도메인 이름 활용 방식이다. == 마치며 == 퓨니코드는 인터넷의 국제화에 큰 기여를 한 혁신적인 기술이다. 동형이의어 공격과 같은 보안 문제 등 몇 가지 과제가 존재하지만, 전 세계 사용자가 자신의 모국어로 도메인을 사용할 수 있도록 함으로써 정보 접근성과 문화 다양성을 크게 향상시킨다. == 각주 == <references /> == 외부 링크 == * [https://www.unicode.org/reports/tr46/ Unicode IDNA 호환성 처리] * [https://tools.ietf.org/html/rfc3492 RFC 3492 - Punycode 스펙] * [https://www.iana.org/domains/idn-tables IDN 테이블 레지스트리] [[분류:컴퓨터 과학]] [[분류:문자 인코딩]] [[분류:도메인 네임 시스템]] [[분류:인터넷 표준]] [[분류:국제화와 지역화]] 편집 요약 가온 위키에서의 모든 기여는 크리에이티브 커먼즈 저작자표시-동일조건변경허락 라이선스로 배포된다는 점을 유의해 주세요(자세한 내용에 대해서는 가온 위키:저작권 문서를 읽어주세요). 만약 여기에 동의하지 않는다면 문서를 저장하지 말아 주세요. 또한, 직접 작성했거나 퍼블릭 도메인과 같은 자유 문서에서 가져왔다는 것을 보증해야 합니다. 저작권이 있는 내용을 허가 없이 저장하지 마세요! 취소 편집 도움말 (새 창에서 열림) 이 문서에서 사용한 틀: 틀:목차 (편집)