/
138.txt
214 lines (159 loc) · 13.5 KB
/
138.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
[403] [DFN[[CODE(HTTP)@en[[[401]]]]]] ([DFN[[[Unauthorized]]]]) は、[[HTTP認証]]が必要であって、
[[要求]]に適切な [[credentials]] が含まれていなかったことを示す[[状態符号]]です。
* 仕様書
[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.1>'''
- [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>
- [16] [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>
- [18] [CITE@en[RFC 4918 - HTTP Extensions for Web Distributed Authoring and Versioning (WebDAV)]] ([TIME[2014-09-21 17:04:59 +09:00]] 版) <http://tools.ietf.org/html/rfc4918#section-9.1>
- [22] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2015-04-25 04:40:19 +09:00]] 版) <https://html.spec.whatwg.org/#navigate>
]REFS]
* 意味
[5] [CODE(HTTP)[[[401]]]] は、[[要求]]に[[対象資源]]に対して妥当な[[認証]]の
[[credentials]] が含まれていなかったために[[要求]]を適用しなかったことを示す[[状態符号]]です
[SRC[>>3]]。
[6] [[要求]]が [[credentials]] を含んでいた場合には、 [CODE(HTTP)[[[401]]]]
[[応答]]はその [[credentials]] に対する[[認可]]を拒んでいることを示します [SRC[>>3]]。
* 構文
[410] [CODE(HTTP)@en[[[401]]]] [[応答]]を[[生成]]する[[鯖]]は、
[[対象資源]]に適用される [[challenge]] を最低1つは含んだ
[CODE(HTTP)@en[[[WWW-Authenticate:]]]] [[ヘッダー]]を送信し[['''なければなりません''']]
[SRC[>>3, >>16, >>408, >>411, >>412, >>415, >>416, >>419, >>420]]。
[14] [CODE(HTTP)[[[401]]]] [[応答]]の [[payload]] は、[[認証]]に失敗した理由などを記述した簡単な
[[HTML]] [[文書]]とするのが一般的です。会員制サイトなどでは登録ページへのリンクを含めたりします。
;; [15] 現在の一般的な [[Webブラウザー]]では、 [[payload]] の[[文書]]が表示されるのは、
[[認証]]ダイアログを[[キャンセル]]した時です。[[認証]]前に[[利用者]]に伝えたい内容を記述するには不適切です。
* 文脈
[2] [[起源鯖]]は、保護された[[資源]]に対する[[要求]]で [[credentials]] がなかったり、
非妥当な [[credentials]] (例えば誤った[[パスワード]]) が指定されていたり、
不完全な [[credentials]] (例えば複数回の往復が必要な認証方式の途中の段階)
が指定されていたりする場合には、最低1つの (おそらくは新しい)
[[challenge]] が指定された [CODE(HTTP)@en[[[WWW-Authenticate:]]]]
[[ヘッダー]]を含む [CODE(HTTP)[[[401]]]] [[応答]]を送信する[['''べきです''']] [SRC[>>1]]。
;; [8] [[HTTP認証]]も参照。
[17] [CODE(HTTP)@en[[[PROPFIND]]]] [[要求]]に対する [CODE(HTTP)[[[207]]]]
[[応答]]内の [CODE(XMLe)@en[[[status]]]] [[要素]]では、
適切な[[認証]]のもとでしか値を表示できないことを表すために使うことができます [SRC[>>18]]。
[19] [[OAuth 1.0]] の[[認証された要求]]が不適切なときに、 [CODE(HTTP)[[[401]]]]
[[応答]]を返すべき場合があります。
;; [[認証された要求]]参照。
[21] [[OAuth 2.0]] で[[要求]]が不適切な時に、 [CODE(HTTP)[[[401]]]]
を使える場合、使わなければならない場合があります。
;; [[トークンエンドポイント]]参照。
* 処理
[7] [[利用者エージェント]]は、 [[credentials]] を含む[[要求]]に対して [CODE(HTTP)[[[401]]]]
[[応答]]が返された時、新しい [CODE(HTTP)@en[[[Authorization:]]]]
[[ヘッダー]]を指定した[[要求]]を再度試みても構いません [SRC[>>3]]。
[406] [[認証]]を通って [CODE(HTTP)[[[202]]]] などの成功を表す[[応答]]が返されると、
以後、[[HTTP]] [[URL]] が同じ[[階層]] ([[ディレクトリー]])
以下の[[要求]]には[[利用者エージェント]]が自動的に同じ認証情報を付加するので、
[[鯖]]側での[[合言葉]]の変更などで [CODE(HTTP)[[[401]]]] が返されない限り、
[[利用者]]が再度認証情報を求められることはありません。
[407] 通常この認証情報の記憶は同一 [[Webブラウザー]]・[[セッション]]内に限られます。
一般的な [[Webブラウザー]]は認証情報を[[セッション]]を越えて保存しますが、
自動的には送信せず、必ず[[セッション]]の最初の1回は明示的に[[利用者]]に問い合わせる仕組みになっています。
;; [9] [CODE(HTTP)@en[[[realm]]]] も参照。
* レンダリング
[404] [[Webブラウザー]]をはじめとする[[対話的]]な [[HTTP]] [[利用者エージェント]]は、普通、
[[HTTP要求]]に対して [CODE(HTTP)@en[[[401]]]] [[応答]]が返されると、
[[利用者]]に[[名前]]と[[合言葉]]のような認証情報を問い合わせ、
それを含めて再度 [[HTTP要求]]を送信するようになっています。
[405] 入力された認証情報が不適当であった場合には再度 [CODE(HTTP)[[[401]]]] が返されますから、
[[Webブラウザー]]も再度[[利用者]]に入力を求め、以後これを繰り返します。
[[利用者]]が断念すると、 [CODE(HTTP)[[[401]]]] [[メッセージ]]の内容を[[レンダリング]]します。
[418] [CODE(HTTP)@en[[[401]]]] [[応答]]が以前の[[応答]]と同じ [[challenge]]
を含んでいる場合で、[[利用者エージェント]]が既に何度か[[認証]]を試みていた場合には、
[[応答]]に含まれている[[表現]]に診断情報があるのが普通ですから、
これを[[利用者]]に提示する[['''べきです''']] [SRC[>>3, >>416]]。
;; [11] と仕様上はされていますが、実際には >>405 のような実装方法が一般的です。
[10] かつては [CODE(HTTP)[[[401]]]] による[[認証]]情報の入力は[[モーダルダイアログ]]として実装するのが普通でした。そのために表示中のあるページで
[CODE(HTTP)[[[401]]]] が返されると[[Webブラウザー]]のすべての機能が一旦使えなくなるという不便な状態でした。
[12] [CODE(JS)@en[[[alert]]]] などの[[モーダルダイアログ]]に少し遅れて10年代半ばには[[タブ]]に対して[[モーダル]]となり、
他の[[タブ]]の操作は妨害しないように改善されています。
[13] 素朴な実装方法だと [[XHR]] で次々に [CODE(HTTP)[[[401]]]] を返す [[URL]]
を開き続ける方法で[[利用者]]を妨害し続ける[[ブラクラ]]を作ることができてしまいます。
[CODE(HTTP)@en[[[alert]]]] などの[[モーダルダイアログ]]と同様に、
[[キャンセル]]時に以後その[[タブ]]ないし[[起源]]の [CODE(HTTP)[[[401]]]]
による[[認証]]ダイアログの表示を抑制するオプションが必要でしょう。
[24] [[利用者エージェント]]は、 [[navigate]] の際に、
認識できる [[challenge]] を含まない [CODE(HTTP)[[[401]]]] [[応答]]は
[CODE(HTTP)[[[200]]]] [[応答]]のように表示しなければ[['''なりません''']] [SRC[>>22]]。
[23] [[利用者エージェント]]は、認識できる [[challenge]] を含む
[CODE(HTTP)[[[401]]]] [[応答]]であっても、 [CODE(HTTP)[[[200]]]]
[[応答]]のように表示すると共に[[モーダルダイアログ]]でない形で[[ログイン]]できるようにしても構いません
[SRC[>>22]]。
[25] 最近の [[Firefox]] は、[[フレーム]]内の [[navigate]] で
[CODE(HTTP)[[[401]]]] に遭遇し、保存済みの [[credentials]] がないときは、
[[ダイアログ]]を表示せずに [CODE(HTTP)[[[401]]]] [[応答]]を表示するようです。
[TIME[2015-08-21T01:23:21.400Z]]
;; [26] しかしそのような動きは[[Web互換]]ではありません。
* 実装
[402] [[Firefox]] は [CODE(HTTP)@en[[[POST]]]] 時や [[XHR]] で [CODE(HTTP)@en[[[401]]]]
が返された時の扱いが一部バグっているようです。 (詳しい再現条件はよくわからないのですが・・・。)
普通なら[[合言葉]]の入力ダイアログ箱が出るところなのですが、出なかったりもして、謎です。
[TIME[2009-09-15T02:10:12.00Z]]
* 歴史
** RFC 第1世代
[REFS[
- [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#page-36>
- [411] [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[
- [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#section-10.4.2>'''
- [415] [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[
- [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>'''
- [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#section-1.2>
- [420] [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>
]REFS]
[FIG(quote)[
[FIGCAPTION[
[413] RFC 1945 (HTTP/1.0); RFC 2068 & 2616 (HTTP/1.1) 10.4.2 401 Unauthorized
]FIGCAPTION]
>The request requires user authentication. The response [DEL[[INS[{1945}]] must]] [INS[[INS[{2068,2616}]] MUST]]
include a WWW-Authenticate header field ([DEL[[INS[{1945}]] Section 10.16]] [INS[section [DEL[[INS[{2068}]] 14.46]] [INS[[INS[{2616}]] 14.47]]]])
containing a challenge applicable to the requested resource. The
client [DEL[[INS[{1945}]] may]] [INS[[INS[{2068,2616}]] MAY]]
repeat the request with a suitable Authorization header
field ([DEL[[INS[{1945}]] Section 10.2]] [INS[[INS[{2068,2616}]] section 14.8]]).
If the request already included Authorization credentials, then the 401
response indicates that authorization has been refused for those
credentials. If the 401 response contains the same challenge as the prior response,
and the user agent has already attempted
authentication at least once, then the user [DEL[[INS[{1945}]] should]] [INS[[INS[{2068,2616}]] SHOULD]]
be presented the entity that was given in the response, since that
entity [DEL[[DEL[[INS[{1945}]] may]] [INS[[INS[{2068}]] MAY]]]] [INS[[INS[{2616}]] might]]
include relevant diagnostic information. HTTP access authentication is explained
in [DEL[[DEL[[INS[{1945}]] Section 11]] [INS[[INS[{2068}]] section 11]]]] [INS[[INS[{2616}]] "HTTP Authentication: Basic and Digest Access Authentication" [43] ]].
要求は利用者認証を必要としています。応答は、要求された資源に適用可能な[[誰何]]を含んだ [CODE(HTTP)[[[WWW-Authenticate]]]]
頭欄を含んでいなければ'''なりません'''。クライアントは、適当な [CODE(HTTP)[[[Authorization]]]] 頭欄と共に要求を繰り返しても'''構いません'''。
要求が既に [CODE(HTTP)[Authorization]] 証明書を含んでいる場合、 [CODE(HTTP)[401]]
応答はその証明書について認証が拒否されたことを示します。 [CODE(HTTP)[401]]
応答が前の応答と同じ誰何を含んでおり、利用者エージェントが既に最低一度は認証を試みている時は、
応答に含まれている実体には関係する診断情報が含まれているかもしれませんから、 [INS[[INS[(訳注)]]利用者エージェントは]]これを利用者に提示する'''べきです'''。
]FIG]
[421] [CITE@en[RFC 7252 - The Constrained Application Protocol (CoAP)]]
( ([TIME[2014-06-27 00:59:37 +09:00]] 版))
<http://tools.ietf.org/html/rfc7252#section-5.9.2.2>
** 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-3.1>'''
]REFS]
* 関連
[414] [[起源鯖]]によって使われる [CODE(HTTP)[[[401]]]] に対して、[[串]]によって使われる
[CODE(HTTP)[[[407]]]] もあります。
[422] [CITE@en[RFC 2660 - The Secure HyperText Transfer Protocol]]
( ([TIME[2014-11-09 14:12:37 +09:00]] 版))
<http://tools.ietf.org/html/rfc2660#section-5.2.1>
[FIG(quote)[
[FIGCAPTION[
[20] [CITE@en[Other Authentication Methods | GitHub API]]
([TIME[2015-02-05 07:24:20 +09:00]] 版)
<https://developer.github.com/v3/auth/>
]FIGCAPTION]
> The main difference is that the RFC requires unauthenticated requests to be answered with 401 Unauthorized responses. In many places, this would disclose the existence of user data. Instead, the GitHub API responds with 404 Not Found. This may cause problems for HTTP libraries that assume a 401 Unauthorized response.
]FIG]