-
Notifications
You must be signed in to change notification settings - Fork 4
/
109.txt
302 lines (228 loc) · 14 KB
/
109.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
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
* 仕様書
[REFS[
- [10] [CITE@en[RFC 7838 - HTTP Alternative Services]] ([TIME[2016-04-17 23:25:39 +09:00]] 版) <https://tools.ietf.org/html/rfc7838>
]REFS]
* 代替サービス
[27] 普通 [[HTTP]] の[[資源]]へのアクセスは [[URL]] で指定された[[起源サーバー]]に接続して行いますが、
それとは異なるアクセス方法を[[起源サーバー]]が提供したい場合があり、
それを[DFN[[RUBYB[代替サービス]@en[alternative service]]]]と言っています。
より正確には、[[資源]]群に異なる[[プロトコル]]、[[ホスト]]、[[ポート]]の組み合わせでアクセスできるとき、
[[起源]]の[[代替サービス]]が利用可能であるといいます [SRC[>>10]]。
[EG[
[31] [[起源サーバー]]は、[[負荷]]が大きい時や、
[[クライアント]]により近い[[サーバー]]があるときに、
他の[[サーバー]]を使うよう[[クライアント]]に求めたいことがあります。 [SRC[>>10]]
]EG]
[EG[
[28] [[起源サーバー]]は、 [[HTTP/2]] など新しいプロトコルや、
[[TLS]] など[[セキュリティー]]を向上させたプロトコルを使ったアクセスを提供したいことがあります。
[SRC[>>10]]
]EG]
[EG[
[29] [[起源サーバー]]は、運用上、例えば [[SNI]] に対応しているかどうかなどで、
[[クライアント]]群を分類したいことがあるかもしれません。 [SRC[>>10]]
]EG]
[36] [[代替サービス]]は、 ([[ALPNプロトコル名]], [[RFC 3986]] [[ホスト]],
[[RFC 3986]] [[ポート]]) の組で表します。 [SRC[>>10]]
** 発見
[58] [[代替サービス]]は、次の方法で[[サーバー]]が[[広告]]することができます。
[FIG(middle list)[
- [CODE[Alt-Svc:]] [[HTTPヘッダー]]
- [CODE[ALTSVC]] [[フレーム]]
]FIG]
[HISTORY[
[59] 元々 [CODE(HTTP)@en[Alternate-Protocol:]] [[ヘッダー]]が使われていましたが、
例によって [[IETF]] で[[標準化]]された際に改称・非互換変更され、
[CODE[Alt-Svc:]] となりました。
]HISTORY]
[30] [[代替サービス]]は[[起源]]全体に適用されるものですから、
一部の[[資源]]のみに適用することはできません [SRC[>>10]]。
[42] [[起源サーバー]]も[[代替サービス]]も、
[[代替サービス]]を更新したり、消去したり、
[[新鮮寿命]]を伸ばしたりできます。 [SRC[>>10]]
** 代替サービスキャッシュ
[45] [[クライアント]]は、[[キャッシュ]]に、[[起源]]ごとの[[代替サービス]]群を保持します。
[37] [[代替サービス]]は、[[秒]]単位の[DFN[[F[[RUBYB[[[新鮮寿命]]]@en[freshness lifetime]]]]]]を持ちます [SRC[>>10]]。
[40] [[クライアント]]は、[[代替サービス]]が[[新鮮]]である間、
いつでも当該[[代替サービス]]を使うことができます。 [SRC[>>10]]
[41] [[クライアント]]は、既にある[[接続]]については、
[[新鮮寿命]]を過ぎてもそのまま使い続けることができます。 [SRC[>>10]]
[44] [[クライアント]]は、[[ネットワーク]]設定が変化した時、
[CODE[persist]] フラグの値が [CODE[1]] であるものを除き、
[[代替サービス]]の情報を[[キャッシュ]]から削除する[SHOULD[べきです]]。
これは、[[代替サービス]]によって[[クライアント]]を最適なサーバーに向けていた場合に、
[[ネットワーク]]設定の変化で最適性が変化する可能性があるからです。 [SRC[>>10]]
** 利用
[50] [[クライアント]]は、
[[代替サービス]]の情報が利用可能となったら、
それが[[新鮮]]であり、既存の[[接続]]より[[セキュリティー]]的に好ましいものである限りにおいて、
当該[[起源]]のすべての[[要求]]で、その[[代替サービス]]を使う[SHOULD[べきです]]。
[[代替サービス]]を使う義務はありませんが、
[[サーバー]]の[[負荷分散]]などのために[[代替サービス]]を使っているかもしれませんから、
[[代替サービス]]を使った方が好ましいとされています。 [SRC[>>10]]
[46] しかし、[[代替サービス]]の利用は [[fingerprinting vector]] です。
悪意ある[[サーバー]]は、[[クライアント]]の識別のために[[代替サービス]]情報を提供するかもしれません。
[51] [[クライアント]]は、複数の[[代替サービス]]がある場合、
自身の適切な方法でいずれかを選択できます。 [SRC[>>10]]
[52] [[プロキシ]]を使う設定の[[クライアント]]は、
[[代替サービス]]に直接接続するのではなく、
[[プロキシ]]経由で接続する[SHOULD[べきです]] [SRC[>>10]]。
[54] [[クライアント]]は、[[代替サービス]]を使うことにした場合でも、
[[代替サービス]]の[[接続]]の確立を待たずに既存の[[接続]]を使い続けても構いません。
しかし、[[セキュリティー]]上の理由から、[[代替サービス]]の[[接続]]の確立を待った方が良いこともあります。
[SRC[>>10]]
[55] [[クライアント]]は、
[[代替サービス]]への[[接続]]が失敗したり、応答しなくなったりした場合には、
[[起源サーバー]]や他の[[代替サービス]]への接続にフォールバックして構いません。
[SRC[>>10]]
[56] ただし、これは [[downgrade attack]] かもしれないので注意が必要です。
特に[[代替サービス]]への接続でプロトコルの折衝に失敗した場合には、
[[代替サービス]]への接続の失敗とみなしては[MUST[なりません]]。 [SRC[>>10]]
[EG[
[57] 例えば [CODE[h2]] を使おうとしたのに [[ALPN]] で [CODE[h2]]
が選べなかった場合は、フォールバックしてはなりません。
]EG]
[32] [[代替サービス]]は[[URL]]や[[起源]]に影響せず、
接続先の決定とプロトコルの選択のみに関わるものです。 [[HTTPリダイレクト]]とは異なります。
特に、
[FIG(list)[
- [33] [[service identity]] の検証では、
元の [[URL]] の[F[ホスト]]を使わなければなりません。 [SRC[>>10]]
- [47] [[SNI]] では、元の [[URL]] の[F[ホスト]]を使わなければなりません。 [SRC[>>10]]
- [34] [[HTTP]] [CODE(HTTP)@en[Host:]] には、
元の [[URL]] の[F[ホスト]]や[F[ポート]]を使わなければなりません。
[SRC[>>10]]
]FIG]
;; [35] もちろん、[[開発者コンソール]]の類には実際に使った[[代替サービス]]の情報を表示できます
[SRC[>>10]]。
[53] [[代替サービス]]への[[HTTP要求]]には、 [CODE[Alt-Used:]]
[[ヘッダー]]を含めることができます [SRC[>>10]]。
;; 必須ではないようです。
[43] [[代替サービス]]は当該[[起源]]について完全に [[authoritative]]
とみなされます [SRC[>>10]]。[[代替サービス]]に関する制御はもちろん、
[[キャッシュ]]その他あらゆる面で、[[起源サーバー]]と等価に扱われるようです。
;; この点、[[プロキシ]]や[[ミラーサーバー]]とは異なります。
[38] [[クライアント]]は、[[代替サービス]]が当該[[起源]]全体の制御下にあり、妥当であることの[RUBYB[十分な保証]@en[reasonable assurances]]を有しなければ[MUST[なりません]]。
ここでいう「十分な保証」は、
[[HTTPSサーバー認証]]で確立できます。[[クライアント]]は更に他の要件を加えても構いません。
[SRC[>>10]]
[EG[
[39] [[起源]]の[F[ホスト]]が [CODE[www.example.com]] のとき、
[[代替サービス]]の[F[ホスト]]が [CODE[other.example.com]] で[F[プロトコル]]が
[CODE[h2]] (= [[HTTP/2]] over [[TLS]]) なら、[[証明書]]が [CODE[www.example.com]]
で有効かどうかを検証することで、
十分な保証があるとみなすことができます。しかし[F[プロトコル]]が [CODE[h2c]]
(= [[HTTP/2]] over [[TCP]]) では、同様の検査ができないので、
十分な保証が得られないと判断せざるを得ません。 [SRC[>>10]]
]EG]
[48] [[代替サービス]]の[F[プロトコル]]が [[TLS]] を使う場合、
[[クライアント]]が [[SNI]] に対応していなければ、
その[[代替サービス]]を使っては[MUST[なりません]] [SRC[>>10]]。
;; [49] なぜか [[SNI]] を使わなければ[MUST[ならない]]とはされていませんが、
普通に考えれば、[F[ホスト]]が[[ドメイン名]]の場合、使わなければならないはずです
(そうでなければ[[Web互換]]ではありません)。[F[ホスト]]が[[IPアドレス]]なら、
[[SNI]] は使えません。
* 歴史
** [CODE(HTTP)@en[Alternate-Protocol:]] ヘッダー
[1] [CITE[SPDY Protocol - Draft 2 - The Chromium Projects]]
( ([TIME[2013-10-19 15:06:10 +09:00]] 版))
<http://www.chromium.org/spdy/spdy-protocol/spdy-protocol-draft2#TOC-Server-Advertisement-of-SPDY-through-the-HTTP-Alternate-Protocol-header>
[2] [CITE[Re: Add QUIC to Alternate-Protocol support. (issue 12156005) - Google グループ]]
( ([TIME[2013-10-20 06:22:12 +09:00]] 版))
<https://groups.google.com/a/chromium.org/forum/#!topic/chromium-reviews/NhzeGXtLCOA>
[3] [CITE[Actually enable Alternate-Protocol support for QUIC. (issue 17410014) - Google グループ]]
( ([TIME[2013-10-20 06:22:43 +09:00]] 版))
<https://groups.google.com/a/chromium.org/forum/#!topic/chromium-reviews/y2RjueIsQbM>
[4]
>
[PRE(HTTP code)[
HTTP/1.1 304 Not Modified
X-GData-User-Country: JP
Date: Sun, 20 Oct 2013 06:20:16 GMT
Server: GSE
Alternate-Protocol: 80:quic
]PRE]
[5] [CITE[SPDY Protocol - Draft 2 - The Chromium Projects]]
( ([TIME[2014-11-01 00:36:56 +09:00]] 版))
<http://www.chromium.org/spdy/spdy-protocol/spdy-protocol-draft2#TOC-Server-Advertisement-of-SPDY-through-the-HTTP-Alternate-Protocol-header>
[6]
[PRE(HTTP example code)[
Alternate-Protocol: 80:quic,p=0.01
]PRE]
[FIG(quote)[
[FIGCAPTION[
[7] [CITE[QUIC FAQ - The Chromium Projects]]
([TIME[2016-04-16 07:05:17 +09:00]] 版)
<https://www.chromium.org/quic/quic-faq>
]FIGCAPTION]
> How do I aim Chrome at the test server?
> If you have an HTTP server, you'll need it to emit a response header that looks like:
> Alternate-Protocol: quic:<QUIC server port>
]FIG]
[8] [CITE[Issue 1720163002: When Alt-Svc header processing is enabled, do not process Alternate-Protocol - Code Review]]
([TIME[2016-04-18 00:42:12 +09:00]] 版)
<https://codereview.chromium.org/1720163002/>
[9] [CITE@en[698362 – Decide what to do regarding Alternate-Protocol vs redirects]]
([TIME[2016-04-18 17:03:45 +09:00]] 版)
<https://bugzilla.mozilla.org/show_bug.cgi?id=698362>
** [CODE(HTTP)@en[Alt-Svc:]] ヘッダー
[16] [CITE@en[HTTP Alternative Services]]
( ([TIME[2014-07-24 13:19:57 +09:00]] 版))
<https://httpwg.github.io/http-extensions/alt-svc.html>
[17] [CITE@en[Certificate verification bypass through the HTTP/2 Alt-Svc header — Mozilla]]
([TIME[2015-04-04 05:00:27 +09:00]] 版)
<https://www.mozilla.org/en-US/security/advisories/mfsa2015-44/>
[18] [CITE[Bits Up!: Opportunistic Encryption For Firefox]]
([TIME[2015-04-06 16:35:05 +09:00]] 版)
<http://bitsup.blogspot.jp/2015/03/opportunistic-encryption-for-firefox.html>
[19] [CITE[Mozilla Dials Back on Firefox Opportunistic Encryption]]
([TIME[2015-06-18 11:58:10 +09:00]] 版)
<http://www.eweek.com/security/mozilla-dials-back-on-firefox-opportunistic-encryption.html>
[20] [CITE@en[Certificate verification bypass through the HTTP/2 Alt-Svc header — Mozilla]]
([TIME[2015-04-04 05:00:27 +09:00]] 版)
<https://www.mozilla.org/en-US/security/advisories/mfsa2015-44/>
[21] [CITE@en[draft-ietf-httpbis-alt-svc-07 - HTTP Alternative Services]]
([TIME[2015-05-21 10:26:13 +09:00]] 版)
<https://tools.ietf.org/html/draft-ietf-httpbis-alt-svc-07>
[22] [CITE@en[1003448 – http/2 alt-svc support]]
([TIME[2015-06-18 11:59:58 +09:00]] 版)
<https://bugzilla.mozilla.org/show_bug.cgi?id=1003448>
[23] [CITE@en[1113790 – pref change to true for network.http.altsvc.enabled and altsvc.oe]]
([TIME[2015-06-18 12:00:13 +09:00]] 版)
<https://bugzilla.mozilla.org/show_bug.cgi?id=1113790>
[24] [CITE@en[HTTP Alternative Services]]
([TIME[2015-05-30 15:33:33 +09:00]] 版)
<http://http2.github.io/http2-spec/alt-svc.html>
[25] [CITE[Issue 438263 - chromium - Update HTTP/2 AltSvc frame wire format - An open-source project to help move the web forward. - Google Project Hosting]]
([TIME[2015-06-18 12:04:09 +09:00]] 版)
<https://code.google.com/p/chromium/issues/detail?id=438263>
[11] [CITE[Issue 392575 - chromium - Implement the Alt-Svc spec - An open-source project to help move the web forward. - Google Project Hosting]]
([TIME[2015-06-18 12:04:58 +09:00]] 版)
<https://code.google.com/p/chromium/issues/detail?id=392575>
[12] [CITE@en[Issue 585876 - chromium - QUIC connections to "remote" Alt-Svcs should use the origin hostname in the SNI field - Monorail]]
([TIME[2016-04-18 00:10:27 +09:00]] 版)
<https://bugs.chromium.org/p/chromium/issues/detail?id=585876>
[13] [CITE[Issue 1720163002: When Alt-Svc header processing is enabled, do not process Alternate-Protocol - Code Review]]
([TIME[2016-04-18 00:42:21 +09:00]] 版)
<https://codereview.chromium.org/1720163002/>
[FIG(quote)[
[FIGCAPTION[
[14] [CITE@ja[YouTube]]
([TIME[2016-04-18 00:49:55 +09:00]] 版)
<https://www.youtube.com/>
]FIGCAPTION]
> alt-svc:quic=":443"; ma=2592000; v="32,31,30,29,28,27,26,25"
> alternate-protocol:443:quic
]FIG]
[FIG(quote)[
[FIGCAPTION[
[15] [CITE@ja[Google]]
([TIME[2016-04-18 00:50:55 +09:00]] 版)
<https://www.google.co.jp/>
]FIGCAPTION]
> alt-svc:quic=":443"; ma=2592000; v="32,31,30,29,28,27,26,25"
> alternate-protocol:443:quic
]FIG]
[26] [CITE@en[Implement ALT-SVC · Issue #535 · nghttp2/nghttp2]]
([TIME[2016-04-18 17:19:51 +09:00]] 版)
<https://github.com/nghttp2/nghttp2/issues/535>