[11] [DFN[[[credentials]]]] は、[[HTTP認証]]における[[認証]]のための[[利用者名]]や[[パスワード]]などの情報を記述したものです。
[CODE(HTTP)@en[[[Authorization:]]]] [[ヘッダー]]などで使われます。

* 仕様書

[REFS[
- [20] '''[CITE@en[RFC 7235 - Hypertext Transfer Protocol (HTTP/1.1): Authentication]] ([TIME[2014-09-11 10:01:28 +09:00]] 版) <https://tools.ietf.org/html/rfc7235#section-2.1>'''
- [13] [CITE@en[RFC 7231 - Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content]] ([TIME[2014-06-07 01:55:45 +09:00]] 版) <https://tools.ietf.org/html/rfc7231#section-5.4>
- [12] [CITE@en[RFC 7235 - Hypertext Transfer Protocol (HTTP/1.1): Authentication]] ([TIME[2014-09-11 10:01:28 +09:00]] 版) <https://tools.ietf.org/html/rfc7235#section-5.1.2>
- [25] [CITE@en[RFC 7235 - Hypertext Transfer Protocol (HTTP/1.1): Authentication]] ([TIME[2014-09-11 10:01:28 +09:00]] 版) <https://tools.ietf.org/html/rfc7235#section-6.2>
- [32] [CITE@en[RFC 7235 - Hypertext Transfer Protocol (HTTP/1.1): Authentication]] ([TIME[2014-09-11 10:01:28 +09:00]] 版) <https://tools.ietf.org/html/rfc7235#section-6.3>
- [42] [CITE@en[RFC 7617 - The 'Basic' HTTP Authentication Scheme]] ([TIME[2015-10-01 09:47:40 +09:00]] 版) <https://tools.ietf.org/html/rfc7617#section-2.2>
]REFS]

* 構文

