[11] [DFN[[CODE(HTTP)@en[[[WWW-Authenticate:]]]]]] [[ヘッダー]]は、
当該[[対象資源]]へのアクセスに必要な[[認証]]についての情報を含む [[challenge][challenge (HTTP)]]
を指定するものです。

* 仕様書

[REFS[
- [3] '''[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-4.1>'''
- [13] [CITE@en[RFC 3261 - SIP: Session Initiation Protocol]] ([TIME[2014-08-15 14:48:03 +09:00]] 版) <http://tools.ietf.org/html/rfc3261#section-20.44>
- [15] [CITE@en[RFC 2326 - Real Time Streaming Protocol (RTSP)]] ([TIME[2014-10-19 05:24:58 +09:00]] 版) <http://tools.ietf.org/html/rfc2326#section-12.44>
- [14] [CITE@en[RFC 3261 - SIP: Session Initiation Protocol]] ([TIME[2014-08-15 14:48:03 +09:00]] 版) <http://tools.ietf.org/html/rfc3261#section-22.2>
- [16] [CITE@en[RFC 4976 - Relay Extensions for the Message Sessions Relay Protocol (MSRP)]] ([TIME[2014-10-18 23:44:47 +09:00]] 版) <https://tools.ietf.org/html/rfc4976#section-4.3>
- [420] [CITE@en[RFC 5849 - The OAuth 1.0 Protocol]] ([TIME[2012-03-04 10:51:49 +09:00]] 版) <http://tools.ietf.org/html/rfc5849#section-3.5.1>
- [17] [CITE@en[RFC 7616 - HTTP Digest Access Authentication]] ([TIME[2015-11-10 07:05:08 +09:00]] 版) <https://tools.ietf.org/html/rfc7616#section-3.6>
]REFS]

* 意味

[5] [CODE(HTTP)@en[[[WWW-Authenticate:]]]] [[ヘッダー]]は、
[[対象資源]]に適用できる[[認証方式]](群)と[[認証引数]]を示します [SRC[>>3]]。

* 構文

