[103] HTTP の代替サービスは、 QUIC への切り替えなどに用いられています。
[27] 普通 HTTP の資源へのアクセスは URL で指定された起源サーバーに接続して行いますが、 それとは異なるアクセス方法を起源サーバーが提供したい場合があり、 それを代替サービスと言っています。 より正確には、ある起源の資源群に、 本来とは異なるプロトコル、ホスト、ポートの組み合わせでアクセスできるとき、 起源の代替サービスが利用可能であるといいます >>10。
[36] 代替サービスは、 (ALPNプロトコル名, RFC 3986 ホスト, RFC 3986 ポート) の組で表します。 >>10
[30] 代替サービスは起源全体に適用されるものですから、 一部の資源のみに適用することはできません >>10。
[58] サーバーは、次の方法を使って代替サービスを広告できます。
[111] クライアントは、サーバーからこれらを受信したら、 その情報を保持して代替サービスとして使います。
[42] 起源サーバーも代替サービスも、 代替サービスを更新したり、消去したり、 新鮮寿命を伸ばしたりできます。 >>10
[45] クライアントは、キャッシュに、起源ごとの代替サービス群を保持します。
[44] クライアントは、ネットワーク設定が変化した時、
persist
フラグの値が 1
であるものを除き、
代替サービスの情報をキャッシュから削除するべきです。
これは、代替サービスによってクライアントを最適なサーバーに向けていた場合に、
ネットワーク設定の変化で最適性が変化する可能性があるからです。 >>10
[105] クライアントは、代替サービスから
421
応答を受信したら、
当該代替サービスの情報をキャッシュから削除しなければなりません >>10。
[110] 起源ごとにクライアントが保持する情報を消去する際には、 代替サービスのキャッシュも消去しなければなりません >>109。
[50] クライアントは、 代替サービスの情報が利用可能となったら、 それが新鮮であり、既存の接続よりセキュリティー的に好ましいものである限りにおいて、 当該起源のすべての要求で、その代替サービスを使うべきです。 代替サービスを使う義務はありませんが、 サーバーの負荷分散などのために代替サービスを使っているかもしれませんから、 代替サービスを使った方が好ましいとされています。 >>10
[46] しかし、代替サービスの利用は fingerprinting vector です >>109。 悪意あるサーバーは、クライアントの識別のために代替サービス情報を提供するかもしれません。
[129] クライアントは、クッキーなどの削除の際に、 代替サービスの情報も消去しなければなりません >>118。
[40] クライアントは、代替サービスが新鮮である間、 いつでも当該代替サービスを使うことができます。 >>10
[51] クライアントは、複数の代替サービスがある場合、 自身の適切な方法でいずれかを選択できます。 >>10
[52] プロキシを使う設定のクライアントは、 代替サービスに直接接続するのではなく、 プロキシ経由で接続するべきです >>10。
[54] クライアントは、代替サービスを使うことにした場合でも、 代替サービスの接続の確立を待たずに既存の接続を使い続けても構いません。 しかし、セキュリティー上の理由から、代替サービスの接続の確立を待った方が良いこともあります。 >>10
[41] クライアントは、既にある接続については、 新鮮寿命を過ぎてもそのまま使い続けることができます。 >>10
[55] クライアントは、 代替サービスへの接続が失敗したり、応答しなくなったりした場合には、 起源サーバーや他の代替サービスへの接続にフォールバックして構いません。 >>10
[56] ただし、これは downgrade attack かもしれないので注意が必要です。 特に代替サービスへの接続でプロトコルの折衝に失敗した場合には、 代替サービスへの接続の失敗とみなしてはなりません。 >>10
[32] 代替サービスはURLや起源に影響せず、 接続先の決定とプロトコルの選択のみに関わるものです。 HTTPリダイレクトとは異なります。 特に、
[53] 代替サービスへのHTTP要求には、 Alt-Used:
ヘッダーを含めることができます >>10。
[43] 代替サービスは当該起源について完全に authoritative とみなされます >>10。代替サービスに関する制御はもちろん、 キャッシュその他あらゆる面で、起源サーバーと等価に扱われるようです。
[38] クライアントは、代替サービスが当該起源全体の制御下にあり、妥当であることの十分な保証を有しなければなりません。 ここでいう「十分な保証」は、 HTTPSサーバー認証で確立できます。クライアントは更に他の要件を加えても構いません。 >>10
[39] 起源のホストが www.example.com
のとき、
代替サービスのホストが other.example.com
でプロトコルが
h2
(= HTTP/2 over TLS) なら、証明書が www.example.com
で有効かどうかを検証することで、
十分な保証があるとみなすことができます。しかしプロトコルが h2c
(= HTTP/2 over TCP) では、同様の検査ができないので、
十分な保証が得られないと判断せざるを得ません。 >>10
[127] Opportunistic HTTP/2 Security はHTTPSサーバー認証を 「十分な保証」としていますが、その上で追加の検査も規定しています。
[48] 代替サービスのプロトコルが TLS を使う場合、 クライアントが SNI に対応していなければ、 その代替サービスを使ってはなりません >>10。
Alt-Svc:
ヘッダー[63] Alt-Svc:
ヘッダーの値は、
clear
(小文字) または1つ以上の値のリストです。
>>61
[71] 複数の値がある場合、サーバーの優先度を表しており、 最初の値が最も好ましいものです。 >>61
[64] 値は、ALPNプロトコル名、=
、ホストおよびポートの後に、
0個以上の引数を並べたものです。 >>61
[67] ALPNプロトコル名は、字句として表します。
字句で表せないオクテットおよび %
は、
RFC 3986 パーセント符号化しなければなりません。
パーセント符号化には大文字を使わなければなりません。
それ以外はパーセント符号化してはなりません。 >>61
[65] ホストおよびポートは、引用文字列です。その値は、
RFC 3986 ホスト、:
、RFC 3986 ポートを並べたものですが、
ホストは省略可能です。省略すると、起源のホストを表します。 >>61
[66] 引数は、字句、=
、字句または引用文字列を並べたものです。
引数の前には区切りの ;
が必要です。 ;
の前後には、 OWS を置けます。 >>61
[74] 未知の引数は、無視しなければなりません >>61。
[62] 任意の応答で使えます >>61。
ただし 421
応答では無視されます。
[72] HTTP/2 でも使えますが、 ALTSVC
フレームを使うべきです
>>61。
なお本ヘッダーの値の部分は、 ALTSVC
フレームのAlt-Svc欄値欄の値としても用いられます。
clear
[68] clear
は、代替サービスをすべて無効化することを表します。
>>61
[69] 同じ応答に他の代替サービスが含まれる場合 (これは非妥当ですが、 あり得ます。)、それもまた無効化されます。 >>61
ma
引数[78] Alt-Svc
により記述された代替サービスの新鮮寿命は、
メッセージの生成から24時間です >>61。
ma
引数の指定がある場合は、生成からその秒数です >>61。
persist
引数[83] persist
引数の値 1
は、
ネットワーク設定が変更された後でも代替サービスが有効であろうとのヒントを表します。
>>61
v
引数ALTSVC
フレーム (HTTP/2)[87] ALTSVC
フレームは、
クライアントに代替サービスを広告するものです。
[92] フレーム型は、 10 (0xA) です >>86。
[94] フラグはありません >>86。 0 でなければなりません >>95。 受信者は無視しなければなりません >>95。
[88] ALTSVC
に対応しないエンドポイントは、
無視します >>86。
[96] サーバーは、受信しても無視しなければなりません >>86。
[97] ストリーム識別子が 0 で、 起源が空なら、無視しなければなりません >>86。
[98] ストリーム識別子が 0 以外で、 起源が空でなければ、無視しなければなりません >>86。
[91] クライアントは、示された起源が現在の接続において authoritative でないと判断するなら、 当該代替サービスを無視しなければなりません >>86。
[125] 起源欄の値が正しい ASCII直列化でない場合にどう処理するべきなのかは明らかではありません。 authoritative でないと判断して無視するのが適切でしょうか。
[100] ALTSVC
の受信は、意味的には、
Alt-Svc:
ヘッダーの受信と等価です >>86。
[99] ALTSVC
フレームはホップ毎に処理されるものですから、
中間器は転送してはなりません。
ただし、受信した ALTSVC
をもとに新たに ALTSVC
を送信することは構いません。 >>86
[112] Chrome は、 QUIC 対応のために代替サービスを使っています。
[115] 代替サービスとしてALPNプロトコル名 quic
を指定することで、 QUIC を使うための接続先を指定できます。
[128] Opportunistic HTTP/2 Security では、
本来素のHTTPを使う http:
URL
へのアクセスであっても、 HTTPS を使って接続できることを代替サービスとして示すことができます。
[120] RFC は任意のプロトコルの組み合わせで利用できると汎用的に規定しています。
[121] 特に、負荷分散などサーバーの判断で他のサーバーにアクセスさせたいときに使えることを主要な用途の1つに挙げています。 しかし、クライアントが対応しているかもしていないかもしれない本手法が既存の手法に対して特に優位といえる点があるかどうかは謎です。
[122] 理論上は HTTP/1 から HTTP/2 への切り替えなど他の手法が既に確立している場面でも本手法を利用できますが、 その必要はなさそうですし、実装が新たにそうした形で対応することもないかもしれません。
[124] いずれにせよ、 RFC は一般的な事項の規定しか含んでいませんから、 より詳細を定めた個別の仕様書が出版されない限り、 相互運用性に問題があり、実質的には使うことはできない状態です。
Alternate-Protocol:
ヘッダー[1] SPDY Protocol - Draft 2 - The Chromium Projects ( ( 版)) http://www.chromium.org/spdy/spdy-protocol/spdy-protocol-draft2#TOC-Server-Advertisement-of-SPDY-through-the-HTTP-Alternate-Protocol-header
[2] Re: Add QUIC to Alternate-Protocol support. (issue 12156005) - Google グループ ( ( 版)) https://groups.google.com/a/chromium.org/forum/#!topic/chromium-reviews/NhzeGXtLCOA
[3] Actually enable Alternate-Protocol support for QUIC. (issue 17410014) - Google グループ ( ( 版)) https://groups.google.com/a/chromium.org/forum/#!topic/chromium-reviews/y2RjueIsQbM
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
[5] SPDY Protocol - Draft 2 - The Chromium Projects ( ( 版)) http://www.chromium.org/spdy/spdy-protocol/spdy-protocol-draft2#TOC-Server-Advertisement-of-SPDY-through-the-HTTP-Alternate-Protocol-header
Alternate-Protocol: 80:quic,p=0.01
[8] Issue 1720163002: When Alt-Svc header processing is enabled, do not process Alternate-Protocol - Code Review ( 版) https://codereview.chromium.org/1720163002/
[9] 698362 – Decide what to do regarding Alternate-Protocol vs redirects ( 版) https://bugzilla.mozilla.org/show_bug.cgi?id=698362
Alt-Svc:
ヘッダー[16] HTTP Alternative Services ( ( 版)) https://httpwg.github.io/http-extensions/alt-svc.html
[17] Certificate verification bypass through the HTTP/2 Alt-Svc header — Mozilla ( 版) https://www.mozilla.org/en-US/security/advisories/mfsa2015-44/
[18] Bits Up!: Opportunistic Encryption For Firefox ( 版) http://bitsup.blogspot.jp/2015/03/opportunistic-encryption-for-firefox.html
[19] Mozilla Dials Back on Firefox Opportunistic Encryption ( 版) http://www.eweek.com/security/mozilla-dials-back-on-firefox-opportunistic-encryption.html
[20] Certificate verification bypass through the HTTP/2 Alt-Svc header — Mozilla ( 版) https://www.mozilla.org/en-US/security/advisories/mfsa2015-44/
[21] draft-ietf-httpbis-alt-svc-07 - HTTP Alternative Services ( 版) https://tools.ietf.org/html/draft-ietf-httpbis-alt-svc-07
[22] 1003448 – http/2 alt-svc support ( 版) https://bugzilla.mozilla.org/show_bug.cgi?id=1003448
[23] 1113790 – pref change to true for network.http.altsvc.enabled and altsvc.oe ( 版) https://bugzilla.mozilla.org/show_bug.cgi?id=1113790
[24] HTTP Alternative Services ( 版) http://http2.github.io/http2-spec/alt-svc.html
[25] Issue 438263 - chromium - Update HTTP/2 AltSvc frame wire format - An open-source project to help move the web forward. - Google Project Hosting ( 版) https://code.google.com/p/chromium/issues/detail?id=438263
[11] Issue 392575 - chromium - Implement the Alt-Svc spec - An open-source project to help move the web forward. - Google Project Hosting ( 版) https://code.google.com/p/chromium/issues/detail?id=392575
[12] Issue 585876 - chromium - QUIC connections to "remote" Alt-Svcs should use the origin hostname in the SNI field - Monorail ( 版) https://bugs.chromium.org/p/chromium/issues/detail?id=585876
[13] Issue 1720163002: When Alt-Svc header processing is enabled, do not process Alternate-Protocol - Code Review ( 版) https://codereview.chromium.org/1720163002/
[26] Implement ALT-SVC · Issue #535 · nghttp2/nghttp2 ( 版) https://github.com/nghttp2/nghttp2/issues/535
[126] mozilla-central: changeset 313435:7078c20114e2 () https://hg.mozilla.org/mozilla-central/rev/7078c20114e2
Alt-Svc: quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,h3-T050=":443"; ma=2592000
[135] draft-bishop-httpbis-sni-altsvc-02 - The "SNI" Alt-Svc Parameter (, ) https://tools.ietf.org/html/draft-bishop-httpbis-sni-altsvc-02
Alt-Svc: h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
Alt-Svc: h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
[137] HTTP/2 | 2020 | The Web Almanac by HTTP Archive () https://almanac.httparchive.org/en/2020/http2#alternative-services