1 |
wakaba |
1.21 |
* 起源
|
2 |
wakaba |
1.2 |
|
3 |
wakaba |
1.21 |
[24] [[Web]] の[[セキュリティー・モデル]]である[RUBYB[[[同一起源方針]]]@en[same-origin policy]]において、
|
4 |
|
|
[[URL]] の[[ドメイン]]等によって定まる[[資源]]の管理の単位を[DFN[[RUBY[起源]@en[オリジン]@en[origin]]]]といいます。
|
5 |
|
|
|
6 |
wakaba |
1.23 |
;; [85] [[同一起源方針]]の項もご覧ください。
|
7 |
|
|
|
8 |
wakaba |
1.21 |
** 仕様書
|
9 |
|
|
|
10 |
|
|
[REFS[
|
11 |
|
|
- [23] [CITE@en[RFC 6454 - The Web Origin Concept]] ([TIME[2011-12-12 09:13:37 +09:00]] 版) <http://tools.ietf.org/html/rfc6454>
|
12 |
|
|
]REFS]
|
13 |
|
|
|
14 |
wakaba |
1.22 |
** 識別
|
15 |
|
|
|
16 |
|
|
[25] [[起源]]は、
|
17 |
|
|
- [[URL scheme]]、[[host]]、[[port]] の[[3項組]]
|
18 |
|
|
- 大域的に固有な識別子
|
19 |
|
|
|
20 |
|
|
... のいずれかによって表されます。
|
21 |
|
|
|
22 |
wakaba |
1.23 |
[37] 大域的に固有な識別子は、他のすべての[[起源]]と異なる任意の値です。 [SRC[>>23 2.3.]]
|
23 |
|
|
|
24 |
|
|
;; [38] 通常は大域的に固有な識別子は[[利用者エージェント]]の外に露出することが無いので、
|
25 |
|
|
特定[[プロセス]]内の連番など任意の方法で決定できます。
|
26 |
|
|
|
27 |
|
|
[39] [[HTTP]] などで[[起源]]をやり取りする必要がある時は、 [[URL]] の構文の[[部分集合]]によって[[直列化]]して表します。
|
28 |
|
|
|
29 |
|
|
[EG[
|
30 |
|
|
[40] 例えば [CODE(URI)@en[http://www.example.com/foo/bar]] の[[起源]]は
|
31 |
|
|
([CODE(URI)[http]], [CODE(URI)[www.example,com]], [CODE(URI)[80]]) の[[3項組]]によって表されます。
|
32 |
|
|
これを [[HTTP]] の [CODE(HTTP)@en[[[Origin:]]]] 欄に含める時は、
|
33 |
|
|
[CODE(URI)[http://www.example.com]] と表現します。
|
34 |
|
|
]EG]
|
35 |
|
|
|
36 |
wakaba |
1.22 |
** URL の起源
|
37 |
|
|
|
38 |
|
|
[26] ある [[URL]] の[[起源]]は次の手順により求められます [SRC[>>23 4.]]。
|
39 |
|
|
= [27] [[URL]] が[[階層的]]でない、または[[絶対URL]]でないなら、新しい大域的に固有な識別子を生成し、
|
40 |
|
|
それを返します。
|
41 |
|
|
= [28] [VAR[url-scheme]] を、 [[URL]] の [[scheme]] 部分を[[小文字]]化したものとします。
|
42 |
|
|
= [29] 実装が [VAR[url-scheme]] により表される[[プロトコル]]に対応していないなら、
|
43 |
|
|
新しい大域的に固有な識別子を生成し、それを返します。
|
44 |
|
|
= [30] [VAR[url-scheme]] が [CODE(URI)@en[[[file]]]] なら、
|
45 |
|
|
[[実装定義]]の値を返して[['''構いません''']]。
|
46 |
|
|
= [32] [VAR[url-host]] を、 [[URL]] の [[host]] 部分を[[小文字]]化したものとします。
|
47 |
|
|
-- [[小文字]]化には [[RFC 4790]] の [CODE[[[i;ascii-casemap]]]] を使います。
|
48 |
|
|
-- [[IDNA]] により [[Uラベル]]は既に[[Aラベル]]に変換されているものと仮定しています。
|
49 |
|
|
= [33] [[URL]] に [[port]] 部分がなければ、
|
50 |
|
|
== [VAR[url-port]] を、 [VAR[url-scheme]] で表される[[プロトコル]]の[[既定のポート]]とします。
|
51 |
|
|
= [34] そうでなければ、
|
52 |
|
|
== [VAR[url-port]] を、 [[URL]] の [[port]] 部分とします。
|
53 |
|
|
= [35] ([VAR[url-scheme]], [VAR[url-host]], [VAR[url-port]]) の[[3項組]]を返します。
|
54 |
|
|
|
55 |
|
|
;; [36] 仕様上明記されていませんが、 >>32 や >>34 で [[host]] や [[port]] を[[正準化]]する必要がありそうです。
|
56 |
|
|
|
57 |
|
|
*** [CODE(URI)@en[file:]] URL の起源
|
58 |
|
|
|
59 |
|
|
[31] 仕様上 [CODE(URI)@en[[[file:]]]] [[URL]] の[[起源]]は[[実装]]定義となっています。
|
60 |
|
|
古い[[利用者エージェント]]は [CODE(URI)@en[[[file:]]]] [[URL]] に対して緩い制限しかかけていませんでしたが、
|
61 |
|
|
[[セキュリティー]]上の問題から最近の[[利用者エージェント]]では細かい単位で[[起源]]を設定していたりします。
|
62 |
|
|
例えば、[[ディレクトリー]]単位でアクセスを制限したり、[[ファイル]]ごとに完全に別の[[起源]]として扱ったりしています
|
63 |
|
|
[SRC[>>23 4.]]。
|
64 |
|
|
|
65 |
wakaba |
1.25 |
** 比較
|
66 |
wakaba |
1.23 |
|
67 |
|
|
[81] 2つの[[起源]]が「[RUBYB[同じ]@en[same]]」である時、その時に限って[RUBYB[同一]@en[identical]]です。
|
68 |
|
|
具体的には、
|
69 |
|
|
- [82] 2つの[[起源]]が共に [[scheme]]/[[host]]/[[port]] の[[3項組]]であるなら、
|
70 |
|
|
3つがそれぞれ[RUBYB[同一]@en[identical]]であるなら、その場合に限って[RUBYB[同じ]@en[same]]です。
|
71 |
|
|
- [83] 大域的に固有な識別子は、 [[scheme]]/[[host]]/[[port]] の[[3項組]]と[RUBYB[同じ]@en[same]]であることはありません。
|
72 |
|
|
|
73 |
|
|
... と定義されています。 [SRC[>>23 5.]]
|
74 |
|
|
|
75 |
wakaba |
1.24 |
;; [87] あまり意味がないからか自明だからか仕様上明記されていませんが、[[起源]]が共に大域的に固有な識別子である時も、
|
76 |
|
|
それが同じ値であるなら、その場合に限って、同じ[[起源]]であるはずです。
|
77 |
|
|
|
78 |
wakaba |
1.23 |
[84] 2つの[[URL]]は、その[[起源]]が[RUBYB[同じ]@en[same]]なら、[RUBYB[[[同一起源]]]@en[same-origin]]です。
|
79 |
|
|
[SRC[>>23 5.]]
|
80 |
|
|
|
81 |
|
|
;; [86] 同じ[[URL]]であるからといって[[起源]]も同じとは限りません。例えば [CODE(URI)@en[[[data:]]]]
|
82 |
|
|
[[URL]] は毎回新しい大域的に固有な識別子が割り振られるため、違う[[起源]]になります。
|
83 |
|
|
|
84 |
wakaba |
1.25 |
** 直列化
|
85 |
|
|
|
86 |
|
|
*** ASCII 直列化
|
87 |
|
|
|
88 |
|
|
[88] [[起源]]の [DFN[Unicode [RUBYB[直列化]@en[serialization]]]]は、次の手順によって得られる文字列です
|
89 |
|
|
[SRC[>>25 6.1.]]。
|
90 |
|
|
|
91 |
|
|
= [99] [[起源]]が [[URL scheme]]、[[host]]、[[port]] の[[3項組]]で''ない''なら、[[文字列]]
|
92 |
|
|
[CODE[[[null]]]] を返して停止します。
|
93 |
|
|
= [100] そうでなければ、 [VAR[result]] を[[起源]]の [[scheme]] とします。
|
94 |
|
|
= [101] [VAR[result]] の後ろに [CODE[://]] を付加します。
|
95 |
|
|
= [102] [[起源]]の [[host]] 部分を [VAR[result]] の後ろに付加します。
|
96 |
|
|
= [103] [[起源]]の [[port]] 部分が [[scheme]] で指定された[[プロトコル]]の[[既定のポート]]と異なっていれば、
|
97 |
|
|
[VAR[result]] の後ろに [CODE(char)[[[:]]]] を付加し、更に[[ポート番号]]を[[十進数]]で付加します。
|
98 |
|
|
= [104] [VAR[result]] を返します。
|
99 |
|
|
|
100 |
|
|
;; [105] >>103 は厳密には更に[[ポート番号]]を最小の桁数で (つまり[[先導0]]なしで) 表現するという制約が必要なはずです。
|
101 |
|
|
|
102 |
|
|
**** Unicode 直列化
|
103 |
|
|
|
104 |
|
|
[89] [[起源]]の [DFN[Unicode [RUBYB[直列化]@en[serialization]]]]は、次の手順によって得られる文字列です
|
105 |
|
|
[SRC[>>25 6.1.]]。
|
106 |
|
|
|
107 |
|
|
= [90] [[起源]]が [[URL scheme]]、[[host]]、[[port]] の[[3項組]]で''ない''なら、[[文字列]]
|
108 |
|
|
[CODE[[[null]]]] を返して停止します。
|
109 |
|
|
= [91] そうでなければ、 [VAR[result]] を[[起源]]の [[scheme]] とします。
|
110 |
|
|
= [92] [VAR[result]] の後ろに [CODE[://]] を付加します。
|
111 |
|
|
= [93] [[起源]]の [[host]] 部分の各部品を次の手順により変換しつつ、 [CODE(char)[[[.]]]]
|
112 |
|
|
で連結して [VAR[result]] の後ろに付加します。
|
113 |
|
|
== [94] 部品が [[Aラベル]]なら、対応する[[Uラベル]]にします。
|
114 |
|
|
== [95] そうでなければ、部品をそのまま使います。
|
115 |
|
|
= [96] [[起源]]の [[port]] 部分が [[scheme]] で指定された[[プロトコル]]の[[既定のポート]]と異なっていれば、
|
116 |
|
|
[VAR[result]] の後ろに [CODE(char)[[[:]]]] を付加し、更に[[ポート番号]]を[[十進数]]で付加します。
|
117 |
|
|
= [97] [VAR[result]] を返します。
|
118 |
|
|
|
119 |
|
|
;; [98] >>96 は厳密には更に[[ポート番号]]を最小の桁数で (つまり[[先導0]]なしで) 表現するという制約が必要なはずです。
|
120 |
|
|
|
121 |
|
|
;; [106] [[ASCII]] 版との違いは、 >>94 で [[Uラベル]]に変換するところだけです。
|
122 |
|
|
|
123 |
wakaba |
1.21 |
* [CODE(HTTP)@en[Origin:]] 欄 (HTTP)
|
124 |
|
|
|
125 |
|
|
** 仕様書
|
126 |
wakaba |
1.20 |
|
127 |
|
|
[REFS[
|
128 |
wakaba |
1.26 |
- [21] [CITE@en[RFC 6454 - The Web Origin Concept]] ([TIME[2011-12-12 09:13:37 +09:00]] 版) <http://tools.ietf.org/html/rfc6454#section-7>
|
129 |
wakaba |
1.20 |
]REFS]
|
130 |
|
|
|
131 |
wakaba |
1.21 |
** 歴史
|
132 |
wakaba |
1.19 |
|
133 |
wakaba |
1.20 |
[22] 例によって [[IETF]] で政治的なごたごたに巻き込まれて必要以上に長くかかっています。
|
134 |
|
|
[[RFC]] になるよりずっと先に [[Webブラウザー]]で実装が進みました。
|
135 |
|
|
|
136 |
wakaba |
1.2 |
[1]
|
137 |
|
|
[CITE[Cross-Site Request Forgery]] ([TIME[2008-07-11 00:28:05 +09:00]] 版) <http://crypto.stanford.edu/websec/csrf/>
|
138 |
|
|
|
139 |
|
|
[2]
|
140 |
|
|
[CITE[Origin Header for CSRF Mitigation]] ([TIME[2008-11-30 15:01:02 +09:00]] 版) <http://crypto.stanford.edu/websec/specs/origin-header/>
|
141 |
|
|
|
142 |
|
|
[3]
|
143 |
wakaba |
1.3 |
[[HTML5]] の[[ナビゲーション]]の[[算法]]に組み込まれたみたいです。。。
|
144 |
|
|
|
145 |
wakaba |
1.4 |
[4] [CITE@en[(X)HTML5 Tracking]] ([TIME[2009-01-15 07:15:24 +09:00]] 版) <http://html5.org/tools/web-apps-tracker?from=2668&to=2669>
|
146 |
|
|
|
147 |
wakaba |
1.5 |
[5] [CITE@en[ACTION-96: Origin removal]] ([[Henri Sivonen]] 著, [TIME[2009-01-19 08:33:27 +09:00]] 版) <http://lists.w3.org/Archives/Public/public-html/2009Jan/0210.html>
|
148 |
|
|
|
149 |
wakaba |
1.19 |
[6] [CITE@en[draft-abarth-origin-00 - The HTTP Origin Header]] ([TIME[2009-01-22 10:33:27 +09:00]] 版) <http://tools.ietf.org/html/draft-abarth-origin-00>
|
150 |
|
|
|
151 |
|
|
[7] [CITE@en[(X)HTML5 Tracking]]
|
152 |
|
|
([TIME[2009-09-29 23:36:58 +09:00]] 版)
|
153 |
|
|
<http://html5.org/tools/web-apps-tracker?from=4010&to=4011>
|
154 |
|
|
|
155 |
|
|
[8] [CITE[IRC logs: freenode / #whatwg / 20090821]]
|
156 |
|
|
([TIME[2009-10-12 19:18:16 +09:00]] 版)
|
157 |
|
|
<http://krijnhoetmer.nl/irc-logs/whatwg/20090821#l-235>
|
158 |
|
|
|
159 |
|
|
[9] [CITE@en[Security/Origin - MozillaWiki]]
|
160 |
|
|
([TIME[2009-10-09 22:03:56 +09:00]] 版)
|
161 |
|
|
<https://wiki.mozilla.org/Security/Origin>
|
162 |
|
|
|
163 |
|
|
[20] [CITE@en[The HTTP Sec-From Header]] draft-abarth-origin-01 の頃は [CODE(HTTP)@en[[[Sec-From:]]]]
|
164 |
|
|
という名前が提案されていました。
|
165 |
|
|
|
166 |
|
|
[10] [CITE[IRC logs: freenode / #whatwg / 20090929]]
|
167 |
|
|
([TIME[2009-12-02 08:29:55 +09:00]] 版)
|
168 |
|
|
<http://krijnhoetmer.nl/irc-logs/whatwg/20090929>
|
169 |
|
|
|
170 |
|
|
[11] [CITE[IRC logs: freenode / #whatwg / 20091002]]
|
171 |
|
|
([TIME[2009-12-04 00:35:25 +09:00]] 版)
|
172 |
|
|
<http://krijnhoetmer.nl/irc-logs/whatwg/20091002#l-620>
|
173 |
|
|
|
174 |
|
|
[12] [CITE[IRC logs: freenode / #whatwg / 20091204]]
|
175 |
|
|
([TIME[2009-12-27 16:46:13 +09:00]] 版)
|
176 |
|
|
<http://krijnhoetmer.nl/irc-logs/whatwg/20091204#l-293>
|
177 |
|
|
|
178 |
|
|
[13] [CITE@en[Security/Origin - MozillaWiki]]
|
179 |
|
|
([TIME[2010-10-06 06:03:55 +09:00]] 版)
|
180 |
|
|
<https://wiki.mozilla.org/Security/Origin>
|
181 |
|
|
|
182 |
|
|
[14] [CITE[IRC logs: freenode / #whatwg / 20101109]]
|
183 |
|
|
( ([TIME[2010-11-18 23:22:34 +09:00]] 版))
|
184 |
|
|
<http://krijnhoetmer.nl/irc-logs/whatwg/20101109#l-206>
|
185 |
|
|
|
186 |
|
|
[15] [CITE[drafts/origin.xml at master from abarth's ietf-websec - GitHub]]
|
187 |
|
|
( ([TIME[2011-02-13 13:01:41 +09:00]] 版))
|
188 |
|
|
<https://github.com/abarth/ietf-websec/blob/master/drafts/origin.xml>
|
189 |
|
|
|
190 |
|
|
[16] [CITE[IRC logs: freenode / #whatwg / 20110815]]
|
191 |
|
|
( ([TIME[2011-08-27 15:22:54 +09:00]] 版))
|
192 |
|
|
<http://krijnhoetmer.nl/irc-logs/whatwg/20110815#l-134>
|
193 |
|
|
|
194 |
|
|
[17] [CITE[IRC logs: freenode / #whatwg / 20111022]]
|
195 |
|
|
( ([TIME[2011-10-23 18:08:47 +09:00]] 版))
|
196 |
|
|
<http://krijnhoetmer.nl/irc-logs/whatwg/20111022>
|
197 |
|
|
|
198 |
|
|
[18] [CITE@en[Web Applications 1.0 r6941 Drop old origin definitions that no longer matter.]]
|
199 |
|
|
( ([TIME[2012-01-31 09:48:00 +09:00]] 版))
|
200 |
|
|
<http://html5.org/tools/web-apps-tracker?from=6940&to=6941>
|
201 |
|
|
|
202 |
|
|
[19] [CITE[Widget Access Request Policy]]
|
203 |
|
|
( ([TIME[2012-02-04 04:00:27 +09:00]] 版))
|
204 |
wakaba |
1.18 |
<http://dev.w3.org/2006/waf/widgets-access/#dfn-origin> |