* 起源 [24] [[Web]] の[[セキュリティー・モデル]]である[RUBYB[[[同一起源方針]]]@en[same-origin policy]]において、 [[URL]] の[[ドメイン]]等によって定まる[[資源]]の管理の単位を[DFN[[RUBY[起源]@en[オリジン]@en[origin]]]]といいます。 ;; [85] [[同一起源方針]]の項もご覧ください。 [161] [[HTML]] では[[スクリプト]]の実行の際に用いる類似した概念である[DFN[[RUBYB[実効スクリプト起源]@en[effective script origin]]]]も定義されています。 多くの場合は[[起源]]と同一ですが、場合によっては違う値になることもあります。 ** 仕様書 [REFS[ - [23] '''[CITE@en[RFC 6454 - The Web Origin Concept]] ([TIME[2011-12-12 09:13:37 +09:00]] 版) ''' - [135] '''[CITE@en-US-x-hixie[HTML Standard]] ([TIME[2012-02-22 20:11:59 +09:00]] 版) ''' - [127] [CITE@en-US-x-hixie[HTML Standard]] ([TIME[2012-02-22 20:11:59 +09:00]] 版) - [131] [CITE@en-US-x-hixie[HTML Standard]] ([TIME[2012-02-22 20:11:59 +09:00]] 版) ]REFS] ** 識別 [25] [[起源]]は、 - [[URL scheme]]、[[host]]、[[port]] の[[3項組]]と、場合によっては[RUBYB[追加のデータ]@en[extra data]] - [RUBYB[大域的に固有な識別子]@en[globally unique identifier]] -- [[HTML]] では「[RUBYB[不透明な識別子]@en[opaque identifier]]」と呼ばれています ... のいずれかによって表されます。 [37] 大域的に固有な識別子は、他のすべての[[起源]]と異なる任意の値です。 [SRC[>>23 2.3.]] ;; [38] 通常は大域的に固有な識別子は[[利用者エージェント]]の外に露出することが無いので、 特定[[プロセス]]内の連番など任意の方法で決定できます。 [39] [[HTTP]] などで[[起源]]をやり取りする必要がある時は、 [[URL]] の構文の[[部分集合]]によって[[直列化]]して表します。 [EG[ [40] 例えば [CODE(URI)@en[http://www.example.com/foo/bar]] の[[起源]]は ([CODE(URI)[http]], [CODE(URI)[www.example,com]], [CODE(URI)[80]]) の[[3項組]]によって表されます。 これを [[HTTP]] の [CODE(HTTP)@en[[[Origin:]]]] 欄に含める時は、 [CODE(URI)[http://www.example.com]] と表現します。 ]EG] ** 追加のデータ [143] [[RFC]] では[[3項組]]はそれだけですが、 [[HTML]] によれば更に場合によっては[RUBYB[追加のデータ]@en[extra data / additional data]]を加えることができます。 [145] 追加のデータとしては、[[暗号化]]された[[接続]]を使っている時に[[サイト]]の[RUBYB[[[証明書]]]@en[certificate]]を用いることが想定されています。 途中で[[証明書]]が変化した時に、[[証明書]]も[[起源]]に含めることで、前後で別の[[起源]]として扱われるようになります。 [SRC[>>135]] ;; [146] 従って[[中間者攻撃]] ([[MITM]]) に対する防御となります。 [149] この規定は >>147 で追加されたもので、当時は [[URL]] の[[起源]]に関する規定において[[証明書]]を[[起源]]に含めても構わない状況が明記されていましたが、 >>148 で当該部分が [[RFC]] に委ねるとして削除され、しかし [[RFC]] には相当する規定が含まれなかったため、宙に浮いてしまっています。 [REFS[ - [147] [CITE@en[Web Applications 1.0 r1839 Allow the origin to include extra data, such as the host's certificate. (credit: el)]] ([TIME[2008-07-02 08:09:00 +09:00]] 版) - [148] [CITE@en[Web Applications 1.0 r6728 Defer to the origin spec for URL origin.]] ([TIME[2011-10-22 07:20:00 +09:00]] 版) ]REFS] ** 比較 *** RFC における定義 [81] 2つの[[起源]]が「[RUBYB[同じ]@en[same]]」である時、その時に限って[RUBYB[同一]@en[identical]]です。 具体的には、 - [82] 2つの[[起源]]が共に [[scheme]]/[[host]]/[[port]] の[[3項組]]であるなら、 3つがそれぞれ[RUBYB[同一]@en[identical]]であるなら、その場合に限って[RUBYB[同じ]@en[same]]です。 - [83] 大域的に固有な識別子は、 [[scheme]]/[[host]]/[[port]] の[[3項組]]と[RUBYB[同じ]@en[same]]であることはありません。 ... と定義されています。 [SRC[>>23 5.]] ;; [87] あまり意味がないからか自明だからか仕様上明記されていませんが、[[起源]]が共に大域的に固有な識別子である時も、 それが同じ値であるなら、その場合に限って、同じ[[起源]]であるはずです。 [84] 2つの[[URL]]は、その[[起源]]が[RUBYB[同じ]@en[same]]なら、[RUBYB[[[同一起源]]]@en[same-origin]]です。 [SRC[>>23 5.]] ;; [86] 同じ[[URL]]であるからといって[[起源]]も同じとは限りません。例えば [CODE(URI)@en[[[data:]]]] [[URL]] は毎回新しい大域的に固有な識別子が割り振られるため、違う[[起源]]になります。 *** HTML における定義 [150] 次の[[手順]]が[[真]]を返す時、2つの[[起源]]は[DFN[[RUBYB[同一起源]@en[same origin]]]]です。 [SRC[>>135]] = [151] [VAR[A]], [VAR[B]] をそれぞれ比較する2つの[[起源]]としまう。 = [152] [VAR[A]] と [VAR[B]] が共に不透明な識別子であり、その値が等しければ、[[真]]を返します。 = [153] そうでなく、 [VAR[A]] と [VAR[B]] の一方または両方が不透明な識別子なら、[[偽]]を返します。 = [154] [VAR[A]] と [VAR[B]] の [[scheme]] 部品が[RUBYB[同一]@en[identical]]でなければ、[[偽]]を返します。 = [155] [VAR[A]] と [VAR[B]] の [[host]] 部品が同一でなければ、[[偽]]を返します。 = [156] [VAR[A]] と [VAR[B]] の [[port]] 部品が同一でなければ、[[偽]]を返します。 = [157] [VAR[A]] と [VAR[B]] の一方が追加のデータを持ち、双方同一でなければ、[[偽]]を返します。 = [158] [[真]]を返します。 ;; [159] [[RFC]] の定義とは違ってすべての場合が明確に規定されています。 ** 直列化 [136] [[起源]]の[[直列化]]については、 [[RFC]] と [[HTML]] で2つの微妙に異なる定義がなされています。 [SRC[>>25 6.]], [SRC[>>135]] ;; [137] 元々 [[HTML]] にあった定義をコピーして [[IETF]] 版を作った時に政治的な理由か何かで書き換わったのでしょう。 [160] [[ASCII直列化]]と[[Unicode直列化]]の2種類があります。どちらも、大域的に固有な識別子は [CODE[null]] と表現します。また [[HTML]] の定義によれば [[ASCII直列化]]できない[[host]]を含む[[起源]]は[[空文字列]]によって表されます [WEAK[([[RFC]] の定義ではそのような[[起源]]の存在は考慮されていません)]]。 *** ASCII 直列化 [88] [[起源]]の [DFN[Unicode [RUBYB[直列化]@en[serialization]]]]は、次の手順によって得られる文字列です [SRC[>>25 6.1., >>135]]。 = [99] [[起源]]が [[URL scheme]]、[[host]]、[[port]] の[[3項組]]で''ない''なら、[[文字列]] [CODE[[[null]]]] を返して停止します。 = [100] そうでなければ、 [VAR[result]] を[[起源]]の [[scheme]] とします。 = [101] [VAR[result]] の後ろに [CODE[://]] を付加します。 = [102] [[RFC]] の定義: [[起源]]の [[host]] 部分を [VAR[result]] の後ろに付加します。 = [140] [[HTML]] の定義: [[起源]]の [[host]] 部分に [[IDNA2003]] [[ToASCII]] [[演算]]を適用し、結果を [VAR[result]] の後ろに付加します。 -- この時、 [[AllowUnassigned]] と [[UseSTD3ASCIIRules]] の2つの[[フラグ]]は設定した状態にします。 -- [[host]] のいずれかの部品で [[ToASCII]] が失敗したら、[[空文字列]]を返して停止します。 = [103] [[起源]]の [[port]] 部分が [[scheme]] で指定された[[プロトコル]]の[[既定のポート]]と異なっていれば、 [VAR[result]] の後ろに [CODE(char)[[[:]]]] を付加し、更に[[ポート番号]]を[[十進数]]で付加します。 = [104] [VAR[result]] を返します。 ;; [105] >>103 は厳密には更に[[ポート番号]]を最小の桁数で (つまり[[先導0]]なしで) 表現するという制約が必要なはずです。 ;; [141] [[HTML]] の定義に従えば、 [[LDHラベル]]化できない [[host]] だった場合に[[起源]]は[[空文字列]]によって表されることになります。 [[RFC]] の定義によれば[[空文字列]]になることはありません。 **** 応用 - [132] [CODE(HTTP)@en[[[Origin:]]]] ([[HTTP]]) - [133] [CODE(HTTP)@en[[[Origin:]]]] ([[Web Sockets]]) *** Unicode 直列化 [89] [[起源]]の [DFN[Unicode [RUBYB[直列化]@en[serialization]]]]は、次の手順によって得られる文字列です [SRC[>>25 6.1., >>135]]。 = [90] [[起源]]が [[URL scheme]]、[[host]]、[[port]] の[[3項組]]で''ない''なら、[[文字列]] [CODE[[[null]]]] を返して停止します。 = [91] そうでなければ、 [VAR[result]] を[[起源]]の [[scheme]] とします。 = [92] [VAR[result]] の後ろに [CODE[://]] を付加します。 = [93] [[起源]]の [[host]] 部分の各部品を次の手順により変換しつつ、 [CODE(char)[[[.]]]] で連結して [VAR[result]] の後ろに付加します。 == [139] [[RFC]] の定義: === [94] 部品が [[IDNA2008]] [[Aラベル]]なら、対応する[[Uラベル]]にします。 === [95] そうでなければ、部品をそのまま使います。 == [138] [[HTML]] の定義: 部品に [[IDNA2003]] [[ToUnicode]] [[演算]]を適用します。 = [96] [[起源]]の [[port]] 部分が [[scheme]] で指定された[[プロトコル]]の[[既定のポート]]と異なっていれば、 [VAR[result]] の後ろに [CODE(char)[[[:]]]] を付加し、更に[[ポート番号]]を[[十進数]]で付加します。 = [97] [VAR[result]] を返します。 ;; [98] >>96 は厳密には更に[[ポート番号]]を最小の桁数で (つまり[[先導0]]なしで) 表現するという制約が必要なはずです。 ;; [106] [[ASCII]] 版との違いは、 >>94 で [[Uラベル]]に変換するところだけです。 **** 応用 - [134] [CODE(DOMa)@en[[[origin]]]] ([CODE(DOMi)@en[[[MessageEvent]]]]) ** IDNA との関係 [120] [[IDN]] について、[[起源]]の定義が [[URI]] であることから[[起源]]の決定に [[ToASCII]] が必要となる場合があること、[[Unicode直列化]]を使う場面があることから[[起源]]の表記のために [[ToUnicode]] が必要となる場合があることにより、[[起源]]は [[IDNA]] に依存しています。 [122] [[RFC]] 上の[[起源]]の定義は [[IDNA2008]] に拠っていますが、 [[IDNA2003]] と [[IDNA2008]] のどちらを実装するかによって結果が異なることへの注記もあります [SRC[>>23 8.4]]。 [[HTML]] の[[起源]]の定義は [[IDNA2003]] に拠っています。 現実の[[Webブラウザー]]が実装しているものは厳密にはどちらの仕様とも異なっています。 * URL の起源 [26] ある [[RFC 3986]] [[URI]] の[[起源]]は次の手順により求められます [SRC[>>23 4.]]。 = [27] [[URL]] が[[階層的]]でない、または[[絶対URL]]でないなら、新しい大域的に固有な識別子を生成し、 それを返します。 = [28] [VAR[url-scheme]] を、 [[URL]] の [[scheme]] 部分を[[小文字]]化したものとします。 = [29] 実装が [VAR[url-scheme]] により表される[[プロトコル]]に対応していないなら、 新しい大域的に固有な識別子を生成し、それを返します。 = [30] [VAR[url-scheme]] が [CODE(URI)@en[[[file]]]] なら、 [[実装定義]]の値を返して[['''構いません''']]。 = [32] [VAR[url-host]] を、 [[URL]] の [[host]] 部分を[[小文字]]化したものとします。 -- [[小文字]]化には [[RFC 4790]] の [CODE[[[i;ascii-casemap]]]] を使います。 -- [[IDNA]] により [[Uラベル]]は既に[[Aラベル]]に変換されているものと仮定しています。 = [33] [[URL]] に [[port]] 部分がなければ、 == [VAR[url-port]] を、 [VAR[url-scheme]] で表される[[プロトコル]]の[[既定のポート]]とします。 = [34] そうでなければ、 == [VAR[url-port]] を、 [[URL]] の [[port]] 部分とします。 = [35] ([VAR[url-scheme]], [VAR[url-host]], [VAR[url-port]]) の[[3項組]]を返します。 ;; [36] 仕様上明記されていませんが、 >>32 や >>34 で [[host]] や [[port]] を[[正準化]]する必要がありそうです。 ;; [121] 仕様上厳密には [[RFC 3986]] [[URI]] に対して[[起源]]が定義されており、 [[URI]] でない [[URL]] ([[IDN]] を使ったものなど) はまず [[URI]] に変換 (できれば) する必要があります。 [[URI]] に変換できない [[URL]] については[[起源]]が定義されていないことになります。 もちろん現実の [[Webブラウザー]]においては、定義を自然に拡張した [[URL]] 一般について同様に[[起源]]が定義されることになります。 ;; [163] 以前は [[HTML]] の仕様書で [[URL]] に対して[[起源]]が定義されていましたが、 [[RFC]] に委ねるとして削除されてしまいました。 [162] [[URL]] の[[実効スクリプト起源]]は[[起源]]と同じです [SRC[>>135]]。 ** [CODE(URI)@en[file:]] URL の起源 [31] 仕様上 [CODE(URI)@en[[[file:]]]] [[URL]] の[[起源]]は[[実装]]定義となっています。 古い[[利用者エージェント]]は [CODE(URI)@en[[[file:]]]] [[URL]] に対して緩い制限しかかけていませんでしたが、 [[セキュリティー]]上の問題から最近の[[利用者エージェント]]では細かい単位で[[起源]]を設定していたりします。 例えば、[[ディレクトリー]]単位でアクセスを制限したり、[[ファイル]]ごとに完全に別の[[起源]]として扱ったりしています [SRC[>>23 4.]]。 * スクリプトの起源 [164] [[スクリプト]]の[[起源]]は[RUBYB[所有者]@en[owner]]の[[起源]]であり、 [[実効スクリプト起源]]は所有者の[[実効スクリプト起源]]です。所有者は[[スクリプト]]の種類により次の通り定まります [SRC[>>135]] :[CODE(HTMLe)@en[[[script]]]] [[要素]]:[CODE(HTMLe)@en[[[script]]]] [[要素]]の所属する [CODE(DOMi)@en[[[Document]]]] :[[事象取扱器内容属性]]:[[属性]]の所属する [CODE(DOMi)@en[[[Document]]]] :他の[[スクリプト]]により作られた[[関数]]その他のコード参照:作った[[スクリプト]] :[[HTTP]] [[リダイレクト]] (や[[他のプロトコルで等価なもの]]) により返された [CODE(URI)@en[[[javascript]]]] [[URL]]: [CODE(URI)@en[[[javascript:]]]] [[URL]] に[[リダイレクト]]した [[URL]] :[[属性]]にあった [CODE(URI)@en[[[javascript]]]] [[URL]]: [[属性]]の所属する [CODE(DOMi)@en[[[Document]]]] :[[スタイル・シート]]にあった [CODE(URI)@en[[[javascript]]]] [[URL]]:[[スタイル・シート]]の [[URL]] :[[閲覧文脈]]が [[navigate]] 中の [CODE(URI)@en[[[javascript]]]] [[URL]] であって、[[利用者]]によって提供されたもの (例えば[[ブックマークレット]]): [[閲覧文脈]]の[[活性文書]]の [CODE(DOMi)@en[[[Document]]]] :[[閲覧文脈]]が [[navigate]] 中の [CODE(URI)@en[[[javascript]]]] [[URL]] であって、[[マーク付け]]によって提供されたもの: [[URL]] を宣言している[[要素]] (例えば [CODE(HTMLe)@en[[[a]]]] [[要素]]) の [CODE(DOMi)@en[[[Document]]]] :[[閲覧文脈]]が [[navigate]] 中の [CODE(URI)@en[[[javascript]]]] [[URL]] であって、[[スクリプト]]によって提供されたもの: [[URL]] を提供した[[スクリプト]] * [CODE(DOMi)@en[Document]] オブジェクトの起源 [177] [CODE(DOMi)@en[[[Document]]]] [[オブジェクト]]の[[起源]]は次の通り定まります。 [[実効スクリプト起源]]は [CODE(DOMi)@en[[[Document]]]] の作成の時点ではこれと同じですが、 [CODE(JS)@en[[[document.domain]]]] [[属性]]によって変更することもできます。 [SRC[>>135]] - [165] [[閲覧文脈]]中にある場合であって [CODE(DOMi)@en[[[Document]]]] 作成時に[[閲覧文脈]]の[[砂箱化起源閲覧文脈フラグ]]が設定された場合 -- [CODE(DOMi)@en[[[Document]]]] が作られた時に割り当てられた大域的に固有な識別子 - [167] [CODE(URI)@en[[[javascript:]]]] [[URL]] から生成された場合 -- [CODE(URI)@en[[[javascript:]]]] [[URL]] の[[スクリプト]]の[[起源]] - [168] [[ネットワーク]]から供給されたもので、 [[URL scheme]] が[[server-based naming authority]]を持つものの場合 -- [[[CODE(DOMi)@en[Document]]の番地]]の[[起源]] - [171] [CODE(URI)@en[[[data:]]]] [[URL]] から生成された場合 -- [169] [[HTTP]] [[リダイレクト]] (や[[他のプロトコルの等価なもの]]) で返された --- [CODE(URI)@en[[[data:]]]] [[URL]] に[[リダイレクト]]した [[URL]] の[[起源]] -- [170] 他の [CODE(DOMi)@en[[[Document]]]] や[[スクリプト]]にあった場合 --- [[navigation]] を始めた [CODE(DOMi)@en[[[Document]]]] や[[スクリプト]]の[[起源]] - [172] [[[CODE(DOMi)@en[Document]]の番地]]が [CODE(URI)@en[[[about:blank]]]] の場合 -- [128] [[閲覧文脈]]が作られた時に割り当てられた[[起源]] --- [129] 新しい[[閲覧文脈]]が[[作成子閲覧文脈]]なら、[[作成子[CODE(DOMi)@en[Document]]]]の[[起源]] [SRC[>>127]] --- [130] そうでないなら、新しい[[閲覧文脈]]が作られた時に割り当てらられた大域的に固有な識別子 [SRC[>>127]] - [173] [CODE(HTMLe)@en[iframe]] [[[CODE(HTMLa)@en[srcdoc]]文書]]の場合 -- [[閲覧文脈]]の[[閲覧文脈包含子]]の [CODE(DOMi)@en[[[Document]]]] の[[起源]] - [174] その他の方法で得られた場合 -- [175] 例えば [CODE(URI)@en[[[data:]]]] [[URL]] を[[利用者]]が指定した場合 -- [176] 例えば [CODE(DOMm)@en[[[createDocument]]]] で作られた場合 -- [CODE(DOMi)@en[[[Document]]]] が作られた時に割り当てられた大域的に固有な識別子 * オブジェクトの起源 [178] [[HTML]] では次の各種オブジェクトの[[起源]]が定義されています [SRC[>>135]]。 これらについては[[実効スクリプト起源]]は意味を持たないため定義されていません。 - [179] [[画像]]について -- [180] [CODE(HTMLe)@en[[[img]]]] [[要素]]のものである場合、 --- [181] 画像データが [[CORS-cross-origin]] な場合 ---- [[画像]]が作られた時に割り当てられた大域的に固有な識別子 --- [182] 画像データが [[CORS-same-origin]] な場合 ---- [CODE(HTMLe)@en[[[img]]]] [[要素]]の [CODE(DOMi)@en[[[Document]]]] の[[起源]] - [183] [CODE(HTMLe)@en[[[audio]]]] [[要素]]と [CODE(HTMLe)@en[[[video]]]] [[要素]]について -- [184] [[媒体データ]]が [[CORS-cross-origin]] な場合 --- [[画像]]が作られた時に割り当てられた大域的に固有な識別子 -- [185] [[媒体データ]]が [[CORS-same-origin]] な場合 ---- [[媒体要素]]の [CODE(DOMi)@en[[[Document]]]] の[[起源]] - [186] [[フォント]]について -- [187] [[ダウンロード可能Webフォント]]の場合 --- [[フォント]]を得るために使った ([[リダイレクト]]後の) [[絶対URL]]の[[起源]] -- [188] 局所的にインストールされたシステムの[[フォント]]の場合 --- [[フォント]]が使われている [CODE(DOMi)@en[[[Document]]]] の[[起源]] ;; [189] 定義が必要ない場合、例えば [CODE(HTMLe)@en[[[object]]]] [[要素]]に表示される[[画像]]の場合の[[起源]]は定義されていません。 * [CODE(HTTP)@en[Origin:]] 欄 (HTTP) [109] [[HTTP]] の [DFN[[CODE(HTTP)@en[[[Origin:]]]]]] [[欄]]は、[[利用者エージェント]]が当該[[要求]]を発行することとなった元の[[起源]]を表します。 この[[起源]]が何であるか具体的な決定方法は、当該 [[API]] 等により定義されます。 [SRC[>>21]] ** 仕様書 [REFS[ - [21] '''[CITE@en[RFC 6454 - The Web Origin Concept]] ([TIME[2011-12-12 09:13:37 +09:00]] 版) ''' - [125] [CITE@en-US-x-hixie[HTML Standard]] ([TIME[2012-02-22 20:11:59 +09:00]] 版) - [123] [CITE@en-US[XMLHttpRequest]] ([TIME[2012-02-28 13:24:26 +09:00]] 版) ]REFS] ** 構文 [107] [CODE(HTTP)@en[[[Origin:]]]] 欄の構文は次のように定義されています [SRC[>>21]]。 [FIG[ [PRE(ABNF code)[ origin = "Origin:" [[OWS]] origin-list-or-null [[OWS]] origin-list-or-null = %x6E %x75 %x6C %x6C / origin-list origin-list = serialized-origin *( SP serialized-origin ) serialized-origin = [[scheme]] "://" [[host]] [ ":" [[port]] ] ; <[[scheme]]>, <[[host]]>, <[[port]]> from [[RFC 3986]] ]PRE] ]FIG] [108] つまり、文字列 [CODE(HTTP)[[[null]]]] ([[小文字]]) だけ、または [[ASCII直列化]]した[[起源]]の [CODE(char)[[[SP]]]] 区切りのリストとなります。 [113] [[利用者エージェント]]は任意の[[要求]]に [CODE(HTTP)@en[[[Origin:]]]] 欄を含めて[['''構いません''']]。 [SRC[>>21]] [114] 一つの[[要求]]に複数の [CODE(HTTP)@en[[[Origin:]]]] 欄を含めては[['''なりません''']]。 [SRC[>>21]] ;; [115] 複数含まれている場合に[[鯖]]がどう解釈するべきかは規定されていません。 ** 複数の値 [110] [[要求]]がなされるまでに複数の[[起源]]が関わっている場合、それをすべて列挙して[['''構いません''']]。 [SRC[>>21]] [EG[ [111] 例えば[[リダイレクト]]が発生した時、大元の[[起源]]と[[リダイレクト]]を行った[[起源]]を列挙して構いません。 ]EG] ;; [112] 列挙の順序や[[鯖]]による解釈の方法については特に規定されていません。 [118] 隣接する[[起源]]が[RUBYB[同じ]@en[identical]]であっては[['''なりません''']]。 そうなってしまう場合は片方だけ送信しなければ[['''なりません''']]。 [SRC[>>21]] [191] [[fetch]] (>>126) の定義においては[[リダイレクト]]の際に複数の値を [CODE(HTTP)@en[[[Origin:]]]] を入れることは認められていません。ただし明示的に禁じられているわけではなく、 自然に読むと複数にはならないというだけなので、実際には禁止する意図は無いかもしれません。 ** [CODE(HTTP)[null]] [116] 「[RUBYB[[[プライバシー]]重視]@en[privacy-sensitive]]」な文脈では値 [DFN[[CODE(HTTP)[[[null]]]]]] を送信しなければ[['''なりません''']]。具体的に何が「[[プライバシー]]重視」な文脈かは [CODE(HTTP)@en[[[Origin:]]]] 欄の仕様としては決めていませんが、[[応用]]ごとに決めることもできます。 [SRC[>>21]] [117] 値 [CODE(HTTP)[[[null]]]] はその他に[[3項組]]で表せない[[起源]]である時にも使われます。 ** 空文字列 [142] [[HTML]] の定義に従えば[[起源]]の[[ASCII直列化]]が[[空文字列]]になることもありますが、 その場合 [CODE(HTTP)@EN[[[Origin:]]]] の値をどうするべきかは不明確です。 ** fetch [126] [[fetch]] 操作においては、[[起源]]が呼び出し元により明示された場合、 それを [CODE(HTTP)@en[[[Origin:]]]] に使います。そうでない場合は「[[プライバシー]]重視」 な文脈として扱います。 [SRC[>>125]] [190] [[HTML]] や [[XHR]] の仕様上定義されたあらゆる [[HTTP]] [[要求]]は [[fetch]] 操作経由で発行されるので、従ってこれを実装している[[Webブラウザー]]からのあらゆる [[HTTP]] [[要求]]は何らかの [CODE(HTTP)@en[[[Origin:]]]] 欄を送出することになります。 ** 処理モデル [119] [[鯖]]による解釈の方法は特に規定されていません。 ** 歴史 [22] 例によって [[IETF]] で政治的なごたごたに巻き込まれて必要以上に長くかかっています。 [[RFC]] になるよりずっと先に [[Webブラウザー]]で実装が進みました。 [1] [CITE[Cross-Site Request Forgery]] ([TIME[2008-07-11 00:28:05 +09:00]] 版) [2] [CITE[Origin Header for CSRF Mitigation]] ([TIME[2008-11-30 15:01:02 +09:00]] 版) [3] [[HTML5]] の[[ナビゲーション]]の[[算法]]に組み込まれたみたいです。。。 [4] [CITE@en[(X)HTML5 Tracking]] ([TIME[2009-01-15 07:15:24 +09:00]] 版) [5] [CITE@en[ACTION-96: Origin removal]] ([[Henri Sivonen]] 著, [TIME[2009-01-19 08:33:27 +09:00]] 版) [6] [CITE@en[draft-abarth-origin-00 - The HTTP Origin Header]] ([TIME[2009-01-22 10:33:27 +09:00]] 版) [7] [CITE@en[(X)HTML5 Tracking]] ([TIME[2009-09-29 23:36:58 +09:00]] 版) [8] [CITE[IRC logs: freenode / #whatwg / 20090821]] ([TIME[2009-10-12 19:18:16 +09:00]] 版) [9] [CITE@en[Security/Origin - MozillaWiki]] ([TIME[2009-10-09 22:03:56 +09:00]] 版) [20] [CITE@en[The HTTP Sec-From Header]] draft-abarth-origin-01 の頃は [CODE(HTTP)@en[[[Sec-From:]]]] という名前が提案されていました。 [10] [CITE[IRC logs: freenode / #whatwg / 20090929]] ([TIME[2009-12-02 08:29:55 +09:00]] 版) [11] [CITE[IRC logs: freenode / #whatwg / 20091002]] ([TIME[2009-12-04 00:35:25 +09:00]] 版) [12] [CITE[IRC logs: freenode / #whatwg / 20091204]] ([TIME[2009-12-27 16:46:13 +09:00]] 版) [13] [CITE@en[Security/Origin - MozillaWiki]] ([TIME[2010-10-06 06:03:55 +09:00]] 版) [14] [CITE[IRC logs: freenode / #whatwg / 20101109]] ( ([TIME[2010-11-18 23:22:34 +09:00]] 版)) [15] [CITE[drafts/origin.xml at master from abarth's ietf-websec - GitHub]] ( ([TIME[2011-02-13 13:01:41 +09:00]] 版)) [16] [CITE[IRC logs: freenode / #whatwg / 20110815]] ( ([TIME[2011-08-27 15:22:54 +09:00]] 版)) [17] [CITE[IRC logs: freenode / #whatwg / 20111022]] ( ([TIME[2011-10-23 18:08:47 +09:00]] 版)) [18] [CITE@en[Web Applications 1.0 r6941 Drop old origin definitions that no longer matter.]] ( ([TIME[2012-01-31 09:48:00 +09:00]] 版)) [19] [CITE[Widget Access Request Policy]] ( ([TIME[2012-02-04 04:00:27 +09:00]] 版)) ** 関連 [124] [CODE(HTTP)@en[[[Origin:]]]] を [CODE(DOMi)@en[[[XMLHttpRequest]]]] で[[著者]]が指定することはできません [SRC[>>123]]。 [192] [CITE[Origin Header Proposal]] ( ([TIME[2011-12-28 22:11:55 +09:00]] 版))