うたカモ 技術知識・用語集

技術知識・用語集

ドメイン・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)と呼びます。

  1. 利用者がアドレスバーにうたカモ用語集.exampleを入力する
  2. ブラウザが入力された名前を整え、.で区切ったラベルごとに文字などを確認する
  3. ASCII以外の文字を含むラベルをPunycodeで変換し、先頭にxn--を付ける
  4. 変換後のxn--p8j7bymyh4432a350ao1r.exampleでDNSに問い合わせ、接続先を調べる

.で区切られたうたカモ用語集やexampleの一つ一つをラベルと呼びます。 変換はラベル単位で行われ、exampleのようなASCIIのラベルはそのまま残ります。

Unicodeの表記
うたカモ用語集.example
DNSに問い合わせるASCIIの表記
xn--p8j7bymyh4432a350ao1r.example
うたカモ用語集.exampleをxn--p8j7bymyh4432a350ao1r.exampleに変換し、DNSに問い合わせる例
IDNをASCIIの名前に変換する例。両方とも同じドメインを表す

U-labelとA-label

IDNAの仕様では、同じラベルの2つの表し方を区別しています。

表が画面に収まらない場合は横にスクロールできます。

呼び方例使われる場面
U-labelうたカモ用語集利用者が読み書きするUnicodeの形。画面への表示や入力に使う
A-labelxn--p8j7bymyh4432a350ao1rDNSやプログラムが扱う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の変換結果扱い
IDNA2003fass.deßをssに置き換える
IDNA2008xn--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の解説で確認できます。

参考資料

技術知識・用語集に戻る