[1] [[URL]] は[DFN[[RUBYB[[[起源]]]@en[origin]]]]を持ちます。多くの場合、 [[URL]] の[[起源]]は
[[URL scheme]] と [[authority]] から決まります。

;; [2] [[起源]]一般については、[[起源]]の項を参照。

[8] [[URL]] の[[起源]]は、[[文書]]の[[起源]]などの定義に使われる、
[[起源]]の基礎となるものです。

* 仕様書

[REFS[
- [300] '''[CITE@en-US[URL Standard]] ([TIME[2014-06-27 13:17:26 +09:00]] 版) <http://url.spec.whatwg.org/#origin>'''
- [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>
]REFS]

* 定義

[301] [[URL]] [VAR[URL]] の[[起源]]は、次の手順が返す値です [SRC[>>300]]。

[FIG(steps)[
= [21] [VAR[URL]] の [F[scheme][URL scheme]] により、
[FIG(switch)[
: [CODE(URI)@en[http]], [CODE(URI)@en[https]], [CODE(URI)@en[ftp]], [CODE(URI)@en[ws]], [CODE(URI)@en[wss]] のいずれかの場合 :
[[項組起源]]を返します。
[FIG(list members)[
[FIGCAPTION[
[[項組起源]]
]FIGCAPTION]
: [F[scheme][URL scheme]] : [VAR[URL]] の [F[scheme][URL scheme]]
: [F[ホスト]] : [VAR[URL]] の[F[ホスト]]
: [F[ポート]] : [VAR[URL]] の[F[ポート]]
]FIG]
[HISTORY[
[43] 
かつては
[CODE(URI)@en[gopher]]
も該当していましたが、
[TIME[令和元(2019)年][year:2019]]の改訂で変更されました。
]HISTORY]
: [CODE(URI)@en[blob]] の場合 :
[FIG(steps)[
= [36] 
[VAR[URL]]
の 
[F[blob URL entry]]
が [CODE[null]]
で''ない''場合、
== [37] 
[VAR[URL]]
の
[F[blob URL entry]]
の[F[環境]]の[F[起源]]を返します。
= [38] それ以外の場合、
== [22] [VAR[URL2]] を、[VAR[URL]] の[F[path][URL path]] [ [N[0]] ]
に[[基本URL構文解析器]]を適用した結果に設定します。
== [24] [VAR[URL2]] が[[失敗]]の場合、
=== [25] [[不透明起源]]を返します。
== [26] それ以外の場合、
=== [27] [VAR[URL2]] の[F[起源][URLの起源]]を返します。
]FIG]
: [CODE(URI)@en[file]] の場合 :
[[実装依存]]の値を返します (>>31)。決めかねる時は[[不透明起源]]を返します。
: [[実装依存]]の [[scheme][URL scheme]] の場合 :
[[実装依存]]の方法で決めた値を返します (>>29)。
: それ以外の場合 :
[[不透明起源]]を返します。
]FIG]
]FIG]

;; [306] ここでいう [F[scheme][URL scheme]]、[F[ホスト]]、[F[ポート]]は
[[URLの構文解析]]で得られる値なので、[[正準化]]が済んだ値です。
[F[scheme][URL scheme]] や[F[ホスト]]は[[小文字]]化されています。

[EG[
[15] [CODE(URI)@en[https://www.example.com/path]] の[[起源][URLの起源]]は、
[[項組起源]] ([CODE[https]], [CODE[www.example.com]], [[null]]) です。
]EG]

[EG[
[16] [CODE(URI)@en[blob:https://www.example.com:8080/abcde]] の[[起源][URLの起源]]は、
[[項組起源]] ([CODE[https]], [CODE[www.example.com]], [N[8080]]) です。
]EG]

[EG[
[28] [CODE(URI)@en[about:blank]] の[[起源][URLの起源]]は、
新しい[[不透明起源]]です。
]EG]

[HISTORY[
[162] [[URL]] の[[実効スクリプト起源]]は[[起源]]と同じです [SRC[>>135]]。

;; [242] 別名ではありません。
]HISTORY]

;; [5] [[文書の[F[起源]]]]と[[文書の[F[URL]]]]の[F[起源]]は必ずしも一致しません。

[EG[
[9] 例えば [CODE(URI)@en[http://foo.example/hoge/fuga]] の[[起源]]は、
[CODE(URI)[http://foo.example]] (= ([CODE[http]], [CODE[foo.example]], [CODE[80]]))
です。
]EG]

[EG[
[11] 例えば [CODE(URI)@en[about:blank]] の[[起源]]は、新しい大域的に固有な識別子です。
]EG]

;; [17] 大域的に固有な識別子は、 [[URL]] ごとに新しいものが発行されます。
文字列として同じ [[URL]] であっても、[[URLの起源]]を取得する毎に異なる起源になります。

* [CODE(URI)@en[file:]] URL の起源

[31] 仕様上 [CODE(URI)@en[[[file:]]]] [[URL]] の[[起源]]は[[実装]]定義となっています。
古い[[利用者エージェント]]は [CODE(URI)@en[[[file:]]]] [[URL]] に対して緩い制限しかかけていませんでしたが、
[[セキュリティー]]上の問題から最近の[[利用者エージェント]]では細かい単位で[[起源]]を設定していたりします。
例えば、[[ディレクトリー]]単位でアクセスを制限したり、[[ファイル]]ごとに完全に別の[[起源]]として扱ったりしています
[SRC[>>23 4.]]。

;; [CODE(URI)@en[file:]] 参照。

* Web ブラウザー依存の URL scheme の起源

[29] [[URL Standard]] には明記されていませんが、実際には、
各[[Webブラウザー]]固有の [[URL scheme]] 
では[[実装依存]]の方法で決定された[[起源][URLの起源]]が用いられることがあります。

[12] [[Chrome]] は、 
[CODE(URI)@en[chrome://version/]] では
[CODE(HTTP)@en[[[Origin:]] chrome://version]] といったように、
[CODE(URI)@en[[[chrome:]]]] [[URL]] でも [[URL scheme]] と [[authority]]
で[[起源]]を構成しているようです。 [TIME[2015-07-07T15:23:29.800Z]]

[32] [[Chrome]] は、 [CODE(URI)@en[chrome://settings/]] や
[CODE(URI)@en[chrome://extensions/]] や [CODE(URI)@en[chrome://chrome/]] では、
[CODE(URI)@en[chrome://chrome]] を[[起源]]としているようです。
[TIME[2016-05-05T05:43:57.500Z]]

[33] [[Chrome]] は、 [CODE(URI)[chrome-devtools://devtools/bundled/inspector.html?[INS[...]]]]
のような [[URL]] のページで、 [CODE(JS)@en[document.origin]] として
[CODE[chrome-devtools://devtools]] を返します。 [TIME[2016-06-23T05:44:38.000Z]]

[13] [[Firefox]] は、 [CODE(URI)@en[[[about:mozilla]]]]
から[[要求]]を送信させると [CODE(HTTP)@en[[[Origin:]] [[null]]]]
を送ります。 [TIME[2015-07-07T15:25:37.900Z]]

[14] [[Firefox]] は、 [CODE(URI)@en[[[chrome:]]]] [[URL]] では
[CODE(HTTP)@en[[[Origin:]] chrome://global]] のように [[URL scheme]]
と [[authority]] で[[起源]]を構成するようです。 [TIME[2015-07-07T15:27:29.00Z]]

[34] [[Chrome]] は [CODE(URI)@en[view-source:]] [[URL]]
の [CODE(DOMi)@en[URL]] の [CODE(DOMa)@en[origin]] を [CODE(URI)@en[view-source://]]
とします。 [CODE(URI)@en[view-source:]] [[URL]] に [[navigate]] したとき
[CODE(JS)@en[location.href]] は [CODE(URI)@en[view-source:]] を削った [[URL]]
となり、 [CODE(URI)@en[location.origin]] はその[[URLの起源]]となり、
[CODE(JS)@en[document.origin]] や [[fetch]] の [CODE(HTTP)@en[Origin:]]
は [CODE[null]] となります。 [TIME[2016-06-26T09:25:00.500Z]]

[7] [[HbbTV 2.0]] は次のように規定しています。
[FIG(quote)[
[FIGCAPTION[
[6] ([TIME[2015-02-10 01:01:20 +09:00]] 版) <http://www.hbbtv.org/pages/about_hbbtv/HbbTV_specification_2_0.pdf#page=44>
]FIGCAPTION]
> For resources loaded via DSM-CC object carousel, the origin shall be the DVB URI in the form (as defined in
TS 102 851 [10] clause 6.3.1):
> "dvb" ":" "//" original_network_id "." transport_stream_id "." service_id "." component_tag
]FIG]

[46] 
[[VSCode]]
は
[CODE[vscode-webview://]] [[URL]]
を使います。

* 歴史

[3] [[URLの起源]]ははじめ [[HTML5]] (現在の [[HTML Standard]]) で規定されましたが、
後に [[RFC 6454]] に移動しました。その後更に [[URL Standard]] へと移動しました。

[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>
]REFS]

;; [4] 詳しくは[[起源]]の項を参照してください。

[18] [CITE@en[Clarify that "new globally unique identifier" is intentional. Fixes #56. · whatwg/url@330e090]]
([TIME[2015-08-07 11:18:45 +09:00]] 版)
<https://github.com/whatwg/url/commit/330e090c53e9bebc9752757cd237a0bd71877e03>

[19] [CITE@en[Merge effective script origin into origin · whatwg/html@8a843f2]]
([TIME[2016-03-31 16:19:51 +09:00]] 版)
<https://github.com/whatwg/html/commit/8a843f2169a6864a3024c4329528dccb2051d275>

[20] [CITE@en[Align with origin changes in HTML · whatwg/url@b0e4def]]
([TIME[2016-04-06 16:48:56 +09:00]] 版)
<https://github.com/whatwg/url/commit/b0e4def5b62e0be2d75b4b7b5720a5e0ea879596>

[FIG(quote)[
[FIGCAPTION[
[30] [CITE@en[What is the 'Origin' (in Same-Origin-Policy sense) of a Google Chrome extension? - Quora]]
([TIME[2016-04-06 17:07:14 +09:00]] 版)
<https://www.quora.com/What-is-the-Origin-in-Same-Origin-Policy-sense-of-a-Google-Chrome-extension>
]FIGCAPTION]

> If you're writing JavaScript for Chrome extension, the origin is the directory structure inside the zipped up file of the extension itself.

]FIG]

[35] [CITE@en[Use File API to resolve blob: URLs and their origins]]
([[mkruisselbrink]]著, [TIME[2019-01-14 23:24:01 +09:00]])
<https://github.com/whatwg/url/commit/d2ef633869b3f31d8c7e3bb76602400e4d2c126c>

[39] [CITE@en[Origin of blob URLs doesn't match what implementations do · Issue #127 · whatwg/url]]
([TIME[2019-06-20 10:35:13 +09:00]])
<https://github.com/whatwg/url/issues/127>

[40] [CITE@en[Fix Blob Origin · Issue #20 · w3c/FileAPI]]
([TIME[2019-06-20 10:41:04 +09:00]])
<https://github.com/w3c/FileAPI/issues/20>

[41] [CITE@en["origin of a blob URL" is redundant/confusing · Issue #63 · w3c/FileAPI]]
([TIME[2019-06-20 10:41:27 +09:00]])
<https://github.com/w3c/FileAPI/issues/63>

[42] [CITE@en[Use definitions in FileAPI spec to resolve blob URLs and their origins. by mkruisselbrink · Pull Request #371 · whatwg/url]]
([TIME[2019-06-20 10:42:36 +09:00]])
<https://github.com/whatwg/url/pull/371>

[44] [CITE@en[Remove gopher case from origin algorithm]]
([[rmisev]]著, [TIME[2019-10-21 22:02:15 +09:00]])
<https://github.com/whatwg/url/commit/7ae1c691c96f0d82fafa24c33aa1e8df9ffbf2bc>

[45] [CITE@en[Remove gopher from list of special schemes by achristensen07 · Pull Request #453 · whatwg/url]]
([TIME[2020-05-14 12:45:02 +09:00]])
<https://github.com/whatwg/url/pull/453>