[414] [CODE(HTTP)@en[[[WWW-Authenticate:]]]] [[ヘッダー]]の値は、
1つ[[以上]]の [[challenge][challenge (HTTP)]] の[[リスト][リスト (HTTP)]] ([CODE(HTTP)[#]]) です [SRC[>>3, >>413, >>417]]。

[FIG(railroad)[
= [[challenge][challenge (HTTP)]]
= *
== [[OWS]]
== [CODE(HTTP)[[[,]]]]
== [[OWS]]
== [[challenge][challenge (HTTP)]]
]FIG]

** 読点

[1] この欄は、読点で分離することで複数の誰何を併記できます。
ところが、他の同様の欄とは異なり、誰何自体が引数の分離のために読点を使ってしまっています。
[CODE(ABNF)[auth-scheme]] があるので構文上曖昧性はないのですが、
このために (欄名に依存しない) 汎用の構文解析器で複数の誰何を分離することができません。

おそらくこのような困った仕様になった原因は太古の HTTP では読点とセミコロンが曖昧に使われていたときの名残でしょう。

[8] 実装によっては、複数の [[challenge][challenge (HTTP)]] の指定に対応していないことがあります。
[[鯖]]は複数の [[challenge][challenge (HTTP)]] の指定を避けるべきでしょう。

* 文脈

[407] [[鯖]]は、 [CODE(HTTP)@en[[[401]]]] [[応答]]を[[生成]]する場合、
1つ[[以上]]の [[challenge][challenge (HTTP)]] を含む
[CODE(HTTP)@en[[[WWW-Authenticate:]]]] [[ヘッダー]]を[[送信]]しなければなりません。
[SRC[>>3, >>406, >>413, >>417, >>408, >>409, >>411, >>416]]。

[6] [[鯖]]は、[[credentials]] を指定すると (あるいは他の [[credentials]]
に変更すると) [[応答]]に影響するかもしれないことを示すため、
他の[[応答]]でも [CODE(HTTP)@en[[[WWW-Authenticate:]]]]
[[ヘッダー]]を[[生成]]して構いません [SRC[>>3]]。

[424] [[RFC 4559]] は [CODE(HTTP)[[[200]]]] でも [CODE(HTTP)@en[[[WWW-Authenticate:]]]]
[[ヘッダー]]を用いるとしています。

;; [CODE(HTTP)@en[[[Negotiate]]]] の項を参照。

[7] [CODE(HTTP)@en[[[WWW-Authenticate:]]]] [[ヘッダー]]は複数指定できます [SRC[>>3]]。

* 処理

[10] [[HTTP認証]]も参照。

[410] [[プロキシ]]は、[[転送]]の際に [CODE(HTTP)@en[[[WWW-Authenticate:]]]] 
[[ヘッダー]]を変更しては[['''なりません''']] [SRC[>>3, >>409, >>412, >>419, >>17]]。

* OAuth

[421] [[OAuth 1.0]] を使う場合、 [[auth-scheme]] が [CODE(HTTP)@en[[[OAuth]]]] である
[CODE(HTTP)@en[[[WWW-Authenticate:]]]] 欄を含めても[['''構わない''']] [SRC[>>420]] とされています。

;; [422] [[OAuth]] の場合は事前に [[OAuth]] を使うと分かっていて[[要求]]を発行するのが一般的なので、
[CODE(HTTP)@en[[[WWW-Authenticate:]]]] 欄の必要性はあまりなく、実際に必須とはされていません。

;; [12] [CODE(HTTP)[[[401]]]] [[応答]]では [CODE(HTTP)@en[[[WWW-Authenticate:]]]]
[[ヘッダー]]が必須ですから (>>407)、[[OAuth]] のみを使う場合で [CODE(HTTP)[[[401]]]]
を返すなら、 >>421 は [['''MAY''']] ではなく [['''MUST''']] ということになります。

* 関連

[18] [CODE(HTTP)@en[[[WWW-Authenticate:]]]] [[ヘッダー]]は、
[[要求]]に適切な [[credentials]] が含まれず[[認証]]に失敗した時に使います。
[[認証]]に成功した時の[[サーバー]]から[[クライアント]]への情報伝達には、
[CODE(HTTP)@en[[[Authentication-Info:]]]] [[ヘッダー]]が使われます。

* 歴史

** RFC 第1世代

[REFS[
- [406] '''[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-10.16>'''
- [408] [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#page-36>
- [409] [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[
- [411] [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-10.4.2>
- [412] [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#page-66>
- [413] '''[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-14.46>'''
]REFS]

** RFC 第3世代

[REFS[
- [416] [CITE@en[RFC 2616 - Hypertext Transfer Protocol -- HTTP/1.1]] ([TIME[2012-01-09 20:55:20 +09:00]] 版) <http://tools.ietf.org/html/rfc2616#section-10.4.2>
- [417] '''[CITE@en[RFC 2616 - Hypertext Transfer Protocol -- HTTP/1.1]] ([TIME[2012-01-09 20:55:20 +09:00]] 版) <http://tools.ietf.org/html/rfc2616#section-14.47>'''
- [419] [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-5>
]REFS]

[FIG(quote)[
[FIGCAPTION(quote)[
[403] RFC 1945 (HTTP/1.0) 10.16; RFC 2068 (HTTP/1.1) 14.46; RFC 2616 (HTTP/1.1) 14.47 WWW-Authenticate

;; [404] 注記のない変更点は、 RFC 1945→RFC 2068 のもの。
]FIGCAPTION]

> The WWW-Authenticate response-header field [DEL[must]] [INS[MUST]] be included in 401
([DEL[unauthorized]] [INS[Unauthorized]]) response messages. The field value consists of at
least one challenge that indicates the authentication scheme(s) and
parameters applicable to the Request-URI.

[CODE(HTTP)[WWW-Authenticate]] [[応答頭欄]]は、
[CODE(HTTP)[[[401]]]] (未認証) 応答メッセージに含められなければ'''なりません'''。
欄値は、最低一つの[[誰何]]で構成します。
誰何は、その [CODE(ABNF)[[[Request-URI]]]] に適用可能な認証方式および引数を示します。

>
-WWW-Authenticate = "WWW-Authenticate" ":" 1#challenge

> The HTTP access authentication process is described in [DEL[section 11]] [INS[[INS[{2616}]] "HTTP Authentication: Basic and Digest Access Authentication" [43] ]].
User agents [DEL[[DEL[must]] [INS[MUST]]]] [INS[are advised to]] take special care in parsing the WWW-Authenticate
field value [DEL[if it]] [INS[[INS[{2616}]] as it might]] contain[DEL[s [INS[{1945,2068}]]]] more than one challenge, or if more than
one WWW-Authenticate header field is provided, [DEL[since the contents of a challenge may itself]] [INS[[INS[{2616}]] the contents of a challenge itself can]] contain a comma-separated list of
authentication parameters.

HTTP 接続認証処理は [[RFC2617]] で説明されています。
[[利用者エージェント]]は [CODE(HTTP)[WWW-Authenticate]] 欄値を構文解析するに当たって特別の注意を払うように助言しておきます。
欄値は複数の誰何を含むかもしれませんし、
複数の [CODE(HTTP)[WWW-Authenticate]] 頭欄が提供されているなら、
誰何の内容自体が認証引数群の読点分離並びを含むかもしれません。
]FIG]

** RFC 第4世代

[REFS[
- [4] '''[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-4.1>'''
]REFS]

* 実装

[2] [CODE(HTTP)[realm]] にセミコロンが含まれると、
[WEAK[([CODE(ABNF)[[[quoted-string]]]] にしているのに)]]
[[ClassicMozilla]] はセミコロン前でぶった切ってしまいます。
(そのくせ、引用開始の引用符はちゃんと省いて表示してくれる。)
([[NN2]], [[NC]] 4.01 で確認。)

[[WinIE1]] ですらこんなことはありませんでした。

なんと、 Mosaic Netscape 0.9
は正しく処理します。

[402] [[フォーム]]の[[提出]]先が[[基本認証]]の時の動作が変なブラウザーがありますね。
[[Gecko]] とか [[WinIE]] とか [[WebKit]] とか。最初必ず認証なしで試して、 [CODE(HTTP)[[[401]]]]
なら再試行するところ、なぜか再試行しようとして接続を試みたままだったり。
[[Firefox]] だと最初の1回目だけ変なことがあって次からはうまくいくみたいですが。
リンク先が違う[[ディレクトリ]]だったりとかも関係してるっぽ。
[[Safari]] と [[Chrome]] の間でもなんかちがうな。。。

* 例

[EG[
[9] [[HTTP]] 仕様書 [SRC[>>3]] 
では次のような架空の[[認証方式]]と[[基本認証]]を併用した例が示されています。

[PRE(HTTP code)[
WWW-Authenticate: Newauth realm="apps", type=1,
                  title="Login to \"apps\"", Basic realm="simple"
]PRE]
]EG]

* 関連

[405] [[起源鯖]]ではなく、途中の[[串]]について行う[[認証]]のための 
[CODE(HTTP)@en[[[Proxy-Authenticate:]]]] 欄もあります。