/
485.txt
680 lines (515 loc) · 38.7 KB
/
485.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
[24] [[Web]] の[[セキュリティーモデル]]である[RUBYB[[[同一起源ポリシー]]]@en[same-origin policy]]において、
[[URL]] の[[ドメイン]]等によって定まる[[資源]]の管理の単位を[DFN[[RUBY[起源]@en[オリジン]@en[origin]]]]といいます。
;; [85] [[同一起源ポリシー]]の項もご覧ください。
[292] [[起源]]は、[[URL scheme]]、[[ホスト]]、[[ポート]]などによって決まる[[資源]]群の範囲であり、[[スクリプト]]などが通常相互にアクセスできる領域を定めるものとなっています。
[EG[
[310] 例えば <http://www.example.com/hoge?aa> に [CODE(HTMLe)@en[[[iframe]]]] で
<http://www.example.org/fuga?bb> が埋め込まれているとします。外側の [CODE(DOMi)@en[[[Window]]]]
の[[起源]]は [CODE[(http, www.example.com, 80)]] で、内側の [CODE(DOMi)@en[[[Window]]]]
の[[起源]]は [CODE[(http, www.example.org, 80)]] です。両者は異なる[[起源]]に属しますから、
一方の[[スクリプト]]から他方の [[DOM]] にはアクセスできません。
]EG]
* 仕様書
[REFS[
- [135] '''[CITE@en-US-x-hixie[HTML Standard]] ([TIME[2012-02-22 20:11:59 +09:00]] 版) <http://www.whatwg.org/specs/web-apps/current-work/#origin>'''
- [127] [CITE@en-US-x-hixie[HTML Standard]] ([TIME[2012-02-22 20:11:59 +09:00]] 版) <http://www.whatwg.org/specs/web-apps/current-work/#windows>
- [131] [CITE@en-US-x-hixie[HTML Standard]] ([TIME[2012-02-22 20:11:59 +09:00]] 版) <http://www.whatwg.org/specs/web-apps/current-work/#origins-of-workers>
- [233] [[[CODE(DOMi)@en[XMLHttpRequest]]起源]]
-- [231] [CITE@en-US[XMLHttpRequest]] ([TIME[2012-06-23 04:08:48 +09:00]] 版) <http://dvcs.w3.org/hg/xhr/raw-file/tip/Overview.html#xmlhttprequest-origin>
-- [232] [CITE@en-US[XMLHttpRequest]] ([TIME[2012-06-23 04:10:36 +09:00]] 版) <http://dvcs.w3.org/hg/xhr/raw-file/tip/Overview.html#dom-xmlhttprequest-open>
-- [229] [CITE@en-US-x-hixie[HTML Standard]] ([TIME[2012-06-23 00:59:02 +09:00]] 版) <http://www.whatwg.org/specs/web-apps/current-work/#interface-objects-and-constructors>
- [272] [CITE@en[CSS Cascading and Inheritance Level 3]] ([TIME[2013-08-09 23:50:23 +09:00]] 版) <http://dev.w3.org/csswg/css-cascade/#at-import>
]REFS]
[HISTORY[
[293] 以前は [[RFC 6454]] [SRC[>>23]] に定義がありましたが、
現在では事実上[[廃止]]されたものとみなされています。
[[IETF]] の手続き上は未だに現行仕様扱いになっているので、
気付かずに参照する人がいます。
しかし内容が数世代古く曖昧なところもありますから、
注意が必要です。
]HISTORY]
* 名称
[5] [[起源]] ([[origin]]) は、[[日本語]]で[[生成元]]、[[源泉]]、[[オリジン]]などと訳されることもあります。
* 起源オブジェクト
[25] [DFN[[RUBYB[[[起源]]]@en[origin]]]]は、
[[不透明起源]]または[[項組起源]]です [SRC[>>135]]。
[EG[
[49] [CODE(URI)@en[http:]]、[CODE(URI)@en[https:]]、[CODE(URI)@en[ftp:]]
の [[URLの起源]]は、[[項組起源]]です。
]EG]
[EG[
[50] [[Webブラウザー]]の[[アドレスバー]]に [CODE(URI)@en[data:]] [[URL]]
を指定して開かれた[[文書の起源]]は、その時点で新たに作成された[[不透明起源]]です。
]EG]
[8] [[起源]]は、[[オブジェクト]]です。複数の箇所から同じ[[起源]]オブジェクトが参照されることがあります。
例えば複数の[[文書]]の[[起源][文書の起源]]が同じオブジェクトに設定されるかもしれません。
その場合、当然ながら[[起源]]オブジェクトの編集はすべての参照箇所に影響します。
[47] [[起源]]の複製が他の箇所に設定されることもあります。
これは複製時点の[[起源]]オブジェクトの構成値が同じ新しいオブジェクトを作ることを意味します。
その後一方の[[起源]]オブジェクトを編集しても、他方には波及しません。
[48] [CODE(JS)@en[document.domain]] に値を設定すると、
[[起源]]オブジェクトが編集されることがあります。
[79] [[起源]]には、[F[実効ドメイン]]が定義されます。
[HISTORY[
[226] 2016年の改訂までは[[起源]]を他の[[起源]]の「[DFN[[RUBYB[[[別名]]]@en[alias]]]]」
とできるとされ、 [CODE(JS)@en[document.domain]] の動作を説明するために用いられていましたが、
実際にはこの方法ではうまく説明できないことがわかり、改められました。
]HISTORY]
* 項組起源
[2] [DFN[[RUBYB[[[項組起源]]]@en[tuple origin]]]]は、
[F[scheme][URL scheme]]、
[F[ホスト]]、
[F[ポート]]、
[F[ドメイン][document.domain]]で構成される[[項組]]です [SRC[>>135]]。
[73] [[項組起源]]オブジェクトは、 [[URL]] から作られます。
この元となる [[URL]] は [[URLの構文解析]]により[[正規化]]した結果なので、
[[起源]]の各項も、[[正規化]]済みの値になります。
[74] [DFN[[[scheme][URL scheme]]]] は、すべて[[小文字]]です。
[75] [[ホスト]]は、すべて [[ASCII]] の[[小文字]]です。
[76] [[ポート]]は、[[整数]]か [[null]] です。[[既定のポート番号]]は使わずに [[null]]
とします。
[39] [[HTTP]] などで[[起源]]をやり取りする必要がある時は、 [[URL]]
の構文の[[部分集合]]によって[[直列化]]して表します (>>160)。
[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]
[HISTORY[
[78] かつては [[URL scheme]]、[[ホスト]]、[[ポート]]の3項だったので、
[RUBYB[[[3項組]]]@en[triple]]ということもありました。
]HISTORY]
* 不透明起源
[3] [DFN[[RUBYB[不透明起源]@en[opaque origin]]]]は、
何らかの内部的な値で表されます [SRC[>>135]]。
自身 (同じ[[起源]]オブジェクトやその複製として作られた[[起源]]オブジェクト)
とは同じとみなされますが、それ以外とは異なるとみなされるものです。
[FIG(corollary)[
[38] 不透明な識別子は[[利用者エージェント]]の外や[[スクリプト]]に露出することが無いので、
特定[[プロセス]]内の連番など任意の方法で決定できます。
他の[[起源]]と同じか異なるかさえ判断できれば、どんな方法で実装しても構いません。
]FIG]
[HISTORY[
[37] かつては、
[RUBYB[不透明な識別子]@en[opaque identifier]]や[RUBYB[大域的に固有な識別子]@en[globally unique identifier]]と呼ばれていました。
]HISTORY]
[4] [[不透明起源]]は、[[直列化]]できません。 [CODE[null]]
や値なしなどとして表す場合もありますが、いったんそうするとどの[[不透明起源]]を表していたかはわかrなくなります。
* 比較
[150] 次の[[手順]]が[[真]]を返す時、2つの[[起源]]は[DFN[[RUBYB[同一起源]@en[same origin]]]]です。 [SRC[>>135]]
[FIG(steps)[
= [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] [[真]]を返します。
]FIG]
[19] なお [[port]] は、 [[URL]] で使われる[[数値]]の他に、「[[手動上書き]]」
なる特別な値もあります。
;; [159] [[RFC 6454]] の定義 (>>81) とは違ってすべての場合が明確に規定されています。
** 起源横断
[207] [[同一起源]]でないことを[DFN[[RUBY[[[起源横断]]]@en[クロスオリジン]@en[cross-origin]]]]であるといいます。
[REFS[
- [206] [CITE@en-US[Cross-Origin Resource Sharing]] ([TIME[2012-03-01 15:01:30 +09:00]] 版) <http://dvcs.w3.org/hg/cors/raw-file/tip/Overview.html#cross-origin>
]REFS]
* 直列化
[160] [[起源]]の[[直列化]]の方法には、[[ASCII直列化]]と[[Unicode直列化]]の2種類があります。
その名の通り、 [[ASCII直列化]]は [[ASCII文字]]のみで、
[[Unicode直列化]]は [[Unicode]] 全体で[[起源]]を表現するものです。
[11] どちらも、不透明な識別子は [CODE[null]] と表現します。
[296] [[ASCII直列化]]できない[[host]]を含む[[起源]]は[[空文字列]]によって表されます。
[HISTORY[
[297] [[RFC 6454]] の定義ではそのような[[起源]]の存在は考慮されていませんでした。
]HISTORY]
[20] [[ポート]]の特別な値「[[手動上書き]]」の[[直列化]]の方法は規定されていませんが、
これを[[直列化]]しなければならない場面は無いと思われます。
[208] [CODE(HTTP)@en[[[Access-Control-Allow-Origin:]]]] 欄では任意の[[起源]]を表す
[CODE(HTTP)[[[*]]]] という特別な値も認められています。
[HISTORY[
[136] [[起源]]の[[直列化]]については、 [[RFC 6454]] と [[HTML]] で微妙に定義が異なっていました。
[SRC[>>25 6.]], [SRC[>>135]]
[137] 元々 [[HTML]] にあった定義をコピーして [[IETF]] 版を作った時に政治的な理由か何かで書き換わったのでしょう。
]HISTORY]
[12] [[プロトコル]]では [[ASCII直列化]]が、[[DOM]] では[[Unicode直列化]]が用いられています。
[31] [CODE(DOMm)@en[[[postMessage]]]] では、[[著者]] ([[スクリプト]])
が[[起源]]を指定するために [[URL]] を使っています。
** ASCII 直列化
[88] [[起源]][VAR[起源]]の [DFN[[F[ASCII[RUBYB[直列化]@en[serialization]]][ASCII直列化]]]]は、
次のようにして得られる[[文字列]]です [SRC[>>135]]。
[FIG(steps)[
= [99] [VAR[起源]]が[[三項組]]でなければ、
== [61] [[null]] を返します。
= [62] それ以外なら、
== [63] [VAR[起源]]を[[三項組]]として直列化した結果を返します。
]FIG]
[HISTORY[
[64] かつての [[RFC]] [SRC[>>25 6.1.]] は、[[三項組]]の場合に[F[ホスト]]をそのまま出力するとしていました。
[65] かつての [[HTML Standard]] [SRC[>>135]] は、
[[三項組]]の場合に[F[ホスト]]に [[IDNA2003]] [[ToASCII]]
[[演算]]を適用た結果を出力するとしていました。
この時、 [[AllowUnassigned]] と [[UseSTD3ASCIIRules]] の2つの[[フラグ]]は設定した状態にすることとされていました。
また[F[ホスト]]のいずれかの[[部品]]で [[ToASCII]] が失敗したら、
[[空文字列]]を返して[[直列化]]の[[手続き]]を停止することになっていました。
[141] [[HTML]] の定義に従えば、 [[LDHラベル]]化できない [[host]] だった場合に[[起源]]は[[空文字列]]によって表されることになります。
[[RFC]] の定義によれば[[空文字列]]になることはありません。
[66] [[HTML Standard]] の定義はその後 [[URL Standard]] の演算を参照する形となりました。
[67] 更に2016年3月には、 [[URL Standard]] に合わせて再度整理されました。
[[起源]]オブジェクトの作成時に使われた [[URL]] が既に [[URLの構文解析]]時点で
[[ASCII]] 形に正規化されているため、[[ASCII直列化]]時点での演算は不要となっています。
]HISTORY]
;; [21] [[起源]]を構成する [[URL scheme]] や [[host]] は元々[[小文字]]に正規化されているはずですから、
[[ASCII直列化]]もすべて[[小文字]]となるはずです。
[298] これは次の場面で使われています。
[FIG(list middle)[
- [132] [CODE(HTTP)@en[[[Origin:]]]] ([[HTTP]])
- [133] [CODE(HTTP)@en[[[Origin:]]]] ([[Web Sockets]])
- [288] [CODE(HTTP)@en[[[Access-Control-Allow-Origin:]]]] ([[HTTP]])
- [286] [CODE(HTTP)@en[[[X-Frame-Options:]]]] ([[HTTP]])
- [CODE(HTTP)@en[[[Timing-Allow-Origin:]]]] ([[HTTP]])
]FIG]
** Unicode 直列化
[89] [[起源]][VAR[起源]]の [DFN[[F[Unicode[RUBYB[直列化]@en[serialization]]][Unicode直列化]]]]は、
次のようにして得られる[[文字列]]です [SRC[>>135]]。
[FIG(steps)[
= [90] [VAR[起源]]が[[三項組]]でなければ、
== [9] [[null]] を返します。
= [52] それ以外なら、
== [53] [VAR[ホスト]]を、[VAR[起源]]の[F[ホスト]]に設定します。
== [55] [VAR[ホスト]]が[[ドメイン]]なら、
=== [54] [VAR[Unicodeホスト]]を、[VAR[ホスト]]に [[domain to Unicode]] を適用した結果に設定しま
す。
= [58] [[三項組]] ([VAR[起源]]の[F[ホスト]], [VAR[Unicodeホスト]], [VAR[起源]]の[F[ポート]]) を直列化した結果を返します。
== [56] それ以外なら、
=== [57] [VAR[起源]]を[[三項組]]として直列化した結果を返します。
]FIG]
[HISTORY[
[59] かつての [[RFC]] [SRC[>>25 6.1.]] や [[HTML]] [SRC[>>135]]
は、[VAR[ホスト]]部分の[[直列化]]を次のように規定していました。
[FIG(steps)[
= [93] [[起源]]の[F[ホスト]]の各[[部品]]を次の手順により変換しつつ、 [CODE(char)[[[.]]]]
で連結して返します。
== [139] [[RFC]] の定義:
=== [94] 部品が [[IDNA2008]] [[Aラベル]]なら、対応する[[Uラベル]]にします。
=== [95] そうでなければ、部品をそのまま使います。
== [138] [[HTML]] の定義: 部品に [[IDNA2003]] [[ToUnicode]] [[演算]]を適用します。
]FIG]
[60] [[HTML Standard]] の定義はその後 [[URL Standard]] の演算を参照する形に変更されました。
[68] 更に2016年3月に改めて [[URL Standard]] の規定に基づき整理されました。
]HISTORY]
[299] これは次の場面で使われています。
[FIG(list middle)[
- [134] [CODE(DOMa)@en[[[origin]]]] ([CODE(DOMi)@en[[[MessageEvent]]]])
- [275] [CODE(JS)@en[[[document.origin]]]] ([[DOM]])
- [287] [CODE(DOMa)@en[origin][location.origin]] ([CODE(DOMi)@en[[[URLUtils]]]])
- [CODE(DOMa)@en[[[ancestorOrigins]]]]
- [[Blob URL]]
]FIG]
** 三項組の直列化
[69] [[ASCII直列化]]や [[Unicode直列化]]における[[三項組]][VAR[起源]]の[[直列化]]は、
次のものを順に連結した[[文字列]]です [SRC[>>135]]。
[FIG(list)[
= [VAR[起源]]の[F[scheme][URL scheme]]
= [CODE[://]]
= [VAR[起源]]の[F[ホスト]]に[[ホスト直列化器]]を適用した結果
= [VAR[起源]]の[F[ポート]]が [[null]] でない場合、
== [CODE[:]]
== [VAR[起源]]の[F[ポート]]に[[整数の直列化]]を適用した結果
]FIG]
[HISTORY[
[103] かつての [[RFC]] や [[HTML]] の定義では、
[[既定のポート番号]]と等しい場合には[[ポート]]を付加しない、
という規定になっていました。
[70] 2016年3月の改訂により、[[既定のポート番号]]の場合の[[起源]]の[[ポート番号]]は
[[null]] と ([[仕様書]]上は) 扱われるよう整理されたため、
現在は [[null]] かどうかの分岐になっています。
[71] かつての [[RFC]] や [[HTML]] の定義では[[ポート番号]]を最小の桁数で
(つまり[[先導0]]なしで) 表現するよう要求していませんでしたが、
この整理により明確化されました。
]HISTORY]
** [CODE(URI)@en[file:]] URL の起源の直列化
[200] [CODE(URI)@en[[[file:]]]] [[URL]] の[[起源]]は実装依存となっており (>>31)、
そもそもそれがどのような形で表されるのか不明確です。[[3項組]]かもしれませんし、
大域的に固有な識別子かもしれません。どちらでもない独自の形式かもしれません
[WEAK[(それが仕様上明確に認められているわけではありませんが)]]。
[201] 直列化の[[算法]]を素直に適用すれば、 [CODE[[[null]]]] が得られるはずです。
[203] >>202 によれば [[Safari]] は「[CODE(URI)@en[[[file:]]//]]」を [CODE(HTTP)@en[[[Origin:]]]]
に指定することがあります。
[REFS[
- [202] [CITE[httpwebrequest - Safari complains: Origin file:// is not allowed by Access-Control-Allow-Origin - Stack Overflow]] ([TIME[2012-02-29 23:39:38 +09:00]] 版) <http://stackoverflow.com/questions/6948485/safari-complains-origin-file-is-not-allowed-by-access-control-allow-origin>
]REFS]
** IDNA との関係
[120] [[IDN]] について、[[起源]]の定義が [[URI]] であることから[[起源]]の決定に [[ToASCII]]
が必要となる場合があること、[[Unicode直列化]]を使う場面があることから[[起源]]の表記のために
[[ToUnicode]] が必要となる場合があることにより、[[起源]]は [[IDNA]] に依存しています。
[122] [[RFC]] 上の[[起源]]の定義は [[IDNA2008]] に拠っていますが、 [[IDNA2003]]
と [[IDNA2008]] のどちらを実装するかによって結果が異なることへの注記もあります [SRC[>>23 8.4]]。
[[HTML]] の[[起源]]の定義は [[IDNA2003]] に拠っています。
現実の[[Webブラウザー]]が実装しているものは厳密にはどちらの仕様とも異なっています。
** その他の直列化
[16] [[HOBA]] は、独自の[[直列化]]の方式を規定しています。
[[RFC 3986]] [[URI]] から [[URL scheme]]、[[authority]] ([[hostname]] の意か?)、
[[port]] を連結したもの [SRC[>>17]] とされています。ただし[[既定のポート番号]]はなく、
必ず [[port]] を明示する必要があります [SRC[>>17]]。
;; [18] なぜ素直に標準的な[[ASCII直列化]]を使わないのかは謎です。
[REFS[
- [17] [CITE@en[RFC 7486 - HTTP Origin-Bound Authentication (HOBA)]] ([TIME[2015-03-11 12:17:16 +09:00]] 版) <https://tools.ietf.org/html/rfc7486#page-8>
]REFS]
* 概念やオブジェクトの起源
[6] [[Web]] 上の色々な[[オブジェクト]]や[[概念]]に対して[[起源]]が定義されています。
[FIG(short list)[
- [[URLの[F[起源]]]]
- [[文書の[F[起源]]]]
- [[文書]]の[F[実効スクリプト起源]]
- [[環境設定群オブジェクトの[F[起源]]]]
- [[環境設定群オブジェクト]]の[F[実効スクリプト起源]]
- [[[CODE(HTMLe)@en[img]]の起源]]
- [[媒体要素の起源]]
- [[フォントの起源]]
]FIG]
** [CODE(DOMi)@en[XMLHttpRequest]] 起源
[234] [DFN[[CODE(DOMi)@en[XMLHttpRequest]][RUBYB[起源]@en[origin]]]]は、基本的には
[[[CODE(DOMi)@en[XMLHttpRequest]]文書]]の[[起源]]です。 [SRC[>>232, >>231]]
つまりは [CODE(DOMi)@en[[[XMLHttpRequest]]]] に対応する [CODE(DOMi)@en[[[Window]]]]
[[オブジェクト]]の[[文書]]の[[起源]]です。
[230] [[ワーカー]]にあっては、 [DFN[[CODE(DOMi)@en[XMLHttpRequest]] [RUBYB[起源]@en[origin]]]]は[[スクリプト]]の[[起源]]です [SRC[>>229]]。
[235] [[匿名フラグ]]が立っている場合は、[[大域的に固有な識別子]]です。 [SRC[>>232]]
[236] [CODE(DOMi)@en[[[XMLHttpRequest]]]] [[起源]]は、 [[XHR]] で[[要求]]する[[資源]]が[[同じ起源]]かどうかの判定に使われます。また、
[CODE(DOMa)@en[[[responseXML]]]] の [CODE(DOMi)@en[[[Document]]]] の[[起源]]としても使われます
([[文書の起源]]参照)。
** スタイルシートの起源
[FIG(list)[
- [273] [CODE(CSS)@en[[[@import]]]] で参照されている[[スタイルシート]] [SRC[>>272]]
-- [[輸入]]元の[[スタイルシート]]の[[起源]]と同じ
]FIG]
* 分類
[41] [[起源]]は、その性質により次のように分類されることがあります。
[FIG(short list)[
- [[HSTS安全起源]]
- [[条件付きHSTS安全起源]]
]FIG]
* 起源と適用範囲が異なる機能
[10] [[Web]] 上のいくつかの機能は、歴史的その他の理由で[[起源]]とは異なる適用範囲を持っています。
場合によっては[[セキュリティー]]上の問題となることがありますから、
注意が必要です。
[FIG(list)[
- [43] [[Cookie]] は[[サブドメイン]]にも適用されますし、[[ポート]]を無視します。
[[URL scheme]] の違いも無視されることがあります。
また [CODE(HTTP)@en[[[Path]]]] により一部の [[path]] のみに限定されます。
- [44] [[HTTP認証]]の範囲である[[保護空間]]は[[起源]]と同じ単位が基本となっていますが、
[CODE(HTTP)@en[[[realm]]]] によって限定されます。また[[認証方式]]によっては[[ホスト]]をまたぐことも禁止はされていません。
[CODE(HTTP)@en[[[domain=""]]]] [[引数]]で[[起源]]とは無関係に[[保護空間]]を規定することができます。
- [[HSTS]]・[[PKP]] はすべての[[ポート]]に適用されます。
- [[HSTS]]・[[PKP]] は [CODE(HTTP)@en[[[includeSubdomains]]]] を指定すると[[サブドメイン]]にも適用されるようになります。
- [[HTTPS]] の[[証明書]]は[[ドメイン名]]のみ示すもので、 [[URL scheme]] や[[ポート]]の情報は含まれません。
- [[HTTPS]] の[[ワイルドカード証明書]]は直下の[[サブドメイン]]に適用されます。
- [[Web Storage]] の[[容量]]制限の適用においては、[[サブドメイン]]を使って制限を回避する試みを防ぐことが求められています ([[ストレージ (Web)]] 参照)。
- [CODE(JS)@en[[[document.domain]]]] を使うと元の[[サブドメイン]]と[[ポート]]の区別が失われます。
- [[WebSocket接続の確立]]時の同時接続制限は、[[ホスト]]ではなく[[IPアドレス]]により行われます。
- [[HTTP/2接続]]を再利用できる範囲は、[[起源]]よりも広くなっています。
]FIG]
* 歴史
[227] [[起源]] (や [[SOP]]) の概念は [[Netscape]] による [[JavaScript]] の開発以来、
次第に明確になってきましたが、長らく仕様として文書化されるには至りませんでした。
しかし2000年代の後半になり、ようやく [[RFC 6454]] と [[HTML]] によってその仕様が正確に記述されることとなりました。
[REFS[
- [23] '''[CITE@en[RFC 6454 - The Web Origin Concept]] ([TIME[2011-12-12 09:13:37 +09:00]] 版) <http://tools.ietf.org/html/rfc6454>'''
- [224] [CITE[IRC logs: freenode / #whatwg / 20120524]]
( ([TIME[2012-06-02 23:29:34 +09:00]] 版))
<http://krijnhoetmer.nl/irc-logs/whatwg/20120524>
- [225] [CITE@en[Web Applications 1.0 r7141 Recast how origins are defined to explicitly use the concept of an origin 'alias' and fix the definitions for about:blank docs to use this new definition.]]
( ([TIME[2012-06-23 07:37:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=7140&to=7141>
- [244] [CITE@en[Web Applications 1.0 r7180 Make data: URLs officially work in Workers.]] ([TIME[2012-07-18 06:53:00 +09:00]] 版) <http://html5.org/tools/web-apps-tracker?from=7179&to=7180>
]REFS]
** RFC 6454 における同一起源の定義
[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]] は毎回新しい大域的に固有な識別子が割り振られるため、違う[[起源]]になります。
** RFC 6454 における URI の起源の定義
[26] ある [[RFC 3986]] [[URI]] の[[起源]]は次の手順により求められます [SRC[>>23 4.]]。
[FIG(steps)[
= [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項組]]を返します。
]FIG]
;; [36] 仕様上明記されていませんが、 >>32 や >>34 で [[host]] や [[port]] を[[正準化]]する必要がありそうです。
;; [121] 仕様上厳密には [[RFC 3986]] [[URI]] に対して[[起源]]が定義されており、
[[URI]] でない [[URL]] ([[IDN]] を使ったものなど) はまず [[URI]] に変換 (できれば) する必要があります。
[[URI]] に変換できない [[URL]] については[[起源]]が定義されていないことになります。
もちろん現実の [[Webブラウザー]]においては、定義を自然に拡張した [[URL]]
一般について同様に[[起源]]が定義されることになります。
;; [163] 以前は [[HTML]] の仕様書で [[URL]] に対して[[起源]]が定義されていましたが、
[[RFC]] に委ねるとして削除されてしまいました。
** 追加のデータ
[143] [[RFC 6454]] では[[3項組]]だけでしたが、 [[HTML]] によれば更に場合によっては[RUBYB[追加のデータ]@en[extra data / additional data]]を加えることができます。
[145] 追加のデータとしては、[[暗号化]]された[[接続]]を使っている時に[[サイト]]の[RUBYB[[[証明書]]]@en[certificate]]を用いることが想定されています。
途中で[[証明書]]が変化した時に、[[証明書]]も[[起源]]に含めることで、前後で別の[[起源]]として扱われるようになります。
[SRC[>>135]]
;; [146] 従って[[中間者攻撃]] ([[MITM]]) に対する防御となります。
[15] 実際にこの規定に従っている [[Webブラウザー]]が存在するのかは不明です。
[149] この規定は >>147 で追加されたもので、当時は [[URL]] の[[起源]]に関する規定において[[証明書]]を[[起源]]に含めても構わない状況が明記されていましたが、
>>148 で当該部分が [[RFC]] に委ねるとして削除され、しかし [[RFC]]
には相当する規定が含まれなかったため、宙に浮いてしまっています。
([[RFC]] にかわる [[URL Standard]] の定義にも、[[証明書]]は用いられていません。)
[14] [[証明書]]を期限切れに伴い更新したり、[[鯖]]を構成する[[ホスト]]ごとに異なる[[公開鍵]]を提供していたり [SRC[>>13]]
する場合に[[起源]]が変わってしまって以前に保存したデータにアクセスできなくなったり、
[[フレーム]]間で通信できなかったりすると不便であり、再現しづらい互換性の問題が生じますから、
これを[[起源]]の構成要素に加えるのはあまり好ましくないのかもしれません。
;; [22] [[PKP]] の[[ピン]]と結び付けることで[[証明書]]を超えて同一性を保てるかもしれません。
しかしそのような実装の動きも無さそうです。
[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]] 版) <http://html5.org/tools/web-apps-tracker?from=1838&to=1839>
- [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]] 版) <http://html5.org/tools/web-apps-tracker?from=6727&to=6728>
- [13] [CITE@en[689835 – Dns rebinding attack using cached resources]] ([TIME[2015-03-21 15:34:02 +09:00]] 版) <https://bugzilla.mozilla.org/show_bug.cgi?id=689835#c13>
]REFS]
[72] この規定は2016年3月の改訂で削除されました [SRC[>>77]]。
** RFC 6454 の廃止
[209] [CITE@en-US[Cross-Origin Resource Sharing]]
( ([TIME[2012-03-03 06:35:44 +09:00]] 版))
<http://dvcs.w3.org/hg/cors/raw-file/tip/Overview.html#origin-request-header>
[240] [CITE@en[Errata for The Web Origin Concept]]
( ([[Anne van Kesteren]] 著, [TIME[2012-06-08 16:31:21 +09:00]] 版))
<http://lists.w3.org/Archives/Public/www-archive/2012Jun/0001.html>
[241] [CITE[IRC logs: freenode / #whatwg / 20120619]]
( ([TIME[2012-07-04 21:30:06 +09:00]] 版))
<http://krijnhoetmer.nl/irc-logs/whatwg/20120619#l-978>
[245] [CITE[IRC logs: freenode / #whatwg / 20120718]]
( ([TIME[2012-07-21 12:31:45 +09:00]] 版))
<http://krijnhoetmer.nl/irc-logs/whatwg/20120718#l-432>
[246] [CITE@en[Web Applications 1.0 r7236 Recast how the origin handling is done for data: URLs in workers, and fix the shared worker origin handling for data: URLs so that you can actually reconnect to a data: shared worker.]]
( ([TIME[2012-08-10 03:29:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=7235&to=7236>
[247] [CITE@en[Web Applications 1.0 r7414 Require Cookies and Origin if you implement HTTP.]]
( ([TIME[2012-09-27 07:52:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=7413&to=7414>
[250] [CITE[''''''[''''''whatwg'''''']'''''' Need to define same-origin policy for WebIDL operations/getters/setters]]
( ([TIME[2012-12-16 03:43:41 +09:00]] 版))
<http://lists.whatwg.org/pipermail/whatwg-whatwg.org/2012-December/038358.html>
[251] [CITE[Define Document's origin. In related news: we now have an HTML dependenc... · 922830c · whatwg/dom]]
( ([TIME[2012-12-21 13:24:34 +09:00]] 版))
<https://github.com/whatwg/dom/commit/922830c931d8b04d52e3482dfd9985cdcead43fe>
[252] [CITE[Define what origin and effective script origin are in various Document c... · 2f2cdf4 · whatwg/dom]]
( ([TIME[2012-12-21 13:27:21 +09:00]] 版))
<https://github.com/whatwg/dom/commit/2f2cdf4a29b7ed299c38f60eb35ed98918a7f439>
[258] [CITE@en-US[Cross-Origin Resource Sharing Standard]]
( ([TIME[2012-11-10 10:50:00 +09:00]] 版))
<http://fetch.spec.whatwg.org/>
[259] [CITE[IRC logs: freenode / #whatwg / 20130401]]
( ([TIME[2013-04-04 20:18:43 +09:00]] 版))
<http://krijnhoetmer.nl/irc-logs/whatwg/20130401#l-615>
[260] [CITE[IRC logs: freenode / #whatwg / 20130416]]
( ([TIME[2013-04-20 15:41:12 +09:00]] 版))
<http://krijnhoetmer.nl/irc-logs/whatwg/20130416#l-72>
[261] <https://github.com/whatwg/fetch/commit/05a8acd40d6f65c1a6dc830896cd8366a99d267d>
[262] [CITE[IRC logs: freenode / #whatwg / 20130418]]
( ([TIME[2013-04-25 21:57:07 +09:00]] 版))
<http://krijnhoetmer.nl/irc-logs/whatwg/20130418#l-839>
[263] [CITE[IRC logs: freenode / #whatwg / 20130508]]
( ([TIME[2013-05-16 21:30:10 +09:00]] 版))
<http://krijnhoetmer.nl/irc-logs/whatwg/20130508#l-108>
[264] [CITE[''''''[''''''websec'''''']'''''' RFC6454 (Origin) vs URI schemes unlike "http"]]
( ([TIME[2013-03-07 01:20:13 +09:00]] 版))
<http://www.ietf.org/mail-archive/web/websec/current/msg01512.html>
[265] [CITE@en-US[Fetch Standard]]
( ([TIME[2013-05-22 07:29:17 +09:00]] 版))
<http://fetch.spec.whatwg.org/#http-origin-header>
[266] [CITE[''''''[''''''whatwg'''''']'''''' Reorganizing and fixing "origin"]]
( ([TIME[2013-05-22 07:53:17 +09:00]] 版))
<http://lists.whatwg.org/pipermail/whatwg-whatwg.org/2013-May/039599.html>
[267] [CITE[''''''[''''''whatwg'''''']'''''' Reorganizing and fixing "origin"]]
( ([TIME[2013-05-22 07:53:17 +09:00]] 版))
<http://lists.whatwg.org/pipermail/whatwg-whatwg.org/2013-May/039599.html>
[268] [CITE@en[Web Applications 1.0 r7873 Allow data: URLs to be given download='' attribute names.]]
( ([TIME[2013-05-31 07:05:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=7872&to=7873>
[270] [CITE[''''''[''''''whatwg'''''']'''''' Reorganizing and fixing "origin"]]
( ([TIME[2013-07-13 09:28:35 +09:00]] 版))
<http://lists.whatwg.org/pipermail/whatwg-whatwg.org/2013-July/040050.html>
[271] [CITE[''''''[''''''whatwg'''''']'''''' Fetch: Origin header]]
( ([TIME[2013-07-23 21:15:30 +09:00]] 版))
<http://lists.whatwg.org/pipermail/whatwg-whatwg.org/2013-July/040196.html>
[274] [CITE@en[Bug 20701 – Location security restrictions are over-restrictive]]
( ([TIME[2013-08-19 07:16:36 +09:00]] 版))
<https://www.w3.org/Bugs/Public/show_bug.cgi?id=20701>
[276] [CITE@en[Web Applications 1.0 r8307 Fix the rules on what 'Origin' header to use when navigating to a resource in an <iframe>, <object>, <embed>, or <frame> element, so that the latter two are not forgotten.]]
( ([TIME[2013-11-23 03:48:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=8306&to=8307>
[277] [CITE@en[Bug 23005 – IDNA-related bits should instead reference terminology from http://url.spec.whatwg.org/]]
( ([TIME[2013-11-23 11:21:51 +09:00]] 版))
<https://www.w3.org/Bugs/Public/show_bug.cgi?id=23005>
[278] [CITE@en[Web Applications 1.0 r8320 Clarify what it means for an image to have an origin]]
( ([TIME[2013-12-03 05:27:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=8319&to=8320>
[279] [CITE@ja[Using Self-Hosted Objects - Facebook開発者]]
( ([TIME[2013-12-11 02:55:56 +09:00]] 版))
<https://developers.facebook.com/docs/opengraph/using-objects/>
[280] [CITE[Flashと特定ブラウザの組み合わせでcross originでカスタムヘッダ付与が出来てしまう問題が未だに直っていない話]]
( ([TIME[2014-02-19 08:05:01 +09:00]] 版))
<https://gist.github.com/mala/8857629>
[281] [CITE@en[446344 – Implement Origin header CSRF mitigation]]
( ([TIME[2014-02-19 08:21:51 +09:00]] 版))
<https://bugzilla.mozilla.org/show_bug.cgi?id=446344>
[282] [CITE@en[Web Applications 1.0 r8262 Move the spec from a stack of incumbent scripts to a stack of script settings object. This should in theory have no concrete effects (though I may have changed some of the origin used for Web Workers started from document.domain-affected scripts that were called from other scripts with different original origins).]]
( ([TIME[2013-11-09 08:21:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=8261&to=8262>
[290] [CITE[IRC logs: freenode / #whatwg / 20140426]]
( ([TIME[2014-04-28 14:06:27 +09:00]] 版))
<http://krijnhoetmer.nl/irc-logs/whatwg/20140426>
[291] [CITE@en[Bug 26152 – Would it not be better to define origin as identifier, tuple, or, alias? That alias is actually a link to another origin is not super clear this way.]]
( ([TIME[2014-06-26 01:45:08 +09:00]] 版))
<https://www.w3.org/Bugs/Public/show_bug.cgi?id=26152>
[294] 2014年には [[URL]] の[[起源]]が [[URL Standard]] で定義されるようになり [SRC[>>307]]、
実質的に [[URL Standard]]、[[Fetch Standard]]、[[HTML Standard]]
によって [[RFC 6454]] は廃止されました [SRC[>>308, >>309, >>7]]。
[REFS[
- [307] [CITE[Define URL's origin · c65766a · whatwg/url]] ([TIME[2014-07-01 04:34:21 +09:00]] 版) <https://github.com/whatwg/url/commit/c65766a674c6f4c3c521b6dc843f07c1fd23b4d2>
- [308] [CITE[Fix origin xref mess; obsolete ORIGIN · d94f125 · whatwg/fetch]] ([TIME[2014-07-01 04:49:04 +09:00]] 版) <https://github.com/whatwg/fetch/commit/d94f125e97592c078e023d5490b65b4210ebe8dc>
- [309] [CITE@en[ORIGIN is no more · d354f76 · whatwg/dom]]
( ([TIME[2014-08-07 05:26:04 +09:00]] 版))
<https://github.com/whatwg/dom/commit/d354f769a18fd567c9c3d763116048ab6c2d383e>
- [1] [CITE@en[Opaque identifier is a type, not a value https://www.w3.org/Bugs/Public/... · 09d81f5 · whatwg/url]] ([TIME[2014-09-09 03:50:52 +09:00]] 版) <https://github.com/whatwg/url/commit/09d81f55e4a788980101fe7f88b1e3c6c8fe7435>
- [7] [CITE@en[Web Applications 1.0 r8787 Move the reference for URL origin from Web Origin to URL.]] ([TIME[2014-09-19 05:37:00 +09:00]] 版) <https://html5.org/r/8787>
]REFS]
[311] [CITE@en[draft-nir-websec-extended-origin-02 - A More Granular Web Origin Concept]]
( ([TIME[2014-10-17 05:58:23 +09:00]] 版))
<http://tools.ietf.org/html/draft-nir-websec-extended-origin-02>
[42] [CITE@en[origin on HTMLHyperlinkElementUtils/Location is readonly · whatwg/html@2c97ff8]]
([TIME[2015-11-24 12:20:18 +09:00]] 版)
<https://github.com/whatwg/html/commit/2c97ff8e46a86911f621ee4303d0fc18ddcb9b2b>
[45] [CITE@en[Add ids to origin's types · whatwg/html@b870180]]
([TIME[2016-02-05 14:43:51 +09:00]] 版)
<https://github.com/whatwg/html/commit/b8701806808e6fc393a92207717a8bce72a91d1d>
[46] [CITE@en[Remove the origin aliasing concept · whatwg/html@438155d]]
([TIME[2016-03-23 23:26:08 +09:00]] 版)
<https://github.com/whatwg/html/commit/438155d2a2255aa5ea84ae390744d8a8662ebec2>
[51] [CITE@en[Cleanup origin serialization · whatwg/html@5dcc1ee]]
([TIME[2016-03-24 17:14:01 +09:00]] 版)
<https://github.com/whatwg/html/commit/5dcc1ee2124b5e54955845790bb47f5d1351d672>
[77] [CITE@en[Merge effective script origin into origin · whatwg/html@8a843f2]]
([TIME[2016-03-31 15:35:25 +09:00]] 版)
<https://github.com/whatwg/html/commit/8a843f2169a6864a3024c4329528dccb2051d275>