[21] [CODE(HTTP)@en[[[credentials]]]] は、 [CODE(ABNF)@en[[[auth-scheme]]]]
のみか、その後に [CODE(ABNF)@en[[[auth-param]]]] の[[リスト]] ([CODE(HTTP)[#]])
または [CODE(ABNF)@en[[[token68]]]] を続けたものです。

[22] [CODE(ABNF)@en[[[auth-scheme]]]] の後に続く場合には
[CODE(ABNF)@en[[[auth-scheme]]]] の後に1文字以上の [CODE(charname)@en[[[SP]]]]
が必要です。

[FIG(railroad)[
= [CODE(ABNF)@en[[[auth-scheme]]]]
= ?
== +
=== [CODE(charname)@en[[[SP]]]]
== |
=== [CODE(ABNF)@en[[[auth-param]]]] の[[リスト]]
=== [CODE(ABNF)@en[[[token68]]]]
]FIG]

;; [2] [[RFC 1945]] や [[RFC 2068]] では、原則として [CODE(ABNF)@en[[[auth-param]]]]
の[[リスト]] ([CODE(HTTP)[#]]) ながらも、[[基本認証]]だけ特別な構文とされていました。
[[RFC 2617]] ではなぜか[[基本認証]]の場合が示されていませんでした。
[[RFC 7235]] で[[基本認証]]の場合が [CODE(ABNF)@en[[[token68]]]]
に置き換えられました。

;; [3] [[RFC 2617]] までは区切りの [CODE(ABNF)@en[[[SP]]]] が省略されていて、
[CODE(ABNF)@en[[[LWS]]]] が暗示的に挟まるとも明記されていませんでした。

[4] [CODE(ABNF)@en[[[auth-param]]]] や [CODE(ABNF)@en[[[token68]]]]
の部分は [CODE(ABNF)@en[[[auth-scheme]]]] によって異なる構文となります。
どの [CODE(ABNF)@en[[[auth-scheme]]]] でも共通して必須である[[引数]]はありません。

;; [23] 詳しくは [CODE(ABNF)@en[[[auth-scheme]]]] と各[[認証方式]]の項を参照。

[24] [CODE(ABNF)@en[[[token68]]]] は既存の[[認証方式]]の構文との互換性のためのもので、
新しい[[認証方式]]は使う[RUBYB[べきではありません]@en[ought to]] [SRC[>>22]]。

;; [37] とされてはいるものの、 [CODE(HTTP)@en[[[Basic]]]] や [CODE(HTTP)@en[[[Bearer]]]]
など [CODE(ABNF)@en[[[token68]]]] 形式はよく使われています。

* authorization credentials

[14] 次の[[ヘッダー]]は、 [DFN[[[authorization credentials]]]] に分類されています [SRC[>>13]]。
[FIG(list short)[
- [CODE(HTTP)@en[[[Authorization:]]]]
- [CODE(HTTP)@en[[[Proxy-Authorization:]]]]
]FIG]

[15] [CODE(HTTP)@en[[[X-WSSE:]]]] もこの分類に含めるのが適当かもしれません。

[16] これに属する[[ヘッダー]]は、 [CODE(HTTP)@en[[[TRACE]]]]
に対する[[応答]]に含めるべきではないでしょう。

* 文脈

[7] [[credentials]] は [CODE(HTTP)@en[[[Authorization:]]]] [[ヘッダー]]や
[CODE(HTTP)@en[[[Proxy-Authorization:]]]] [[ヘッダー]]の値として使われます。

* 適用範囲と再利用

[5] [[利用者エージェント]]がある [[credentials]] を自動的に適用できる範囲は、
[[ホスト]]と [CODE(HTTP)@en[[[realm]]]] による保護空間により決まります。
当該 [[creadentials]] 付きの[[要求]]が一旦[[認証]]されれば、
それを同じ空間の別の[[要求]]に対しても、 [[auth-scheme]]、 [[auth-param]]、
あるいは[[利用者]]の設定によって決まる期間、再利用して構いません。 [SRC[>>1, >>8]]

[6] [[auth-scheme]] によって特に決められていない限り、
保護空間を[[鯖]]を超えて延長することはできません。 [SRC[>>1, >>8]]

[26] [[利用者エージェント]]による [[credentials]] の保存の期間を満了させたり、
破棄させたりする方法は [[HTTP]] としては規定されていませんが、
[[認証方式]]によってはそのような仕組みを規定することもできます。 [SRC[>>25]]

[27] [[利用者エージェント]]は保存されている[[利用者]]が [[credentials]]
を破棄できる仕組みを提供することを[RUBYB[推奨]@en[encourage]]されています [SRC[>>25]]。

[EG[
[28] 最近の [[Webブラウザー]]には[[パスワードマネージャー]]のような機能があり、
サイトごとの[[パスワード]]を個別に削除できます。

[29] また、一括またはサイトごとの[[パスワード]]を消去する機能を用意している
[[Webブラウザー]]や、終了時に消去する[[シークレットウィンドウ]]のような機能を用意している
[[Webブラウザー]]もあります。
]EG]

[30] 現在の [[Webブラウザー]]の一般的な実装では、ある[[保護空間]]に対する
[[Webブラウザー]]の[[セッション]]の初回 [CODE(HTTP)[[[401]]]] [[応答]]では保存されている[[パスワード]]を補完した入力[[ダイアログボックス]]を表示し、
以後のアクセスでは予め [[credentials]] を指定した[[要求]]を送信するようになっています。

[31] 自動的な [[credentials]] の送信をやめるよう[[著者]]が[[鯖]]側から指示する
「[[ログアウト]]」機能が度々提案されていますが、そのような機能が必要な場合は
[[Cookie認証]]が用いられることが多く、特に必要性は高く無いとして
[[Webブラウザー]]開発者等の関心は高くないのが実情のようです。

[33] この [[Webブラウザー]]の自動的な [[credentials]] のため、
一つの[[ホスト]]を複数の[[著者]]が共有しているような場合に、
他の[[著者]]の[[資源]]に対する[[パスワード]]を受信することが可能となってしまいます。
[CODE(HTTP)@en[[[realm]]]] を指定しても対策にはなりません [SRC[>>32]]。

;; [34] これは [[Webブラウザー]]の問題とは考えられていません。
これが問題となるような場合、[[鯖]]側の管理者は[[著者]]に[[HTTP認証]]の機能を提供するべきではありません。

[38] [[基本認証]]においては、
[[要求]]の[[対象URL]]から [CODE[[[path]]]] 部分の最後の [CODE[[[/]]]]
の後の[[文字]]をすべて削除したものが、当該[[要求]]の[RUBYB[認証範囲]@en[authentication scope]]となります。
[[クライアント]]は、認証範囲と[[接頭辞一致]]する [[URL]]
によって表される[[資源]]は、当該[[要求]]の [CODE[[[realm]]]]
で表されるのと同じ[[保護空間]]内にあるものと仮定する[['''べきです''']]。 [SRC[>>42]]

[43] [[ダイジェスト認証]]も参照。

[41] [[クライアント]]は、[[サーバー]]から改めて [[challenge]]
を受信せずとも、予め[[保護空間]]内の[[資源]]への[[要求]]に
[CODE(HTTP)@en[[[Authorization:]]]] [[ヘッダー]]
([[プロキシ]]の認証の場合は [CODE(HTTP)@en[[[Proxy-Authorization:]]]]
[[ヘッダー]]) で[[基本認証]]の [[credentials]] を含めて送信できます [SRC[>>42]]。

;; [40] [[パスワードマネージャー]]も参照。

* 歴史

** RFC 第1世代

[REFS[
- [1] [CITE@en[RFC 1945 - Hypertext Transfer Protocol -- HTTP/1.0]] ([TIME[2012-02-18 23:25:56 +09:00]] 版) <http://tools.ietf.org/html/rfc1945#section-11>
]REFS]

** RFC 第2世代

[REFS[
- [8] [CITE@en[RFC 2068 - Hypertext Transfer Protocol -- HTTP/1.1]] ([TIME[2012-02-18 23:30:14 +09:00]] 版) <http://tools.ietf.org/html/rfc2068#section-11>
]REFS]

** RFC 第3世代

[REFS[
- [39] [CITE@en[RFC 2617 - HTTP Authentication: Basic and Digest Access Authentication]] ([TIME[2012-01-09 21:04:30 +09:00]] 版) <http://tools.ietf.org/html/rfc2617#section-2>
- [9] [CITE@en[RFC 2617 - HTTP Authentication: Basic and Digest Access Authentication]] ([TIME[2012-01-09 21:04:30 +09:00]] 版) <http://tools.ietf.org/html/rfc2617#page-4>
- [35] [CITE[RFC Errata Report]] ([TIME[2014-10-21 14:42:10 +09:00]] 版) <http://www.rfc-editor.org/errata_search.php?rfc=2617>
]REFS]

** RFC 第4世代

[REFS[
- [10] '''[CITE@en[RFC 7235 - Hypertext Transfer Protocol (HTTP/1.1): Authentication]] ([TIME[2014-09-11 10:01:28 +09:00]] 版) <https://tools.ietf.org/html/rfc7235#section-2.1>'''
]REFS]

** Fetch

[17] [CITE@en[Re: ''''''[''''''whatwg'''''']'''''' '''['''Fetch spec''']''' Link to CORS FAQ wiki]]
( ([[Anne van Kesteren]] 著, [TIME[2014-08-15 19:09:25 +09:00]] 版))
<http://lists.w3.org/Archives/Public/public-whatwg-archive/2014Aug/0087.html>

[18] [CITE@en[Move credentials out of network or cache fetch since it ties in with COR... · 9014f52 · whatwg/fetch]]
( ([TIME[2014-09-13 00:35:09 +09:00]] 版))
<https://github.com/whatwg/fetch/commit/9014f52207bd12f9882ee929d13d3b39def02790>

[19] [CITE@en[Credential Management]]
( ([TIME[2014-09-06 15:49:34 +09:00]] 版))
<https://mikewest.github.io/credentialmanagement/spec/>

[402] [CITE@en[''''''[''''''webappsec'''''']'''''' Rechartering: Credential Management API]]
( ([[Brad Hill]] 著, [TIME[2014-11-10 08:54:19 +09:00]] 版))
<http://lists.w3.org/Archives/Public/public-webappsec/2014Nov/0123.html>

[36] [CITE@en[Credential Management]]
([TIME[2015-01-20 23:35:42 +09:00]] 版)
<https://w3c.github.io/webappsec/specs/credentialmanagement/>

[44] [CITE@en[Explain CORS protocol and credentials interaction]]
( ([[annevk]]著, [TIME[2016-05-05 19:34:15 +09:00]]))
<https://github.com/whatwg/fetch/commit/c9e8db9d9075989fd2b91203f0247c52bac0ca27>

** user credentials

[45] [CITE@en-US[Cross-Origin Resource Sharing]]
( ([TIME[2012-03-01 15:00:14 +09:00]] 版))
<http://dvcs.w3.org/hg/cors/raw-file/tip/Overview.html#user-credentials>

[46] [CITE@en[Re: ''''''[''''''whatwg'''''']'''''' '''['''Fetch spec''']''' Link to CORS FAQ wiki]]
( ([[Anne van Kesteren]] 著, [TIME[2014-08-15 19:09:25 +09:00]] 版))
<http://lists.w3.org/Archives/Public/public-whatwg-archive/2014Aug/0087.html>

[47] [CITE@en[Reference Fetch for “credentials” definition]] ([[sideshowbarker]]著, [TIME[2017-10-13 19:40:59 +09:00]]) <https://github.com/whatwg/xhr/commit/900f0138ba16dbe14d610f5aa8a417185e3f49c0>

[48] [CITE@en[Reference Fetch spec for “credentials” definition by sideshowbarker · Pull Request #163 · whatwg/xhr]] ([TIME[2017-10-14 12:50:04 +09:00]]) <https://github.com/whatwg/xhr/pull/163>




[49] [CITE@en[Clarify that credentials includes HTTP authentication]]
([[sideshowbarker]]著, [TIME[2017-10-14 22:48:48 +09:00]])
<https://github.com/whatwg/fetch/commit/d84658ee3f97b0dafa3ff3e4a2d10dbf8e77c2d6>

[50] [CITE@en[Doc: Definition of credentials unclear · Issue #612 · whatwg/fetch]]
([TIME[2017-10-15 16:27:26 +09:00]])
<https://github.com/whatwg/fetch/issues/612>

[51] [CITE@en[Clarify that credentials include HTTP auth by sideshowbarker · Pull Request #616 · whatwg/fetch]]
([TIME[2017-10-15 16:28:16 +09:00]])
<https://github.com/whatwg/fetch/pull/616>

[52] [CITE@en['''['''worklets''']''' Change the default credentials mode from 'omit' to 'same-o…]]
([[nhiroki]]著, [TIME[2018-05-09 00:32:10 +09:00]])
<https://github.com/w3c/css-houdini-drafts/commit/06d6906df81a3cd17893ed6bb2da79354c8dd7c1>

[53] [CITE@en[Change credentials mode default · Issue #756 · w3c/css-houdini-drafts]]
([TIME[2018-05-10 12:20:14 +09:00]])
<https://github.com/w3c/css-houdini-drafts/issues/756>

[54] [CITE@en['''['''worklets''']''' Change the default credentials mode by nhiroki · Pull Request #757 · w3c/css-houdini-drafts]]
([TIME[2018-05-10 12:20:56 +09:00]])
<https://github.com/w3c/css-houdini-drafts/pull/757>