[5] [DFN[[CODE(HTTP)[[[407]]]]]] は、[[串]]を使うために[[HTTP認証]]が必要なことを示す[[状態符号]]です。

;; [12] [CODE(HTTP)[[[401]]]] と似ていますが、[[起源サーバー]]ではなく[[プロキシ]]が使います。

* 仕様書

[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-3.2>'''
- [1] [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>
- [9] [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.3>
]REFS]

* 意味

[4] [CODE(HTTP)[[[407]]]] は、[[クライアント]]が[[串]]を使うために[[認証]]が必要なことを示す[[状態符号]]です
[SRC[>>3]]。

;; [8] [CODE(HTTP)[[[401]]]] は[[起源鯖]]が使うものですが、 [CODE(HTTP)[[[407]]]]
は[[串]]が使うものです。 [CODE(HTTP)@en[[[WWW-Authenticate:]]]]/[CODE(HTTP)@en[[[Authorization:]]]]
と [CODE(HTTP)@en[[[Proxy-Authenticate:]]]]/[CODE(HTTP)@en[[[Proxy-Authorization:]]]]
と組み合わせて使う[[ヘッダー]]も異なっています。

* 構文

[404] [[串]]は [CODE(HTTP)[[[407]]]] [[応答]]で[[対象資源]]に適用される
[[challenge]] を含む [CODE(HTTP)@en[[[Proxy-Authenticate:]]]] 
[[ヘッダー]]を送信し[['''なければなりません''']] [SRC[>>3, >>9, >>402, >>405, >>410, >>411]]。

* 文脈

[2] 認証が必要な[[串]]は、[[要求]]で[[串]]についての [[credentials]] がなかったり、
非妥当な [[credentials]] (例えば誤った[[パスワード]]) が指定されていたり、
不完全な [[credentials]] (例えば複数回の往復が必要な認証方式の途中の段階)
が指定されていたりする場合には、最低1つの (おそらくは新しい)
[[challenge]] が指定された [CODE(HTTP)@en[[[Proxy-Authenticate:]]]]
[[ヘッダー]]を含む [CODE(HTTP)[[[407]]]] [[応答]]を送信する[['''べきです''']] [SRC[>>1]]。

[11] [[HTTP接続]]のどの[[応答]]でなければならないか、という規定はないようです。
普通は[[プロキシ]]全体に[[認証]]が必要ということで最初の[[要求]]に対する[[応答]]で使われるのでしょうが、
[[対象URL]]によって[[認証]]が必要だったり異なる[[credentials]]が必要だったりする場合には、
途中の[[要求]]に対する[[応答]]で [CODE(HTTP)[[[407]]]] が返されることもあるかもしれません。

* 処理

[10] [[HTTP認証]]も参照。

-*-*-

[6] [[クライアント]]は、 [CODE(HTTP)[[[407]]]] [[応答]]を受信した場合に新しい 
[CODE(HTTP)@en[[[Proxy-Authorization:]]]] [[ヘッダー]]を含む[[要求]]を再度送信しても構いません
[SRC[>>3]]。

-*-*-

[16] [[HTTPS]] 通信を[[プロキシ]]通過させようとして送信した
[CODE(HTTP)@en[CONNECT]] [[メソッド]]の[[要求]]に対して [CODE[407]]
[[応答]] (やその他 [CODE[200]] 以外の[[応答]]) が返された場合、その[[応答]]は、 [[HTTPS]] の[[応答]]ではありませんから、
取り扱いには注意が必要です。 [SRC[>>13, >>19]]

[EG[
[17] 例えば [CODE[https://www.example.com/foo]] へアクセスしようとして[[プロキシ]]が
[CODE[407]] を返したとしても、 [CODE[https://www.example.com]] の[[起源]]の[[応答]]として[[スクリプト]]を実行などしてはなりません。

;; [18] 悪意ある[[プロキシ]]の場合や、[[プロキシ]]と[[クライアント]]との間で改竄された場合に危険です。
そうでなくても、[[サーバー]]ではなく[[プロキシ]]の[[応答]]なのですから、
[CODE[https://www.example.com]] を[[起源]]とするのは誤りです。
]EG]

;; [20] [CODE[407]] [[応答]]も信用できないとすると、[[プロキシ認証]]自体が危険ということになります。
[[プロキシ]]との接続自体が、[[素のHTTP]]ではなく [[HTTPS]] となっているべきです。
[[HTTPS]] への移行が進み、多くの [[Webブラウザー]]は [[HTTPS]]
による[[プロキシ]]への接続に対応しています。

-*-*-

[14] [[Chrome]] は非[[プロキシ]]から [CODE(HTTP)[[[407]]]] [[応答]]を受信すると、
[[ネットワークエラー]]扱いにするようです。 ([[接続]]は閉じません。) 
[[Firefox]] や [[IE]] は通常の[[応答]]としての処理を行います
(認証[[ダイアログ]]は表示しません)。 [TIME[2015-09-12T15:22:41.400Z]]

* 歴史

** RFC 第2世代

[REFS[
- [402] '''[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.8>'''
- [407] [CITE@en[RFC 2069 - An Extension to HTTP : Digest Access Authentication]] ([TIME[2012-02-26 10:05:21 +09:00]] 版) <http://tools.ietf.org/html/rfc2069#section-2.5>
]REFS]

** RFC 第3世代

[REFS[
- [405] '''[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.8>'''
- [410] [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-1.2>
- [411] [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>
- [409] [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-3.6>
]REFS]

[FIG(quote)[
[FIGCAPTION[
[403] RFC 2068 & 2616 (HTTP/1.1) 10.4.8 407 Proxy Authentication Required
]FIGCAPTION]

> This code is similar to 401 (Unauthorized), but indicates that the
client [DEL[MUST]] [INS[must]] first authenticate itself with the proxy. The proxy MUST
return a Proxy-Authenticate header field (section 14.33) containing a
challenge applicable to the proxy for the requested resource. The
client MAY repeat the request with a suitable Proxy-Authorization
header field (section 14.34). HTTP access authentication is explained
in [DEL[section 11]] [INS["HTTP Authentication: Basic and Digest Access Authentication" [43] ]].

この符号は、 [CODE(HTTP)[[[401]]]] (認証されていません) と同様ですが、
クライアントはまず串について認証しなければならないことを示します。
串は要求された資源について串に適用可能な[[誰何]]を含んだ
[CODE(HTTP)[[[Proxy-Authenticate]]]] 頭欄を返さなければ'''なりません'''。
クライアントは、適当な [CODE(HTTP)[[[Proxy-Authorization]]]]
頭欄をつけて要求を繰り返しても'''構いません'''。
]FIG]

[408] [[RFC 2069]] は[[串]]で認証が必要な時に [CODE(HTTP)@en[[[401]]]] を返すと書いていましたが、
同じ部分が [[RFC 2617]] では [CODE(HTTP)@en[[[407]]]] を返すと修正されています。

;; 元々は [[401]] を使う案だったのが、別の[[状態符号]]を使った方が良いとなったのでしょう。

** RFC 第4世代

[REFS[
- [7] '''[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-3.2>'''
]REFS]


[13] [CITE@en[479880 – (CVE-2009-1836) Non-200 responses to proxy CONNECT requests lead to attacks on HTTPS]]
([TIME[2015-09-12 23:59:23 +09:00]] 版)
<https://bugzilla.mozilla.org/show_bug.cgi?id=479880>

[19] [CITE[Vulnerability Note VU#905344 - HTTP CONNECT and 407 Proxy Authentication Required messages are not integrity protected]] ([TIME[2016-11-28 12:49:57 +09:00]]) <https://www.kb.cert.org/vuls/id/905344>

[15] [CITE@en[Move 401/407 into the network realm]]
([[annevk]]著, [TIME[2016-08-10 21:09:30 +09:00]])
<https://github.com/whatwg/fetch/commit/ec6f5ef5f99cb6b0dd6c701b49791810fb380b04>