* 起源 [24] [[Web]] の[[セキュリティー・モデル]]である[RUBYB[[[同一起源方針]]]@en[same-origin policy]]において、 [[URL]] の[[ドメイン]]等によって定まる[[資源]]の管理の単位を[DFN[[RUBY[起源]@en[オリジン]@en[origin]]]]といいます。 ;; [85] [[同一起源方針]]の項もご覧ください。 ** 仕様書 [REFS[ - [23] [CITE@en[RFC 6454 - The Web Origin Concept]] ([TIME[2011-12-12 09:13:37 +09:00]] 版) ]REFS] ** 識別 [25] [[起源]]は、 - [[URL scheme]]、[[host]]、[[port]] の[[3項組]] - 大域的に固有な識別子 ... のいずれかによって表されます。 [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] ** URL の起源 [26] ある [[URL]] の[[起源]]は次の手順により求められます [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]] を[[正準化]]する必要がありそうです。 *** [CODE(URI)@en[file:]] URL の起源 [31] 仕様上 [CODE(URI)@en[[[file:]]]] [[URL]] の[[起源]]は[[実装]]定義となっています。 古い[[利用者エージェント]]は [CODE(URI)@en[[[file:]]]] [[URL]] に対して緩い制限しかかけていませんでしたが、 [[セキュリティー]]上の問題から最近の[[利用者エージェント]]では細かい単位で[[起源]]を設定していたりします。 例えば、[[ディレクトリー]]単位でアクセスを制限したり、[[ファイル]]ごとに完全に別の[[起源]]として扱ったりしています [SRC[>>23 4.]]。 ** 起源の比較 [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.]] [84] 2つの[[URL]]は、その[[起源]]が[RUBYB[同じ]@en[same]]なら、[RUBYB[[[同一起源]]]@en[same-origin]]です。 [SRC[>>23 5.]] ;; [86] 同じ[[URL]]であるからといって[[起源]]も同じとは限りません。例えば [CODE(URI)@en[[[data:]]]] [[URL]] は毎回新しい大域的に固有な識別子が割り振られるため、違う[[起源]]になります。 * [CODE(HTTP)@en[Origin:]] 欄 (HTTP) ** 仕様書 [REFS[ - [21] [CITE@en[RFC 6454 - The Web Origin Concept]] ([TIME[2011-12-12 09:13:37 +09:00]] 版) ]REFS] ** 歴史 [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]] 版))