[5] [[ドメイン名]]における[DFN[[RUBYB[ラベル]@en[label]]]]とは、 [CODE(char)[[[.]]]]
で区切られたそれぞれの部分のことです。

* 含められる文字

[SEE[ [[ドメイン名における文字]] ]]

* DNS における定義

[11] [[ラベル]]は、 [CODE(ABNF)@en[[[ALPHA]]]], [CODE(ABNF)@en[[[DIGIT]]]], 
[CODE(char)[[[-]]]] の1文字以上の連続です。ただし、先頭1文字と末尾1文字は [CODE(char)[[[-]]]]
であってはなりません。

[FIG(railroad)[
= |
== [CODE[[[ALPHA]]]]
== [CODE[[[DIGIT]]]]
= ?
== *
=== |
==== [CODE[[[ALPHA]]]]
==== [CODE[[[DIGIT]]]]
==== [CODE[[[-]]]]
== |
=== [CODE[[[ALPHA]]]]
=== [CODE[[[DIGIT]]]]
]FIG]

;; [12] 以前は先頭1文字が [CODE(ABNF)@en[[[DIGIT]]]] であることも認められていませんでしたが、
[[RFC 1123]] で緩和されています [SRC[>>66]]。
[[差分仕様書]]の悪習で改訂されていることが分かりにくいため、
緩和されていることを知らず [[RFC]] 違反だなどと誤解されることが21世紀に入ってもなお後を絶ちません。

[1] [[IDN2008]] ではこれを「[[LDHラベル]]」と呼んでいます。
この意味での「[[ラベル]]」の詳細は [[LDHラベル]]の項を参照してください。

** 仕様書

[REFS[
- [67] [CITE@en[RFC 1034 - Domain names - concepts and facilities]] ([TIME[2013-11-15 02:48:06 +09:00]] 版) <http://tools.ietf.org/html/rfc1034#section-3.5>
- [66] [CITE@en[RFC 1123 - Requirements for Internet Hosts - Application and Support]] ([TIME[2013-11-15 03:02:57 +09:00]] 版) <http://tools.ietf.org/html/rfc1123#section-2>
]REFS]

* IDNA における定義

** IDNA2003、IDNA2008 での定義

[1]
> [DFN[[RUBY[ラベル][なふだ]@en[label]]]]は、
[[ドメイン名]]の個々の部分です。
[[ラベル]]は通常[RUBYB[[[点]]]@en[dot]]で区切って示されます。
例えば、[[ドメイン名]] [CODE(example)@en[[[www.example.com]]]]
は、 [CODE(example)@en[[[www]]]]、
[CODE(example)@en[[[example]]]]、
[CODE(example)@en[[[com]]]] の3つの[[ラベル]]で構成されます。
([DEL[[[STD 13]] で[[長さ]][[零]]の[[根ラベル]]が説明されています。]] [INS[[[RFC 1123]] で末尾[RUBYB[[[点]]]@en[dot]]を使った完全な名前の表記法が説明されています。]]
これは明示的に [CODE(example)@en[[[www.example.com.]]]]
のように記述したり、暗示的に
[CODE(example)@en[[[www.example.com]]]]
としたりします。しかし、この[[文書]]では[DEL[[[ラベル]]とは]]考えません。)
[[IDNA]] は [INS[([[RFC 1035]] や [[RFC 2181]] の[[バイナリ列ラベル]]や [[RFC 2673]] の[[ビット列ラベル]]ではなく)]]
[[テキスト]]である[[ラベル]]で使用可能な[[文字]]の[[集合]]を[INS[特定の文脈において]]拡張します。[INS[利用可能な[[文字]]の[[集合]]は文脈によって異なり、次の節で説明します。]]
この[[文書]]では、以後、[Q[[[ラベル]]]]という[[用語]]を[Q[[RUBYB[[[テキスト・ラベル]]]@en[text label]]]]の略、
[Q[[RUBYB[[[各ラベル]]]@en[every label]]]]を[Q[[RUBYB[[[各テキスト・ラベル]]]@en[every text label]]]]の略として使います。

;; [15] 追加と削除は [[IDNA2003]] と [[IDNA2008]] での違いです。

** UTS #46 での定義

