ドメイン・DNS
IDN(国際化ドメイン名)
post:
IDN(国際化ドメイン名)は、日本語やアクセント付きのラテン文字などを使えるドメイン名です。
うたカモ用語集.exampleのようなUnicodeの表記と、DNSで使うxn--p8j7bymyh4432a350ao1r.exampleのようなASCIIの表記があります。
IDNとは?
IDNはInternationalized Domain Nameの略です。 Webなどで使う従来のホスト名には、英字・数字・ハイフンを基本とする制約があります。 IDNは既存のDNSとの互換性を保ちながら、各国の言語の文字をドメイン名に使えるようにしたものです。
日本では、.jpで日本語を含むドメイン名を登録できます。
ドメイン名の末尾にある.jpのような部分は、トップレベルドメインと呼ばれます。この部分にASCII以外の文字を使うドメインもあります。
DNSに問い合わせるときはASCIIに変換する
ドメイン名から接続先のIPアドレスを調べるときは、IDNをASCIIの名前に変換してDNSに問い合わせます。 この変換はDNSの仕組み自体を変えるのではなく、ブラウザやメールソフトなどのアプリケーションで行います。 この方式をIDNA(Internationalizing Domain Names in Applications)と呼びます。
- 利用者がアドレスバーに
うたカモ用語集.exampleを入力する - ブラウザが入力された名前を整え、
.で区切ったラベルごとに文字などを確認する - ASCII以外の文字を含むラベルをPunycodeで変換し、先頭に
xn--を付ける - 変換後の
xn--p8j7bymyh4432a350ao1r.exampleでDNSに問い合わせ、接続先を調べる
.で区切られたうたカモ用語集やexampleの一つ一つをラベルと呼びます。
変換はラベル単位で行われ、exampleのようなASCIIのラベルはそのまま残ります。
- Unicodeの表記
うたカモ用語集.example- DNSに問い合わせるASCIIの表記
xn--p8j7bymyh4432a350ao1r.example
U-labelとA-label
IDNAの仕様では、同じラベルの2つの表し方を区別しています。
表が画面に収まらない場合は横にスクロールできます。
| 呼び方 | 例 | 使われる場面 |
|---|---|---|
| U-label | うたカモ用語集 | 利用者が読み書きするUnicodeの形。画面への表示や入力に使う |
| A-label | xn--p8j7bymyh4432a350ao1r | DNSやプログラムが扱うASCIIの形。xn--の後にPunycodeの文字列が続く |
U-labelとA-labelは同じ名前の異なる表現で、互いに変換できます。
そのため、うたカモ用語集.exampleとxn--p8j7bymyh4432a350ao1r.exampleは同じドメインを指します。
ただしxn--で始まっていても、元のU-labelに正しく戻せない文字列はA-labelとして認められません。
IDNで使える文字と変換前の処理
IDNでも、Unicodeのすべての文字を使えるわけではありません。 現在のIDNAの仕様(IDNA2008)は文字ごとに使えるかどうかを定めており、記号や絵文字の多くは使えません。 また、各トップレベルドメインの登録規則によって登録できる文字の範囲がさらに狭められていることもあります。
ブラウザはPunycodeによる変換の前に、入力された名前を一定の形にそろえます。
例えば、全角のEXAMPLE.comはexample.comに、うたカモ用語集.EXAMPLEは末尾の英字を小文字にしたうたカモ用語集.exampleとして扱われます。
ブラウザのURL処理では、WHATWGのURL Standardが参照するUnicodeのUTS #46に従って変換します。
UTS #46で処理できる文字と、IDNA2008で有効な文字は必ずしも同じではありません。
IDNA2003とIDNA2008の違い
IDNAには、2003年に定められたIDNA2003と2010年に改訂されたIDNA2008があります。
両者は文字の扱いが一部異なり、変換結果が変わることがあります。よく知られた例がドイツ語のßです。
表が画面に収まらない場合は横にスクロールできます。
| 方式 | faß.deの変換結果 | 扱い |
|---|---|---|
| IDNA2003 | fass.de | ßをssに置き換える |
| IDNA2008 | xn--fa-hia.de | ßを1つの文字として残す |
変換結果が違えば、DNSで問い合わせる名前も別になります。
現在のURL StandardはIDNA2008に合わせたxn--fa-hia.deへの変換を求めていますが、古いソフトウェアやライブラリではIDNA2003の変換が残っていることがあります。
プログラムでIDNを扱うときは、使っているライブラリがどちらの方式に従うかを確認しておくと、変換結果の食い違いを避けられます。
ブラウザでの表示とプログラムでの扱い
ブラウザは、IDNのドメインをアドレスバーでU-labelのまま表示することもあれば、xn--で始まるA-labelで表示することもあります。
見た目の似た文字を混ぜて正規のサイトに見せかけるIDNホモグラフ攻撃への対策として、ブラウザが文字の組み合わせを調べ、紛らわしい名前をA-labelで表示する場合があるためです。
プログラムの中でも、IDNはA-labelに変換された状態で扱われることがよくあります。
例えばJavaScriptのURLでは、日本語のホストはA-labelに変換されます。
new URL("https://うたカモ用語集.example/").hostname
// "xn--p8j7bymyh4432a350ao1r.example"
アクセスログに記録される名前や、Webサーバーの設定、証明書の発行対象に書く名前も、A-labelの場合があります。 U-labelとA-labelのどちらで表されているかを意識すると、同じドメインを別のものと見誤ることを防げます。
IDNを確認するときの注意
IDNはASCII以外の文字を使う言語の利用者が、自分の言語でドメイン名を読み書きするための仕組みです。 IDNであること自体が危険を意味するわけではありません。
一方で、Unicodeには見た目の似た文字が多く、表示された名前だけで接続先を判断しにくいことがあります。 ログイン情報などを入力するサイトは、メールのリンクからではなく、ブックマークや公式アプリから開くほうが安全です。 つづりの似た名前を使う手口は、タイポスクワッティングの解説でも扱っています。
なお、IDNはドメイン名の部分の仕組みです。 URLのパスやクエリに含まれる日本語は、Punycodeではなくパーセントエンコーディングで表されます。URLの各部分の違いはURLの解説で確認できます。
参考資料
- RFC 5890: Internationalized Domain Names for Applications (IDNA): Definitions and Document Framework — IDNA2008の用語、U-label・A-labelの定義
- RFC 5891: Internationalized Domain Names in Applications (IDNA): Protocol — 登録時・検索時の変換手順
- RFC 5892: The Unicode Code Points and Internationalized Domain Names for Applications (IDNA) — IDNA2008で使える文字の規則
- Unicode Technical Standard #46: Unicode IDNA Compatibility Processing — ブラウザなどで使われる変換前の処理
- WHATWG: URL Standard — IDNA — ブラウザでのホスト名の変換