Upgradeヘッダーは、HTTP/1.1で導入されたHTTPヘッダーフィールド英語版の1つである。通信の交換時に、クライアントはクリアテキストの要求を行うことから始まり、後で新しいHTTPプロトコルバージョンにアップグレードされるか、別のプロトコルに切り替えられる。コネクションのアップグレードはクライアントからリクエストされなければならない。サーバーがアップグレードを強制したい場合には、426 Upgrade Requiredというレスポンスを送ることができる。その場合、クライアントはコネクションを開いたまま、適切なupgradeヘッダーを付加した新しいリクエストを送信することができる。

TLSでの利用 編集

1つの用途としては、リクエストを通常のHTTPポートで開始し、Transport Layer Security(TLS)に切り替える場合が挙げられる[1]。実用的にはそのような使い方は稀であり、暗号化HTTPの通信の開始時にHTTPSを利用するほうが非常に一般的である。

サーバーは426ステータスコードを返すことで、レガシークライアントに失敗がクライアントに関係することを警告できる(400 レベルコードは、クライアントの失敗であることを意味する)。

セキュアな接続を確立するためのこの方法は、次のような理由で有利である。

同一のリソースが暗号化されたセキュアな方法と暗号化されていない方法の両方でサーバーから取得できる場合、サーバーとの暗号化されたコネクションを保持しながらも、中間者がクライアントとの接続が暗号化と認証が行われていない状態を保持できてしまう可能性がある。

この手法の欠点には次のような点が挙げられる。

  • クライアントがURI内にセキュアなHTTPの要件を指定できない(ただし、クライアントはupgradeのネゴシエーションで要求することはできる)
  • HTTPはホップベースで定義されているため、HTTPトンネル英語版はバイパス用のプロキシサーバーを必要とする可能性がある。

WebSocketでの利用 編集

WebSocketもこの仕組を使用してHTTPサーバーと互換性のある方法で接続を確立する[2]。WebSocket Protocolは2つのパートに分かれる。ハンドシェイクはupgradeされた接続を確立し、その後、実際のデータを転送する。最初に、クライアントはWebSocket接続をUpgrade: WebSocketConnection: Upgradeヘッダーを使用してリクエストする。サーバーは、プロトコルをサポートしていれば、同一のUpgrade: WebSocketConnection: Upgradeヘッダーで応答し、ハンドシェイクを完了する[3]。一度ハンドシェイクが成功裏に完了したら、データの転送が始まる。

HTTP/2での利用 編集

かつて、HTTP Upgradeを利用して平文のHTTP/1.1接続からHTTP/2を確立する方法が規定されていた[4]。クライアントはHTTP/1.1接続を開始し、Upgrade: h2cヘッダーを送信する。もしサーバーがHTTP/2をサポートしていれば、HTTP 101 Switching Protocolステータスコードを付加して応答する。この仕組みはcleartext HTTP2(h2c)でのみ使用される。

この方法は後のRFC 9113で廃止となった[5]

関連項目 編集

出典 編集

  1. ^ RFC 2817
  2. ^ The WebSocket Protocol”. IETF. 2013年12月15日閲覧。
  3. ^ Raymor. “WebSockets: Stable and Ready for Developers”. Microsoft Developer Network. 2013年12月16日時点のオリジナルよりアーカイブ。2013年12月15日閲覧。
  4. ^ "Starting HTTP/2 for "http" URIs". Hypertext Transfer Protocol Version 2 (HTTP/2) (英語). doi:10.17487/RFC7540. RFC 7540
  5. ^ "3.1. HTTP/2 Version Identification". HTTP/2 (英語). sec. 3.1. doi:10.17487/RFC9113. RFC 9113. The "h2c" string was previously used as a token for use in the HTTP Upgrade mechanism's Upgrade header field (Section 7.8 of [HTTP]). This usage was never widely deployed and is deprecated by this document.

外部リンク 編集