[33] [SRC[>>34]]
> a [DFN(en)[label]] is a substring of a domain name. That substring is bounded on both sides by either the start or the end of the string, or any of the following characters, called [DFN[[[label-separators]]]]

** 仕様書

[REFS[
- [13] [[IDNA2003]] [[RFC 3490]] 2.
- [14] [[IDNA2008]] [CITE@en[RFC 5890 - Internationalized Domain Names for Applications (IDNA): Definitions and Document Framework]] 
<http://tools.ietf.org/html/rfc5890#page-7>
- [36] [CITE@en-us[UTS #46: Unicode IDNA Compatibility Processing]]
-- [34] '''<http://unicode.org/reports/tr46/#Notation>'''
-- [56] <http://unicode.org/reports/tr46/#Conformance>
-- [37] <http://unicode.org/reports/tr46/#Validity_Criteria>
]REFS]

* HSTS での定義

>
[69] 
:domain name label:
is that portion of a domain name appearing "between the dots",
i.e., consider "foo.example.com": "foo", "example", and "com" are
all domain name labels.

[REFS[
- [68] [CITE@en[RFC 6797 - HTTP Strict Transport Security (HSTS)]] ([TIME[2014-06-02 05:16:10 +09:00]] 版) <http://tools.ietf.org/html/rfc6797#section-4>
]REFS]

* 分類

[FIG(list)[
- [29] [[テキスト・ラベル]]
-- [17] [[ASCIIラベル]]
--- [16] [[LDHラベル]]
---- [26] [[NR-LDHラベル]]
---- [23] [[R-LDHラベル]]
----- [22] [[XNラベル]]
------ [24] [[Aラベル]]
------ [25] [[偽Aラベル]]
------ [25] [[未検証Aラベル]]
---- [27] [[ACEラベル]]
--- [18] [[非LDHラベル]]
-- [19] [[Uラベル]]
-- [32] [[未検証Uラベル]]
-- [31] [[IDNAラベル]]
-- [28] [[国際化ラベル]]
- [20] [[バイナリー列ラベル]]
- [21] [[ビット列ラベル]]
- [30] [[非ASCIIラベル]]
]FIG]

* UTS #46 における制約

[35] [[UTS #46]] は[[ラベル]]に対していくつかの制約を課しています。

;; [40] この対象は[[テキスト・ラベル]]に相当するものであり、[[バイナリー列ラベル]]や[[ビット列ラベル]]は考慮されていません。

** 共通の制約

[73] [[ラベル]][VAR[ラベル]]が満たさなければならない[DFN[[RUBYB[[[妥当性基準]]]@en[validity criteria]]]]とは、
[VAR[処理オプション]]と [VAR[[[UseSTD3ASCIIRules]]]]、
[VAR[[[CheckHyphens]]]]、
[VAR[[[CheckBidi]]]]、
[VAR[[[CheckJoiners]]]] に依存した次のようなものです [SRC[>>37]]。

[FIG(list)[
- [38] [VAR[ラベル]]が [[NFC]] である
- [74] [VAR[ラベル]]の第1[[符号位置]]について、
-- [83] [VAR[[[CheckHyphens]]]] が[[真]]の場合、
--- [75] [CODE(char)[U+002D]] [CODE(charname)@en[HYPHEN-MINUS]] ではない
-- [76] [[結合マーク]]ではない
- [39] [VAR[ラベル]]の第3、第4[[符号位置]]について、
-- [82] [VAR[[[CheckHyphens]]]] が[[真]]の場合、
--- [77] [CODE(char)[U+002D]] [CODE(charname)@en[HYPHEN-MINUS]] ではない
- [41] [VAR[ラベル]]の最後の[[符号位置]]について、
-- [78] [VAR[[[CheckHyphens]]]] が[[真]]の場合、
--- [81] [CODE(char)[U+002D]] [CODE(charname)@en[HYPHEN-MINUS]] ではない
- [42] [VAR[ラベル]]の任意の[[符号位置]]について、
-- [43] [CODE(char)[U+002E]] [CODE(charname)@en[FULL STOP]] ではない
-- [79] [[IDNA写像表]] ([VAR[[[UseSTD3ASCIIRules]]]]) の[[状態値]]が[[妥当]]または[[偏差]]で''ある''
-- [44] [VAR[処理オプション]]が[[移行的処理]]の場合、
--- [80] [[IDNA写像表]] ([VAR[[[UseSTD3ASCIIRules]]]]) の[[状態値]]が[[偏差]]ではない
- [84] [VAR[[[CheckJoiners]]]] が[[真]]の場合、
-- [85] [[IDNA2008]] [[ContextJ rules]] を満たす
- [86] [VAR[[[CheckBidi]]]] が[[真]]の場合、
-- [87] [[IDNA2008]] [[bidi規則]]を満たす

]FIG]

[47] ここで、[[状態値]]は [VAR[[[UseSTD3ASCIIRules]]]] によって変化します。

[53] [CODE[-]] に関する検査は、 [[Web互換]]でない疑いがあります。
[[Unicode IDNA互換性処理]]を参照。

[72] この[[妥当性基準]]は、[[Unicode IDNA互換性処理]]から参照されています。

** UseSTD3ASCIIRules

[48] [[UseSTD3ASCIIRules]] が[[偽]]であれば [[ASCII文字]]の[[妥当性]]の検証方法は[[実装依存]]となります。例えば [[LDH]] の他に [CODE(char)[[[_]]]] を認めることができます。 [SRC[>>37]]

[49] これは単に[[ASCII文字]]を認めるだけにとどまらず、[[写像]]や[[正規化]]の結果そのような
[[ASCII文字]]に変換される[[非ASCII文字]]を認めることにつながります。

[50] 例えば [CODE(charname)@en[[[LOW LINE]]]] の使用を認めると、
[CODE(charname)@en[[[FULLWIDTH LOW LINE]]]] も認めることとなります。

[51] またいくつかの[[非ASCII文字]]は[[正準分解]]が [[UseSTD3ASCIIRules]] 
が[[真]]だと認められない[[ASCII文字]]となるため、 [[UseSTD3ASCIIRules]]
が[[真]]の時は使用禁止となりますが、[[偽]]の時は使用禁止になりません。
そのような[[文字]]は [[disallowed_STD3_valid]] に分類されています。
[[disallowed_STD3_valid]] の[[文字]]は、 [[UseSTD3ASCIIRules]] が[[偽]]であっても、
対応する[[ASCII文字]]が認められないときにはやはり禁止しなければなりません。 [SRC[>>37]]

** 追加の制約

[52] [[IDNA2008]] の[[bidi規則]]・[[ContextJ規則]]にも従うべきです [SRC[>>37]]。

[57] 実装は更に追加で制約を加えたり、警告を出したりしても構いません。
例えば、次のような制約が考えられます [SRC[>>56]]。

[FIG(list)[
- [58] 特定の[[用字系]]の組み合わせの[[ラベル]]を認めない ([[Safari]]) [SRC[>>56]]
- [59] [[利用者]]が指定した[[言語]]以外の[[文字]]の[[ラベル]]を認めない ([[IE]]) [SRC[>>56]]
- [60] 特定の[[混乱可能文字]]の[[ラベル]]を認めない ([[Firefox]]) [SRC[>>56]]
- [61] [[Google Safe Browsing API]] で検出された[[ラベル]]を認めない [SRC[>>56]]
- [62] [[IDNA2008]] の妥当性の要件 ([[Uラベル]]参照) を満たさない[[ラベル]]を認めない [SRC[>>56]]
- [63] [[ToASCII]] すると[[ラベル]]の妥当性の要件を満たさない [[ToUnicode]] によって作られた[[ラベル]]を認めない [SRC[>>56]]
- [54] [[混乱可能文字]]の処理については [[UTR #36]] を参照することを強く推奨します。 [SRC[>>37]]
-- [CSECTION@en[[[Restriction Level 3, Moderately Restrictive]]]] [SRC[>>56]]
- [55] [[識別子]]に使うべきではない[[文字]]の処理については [[UTS #39]] を参照することを強く推奨します。 [SRC[>>37]]
-- [64] [CSECTION@en[[[Table 4, Candidate Characters for Exclusion]]]] [SRC[>>56]]
-- [65] [CSECTION@en[[[Table 5, Recommended Scripts: Limited Use]]] [SRC[>>56]]
]FIG]

* ワイルドカード

[89] 
[[ワイルドカード]] [CODE[*]] は[[ラベル]]として認められる[[文字]]ではありません。
従って[[ラベル]]で構成される[[ドメイン名]]に、いわゆる[[ワイルドカードドメイン]]は含まれません。

* メモ

[3]
[PRE(ABNF)[
domain = subdomain / " "
subdomain = label *("." label)
label = letter [ [ldh-str] let-dig ]
ldh-str = 1*let-gid-hyp
let-dig-hyp = let-dig / "-"
let-dig = letter / digit
letter = <"A" / ... / "Z">
digit = <"0" / ... / "9">
]PRE]

[4]
[PRE(ABNF)[
domain = subdomain / " "
subdomain = label *("." label)
label = ALPHA [*(ALPHA / DIGIT / "-") (ALPHA / DIGIT)]
ldh-str = 1*(ALPHA / DIGIT / "-")
]PRE]

[REFS[
- [2] [CITE@en[RFC 2818 - HTTP Over TLS]] ([TIME[2014-12-15 14:10:09 +09:00]] 版) <http://tools.ietf.org/html/rfc2818#section-3>
]REFS]

[6] >>2 は[DFN[[RUBYB[ドメイン名部品]@en[domain name component]]]]と呼んでいます。

[7] [CITE@en[RFC 2181 - Clarifications to the DNS Specification]]
([TIME[2015-04-27 15:13:44 +09:00]] 版)
<https://tools.ietf.org/html/rfc2181#section-11>

[8] [CITE@en[1136616 – mozilla::pkix name matching disallows some characters in reference IDs that are valid in DNS labels]]
( ([TIME[2016-05-08 22:58:44 +09:00]]))
<https://bugzilla.mozilla.org/show_bug.cgi?id=1136616>

[9] [CITE@en[Issue 463410 - chromium - Inconsistent hostname handling in Chrome - Monorail]]
( ([TIME[2016-05-08 22:59:19 +09:00]]))
<https://bugs.chromium.org/p/chromium/issues/detail?id=463410>

[10] [CITE@en[Issue 496472 - chromium - Cleanup & move IsCanonicalizedHostCompliant from net_util into QUIC - Monorail]]
( ([TIME[2016-05-08 23:06:06 +09:00]]))
<https://bugs.chromium.org/p/chromium/issues/detail?id=496472>

[FIG(quote)[
[FIGCAPTION[
[70] [CITE[SpringのCORS機能がRFC 3986なホスト名に対応してなかった・・・ - Qiita]]
( ([TIME[2016-05-26 21:52:26 +09:00]]))
<http://qiita.com/kazuki43zoo/items/43abfb72ddf0f1096fa7>
]FIGCAPTION]

> リクエストにOriginヘッダーがあるとCORS(Cross-Origin Resource Sharing)関連の処理が動き、その処理の中でリクエストURLをjava.net.URIに変換するロジックがあります。URIクラスはRFC 3986に対応していないため、例えばリクエストURLが「 http://spring_app/」だとホスト名がnullになり、Spring側の処理の中でNPEが発生しています。

]FIG]


[FIG(quote)[
[FIGCAPTION[
[71] [CITE@en[RFC 7719 - DNS Terminology]]
( ([TIME[2016-06-05 17:09:11 +09:00]]))
<https://tools.ietf.org/html/rfc7719#section-2>
]FIGCAPTION]

> 
>    Label:  The identifier of an individual node in the sequence of nodes
>       identified by a fully qualified domain name.

]FIG]


[45] [CITE@en[Consider ignoring UTS46 validity criteria V2 · Issue #160 · servo/rust-url]]
([TIME[2016-08-28 00:04:23 +09:00]])
<https://github.com/servo/rust-url/issues/160>

[46] [CITE@en[IDNA · Issue #53 · whatwg/url]]
([TIME[2016-08-28 00:04:55 +09:00]])
<https://github.com/whatwg/url/issues/53>

[88] 
[CITE@en[rfc4151]], [TIME[2021-08-18T05:35:22.000Z]] <https://datatracker.ietf.org/doc/html/rfc4151#section-2.1>

[DFN[[VAR[DNScomp]]]]