Upgrade
使い方
Upgrade ヘッダーは、既存の HTTP/1.1 接続上でのプロトコルネゴシエーションを可能にします。クライアントは別のプロトコルへの切り替えを提案するためにこのヘッダーを送り、サーバーは 101 Switching Protocols で応答して受け入れるか、要求を無視して現在のプロトコルを続けます。
一般的なアップグレード先には WebSocket(websocket)、TLS(TLS/1.2、TLS/1.3)、平文の HTTP/2(h2c)があります。WebSocket へのアップグレードは現代の運用で最も広く使われる形式で、ブラウザとサーバーの間の全二重通信を可能にします。
Upgrade と併せて Connection ヘッダーが必要です。送信側は Connection: upgrade を設定し、中間装置が自ら接続を消費するのではなくアップグレード要求を転送するよう伝えます。
サーバーは 426 Upgrade Required レスポンスの一部としても Upgrade を送信します。これは、現在のプロトコルではリクエストを処理しないことをクライアントに伝え、必要なプロトコルを Upgrade の値に列挙するものです。
注意
Upgrade ヘッダーは HTTP/1.1 にのみ適用されます。HTTP/2 と HTTP/3 は、プロトコルの選択に TLS ハンドシェイク中の ALPN(Application-Layer Protocol Negotiation)を使います。
websocket
全二重通信のために接続を WebSocket プロトコルへアップグレードします。クライアントはアップグレード要求と併せて Sec-WebSocket-Key ヘッダーと Sec-WebSocket-Version ヘッダーを含めます。
h2c
接続を平文(TLS なし)の HTTP/2 へアップグレードします。クライアントは base64url でエンコードされた HTTP/2 の接続パラメーターを含む HTTP2-Settings ヘッダーを含めます。
TLS/1.2, TLS/1.3
暗号化されていない HTTP 接続を TLS で保護された接続へアップグレードします。この仕組みは、TLS を直接確立する方法に比べてあまり使われません。
例
クライアントが WebSocket へのアップグレードを要求します。サーバーは 101 Switching Protocols で応答し、新しいプロトコルを確認して受け入れます。
GET /chat HTTP/1.1
Host: example.re
Connection: upgrade
Upgrade: websocket
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Sec-WebSocket-Version: 13
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
クライアントが平文での HTTP/2 へのアップグレードを提案します。HTTP2-Settings ヘッダーは、base64url 形式でエンコードされた初期の HTTP/2 パラメーターを運びます。
GET / HTTP/1.1
Host: example.re
Connection: upgrade, HTTP2-Settings
Upgrade: h2c
HTTP2-Settings: AAMAAABkAAQCAAAAAAIAAAAA
サーバーがクライアントに別のプロトコルの使用を要求します。426 Upgrade Required レスポンスには、受け入れ可能なプロトコルを列挙した Upgrade ヘッダーが含まれます。
HTTP/1.1 426 Upgrade Required
Upgrade: TLS/1.3
Connection: upgrade