HTTP/1.1 Upgradeヘッダー
HTTP |
---|
主要項目 |
リクエストメソッド |
ヘッダーフィールド |
ステータスコード |
認証方式 |
セキュリティホール |
Upgradeヘッダーは、HTTP/1.1で導入されたHTTPヘッダーフィールドの1つである。通信の交換時に、クライアントはクリアテキストの要求を行うことから始まり、後で新しいHTTPプロトコルバージョンにアップグレードされるか、別のプロトコルに切り替えられる。コネクションのアップグレードはクライアントからリクエストされなければならない。サーバーがアップグレードを強制したい場合には、426 Upgrade Required
というレスポンスを送ることができる。その場合、クライアントはコネクションを開いたまま、適切なupgradeヘッダーを付加した新しいリクエストを送信することができる。
TLSでの利用
[編集]1つの用途としては、リクエストを通常のHTTPポートで開始し、Transport Layer Security(TLS)に切り替える場合が挙げられる[1]。実用的にはそのような使い方は稀であり、暗号化HTTPの通信の開始時にHTTPSを利用するほうが非常に一般的である。
サーバーは426
ステータスコードを返すことで、レガシークライアントに失敗がクライアントに関係することを警告できる(400
レベルコードは、クライアントの失敗であることを意味する)。
セキュアな接続を確立するためのこの方法は、次のような理由で有利である。
- 複雑で問題が多いサーバーサイドのURLリダイレクトを必要としない
- セキュアなウェブサイトのヴァーチャルホスティングが可能になる(ただし、HTTPSではServer Name Indicationを使用することも可能である)
- 特定のリソースにアクセスする手段を1つにすることで、ユーザーの混乱を防ぐことができる
同一のリソースが暗号化されたセキュアな方法と暗号化されていない方法の両方でサーバーから取得できる場合、サーバーとの暗号化されたコネクションを保持しながらも、中間者がクライアントとの接続が暗号化と認証が行われていない状態を保持できてしまう可能性がある。
この手法の欠点には次のような点が挙げられる。
- クライアントがURI内にセキュアなHTTPの要件を指定できない(ただし、クライアントはupgradeのネゴシエーションで要求することはできる)
- HTTPはホップベースで定義されているため、HTTPトンネルはバイパス用のプロキシサーバーを必要とする可能性がある。
WebSocketでの利用
[編集]WebSocketもこの仕組を使用してHTTPサーバーと互換性のある方法で接続を確立する[2]。WebSocket Protocolは2つのパートに分かれる。ハンドシェイクはupgradeされた接続を確立し、その後、実際のデータを転送する。最初に、クライアントはWebSocket接続をUpgrade: WebSocket
とConnection: Upgrade
ヘッダーを使用してリクエストする。サーバーは、プロトコルをサポートしていれば、同一のUpgrade: WebSocket
とConnection: 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 2817
- ^ “The WebSocket Protocol”. IETF. 15 December 2013閲覧。
- ^ Raymor. “WebSockets: Stable and Ready for Developers”. Microsoft Developer Network. 16 December 2013時点のオリジナルよりアーカイブ。15 December 2013閲覧。
- ^ "Starting HTTP/2 for "http" URIs". Hypertext Transfer Protocol Version 2 (HTTP/2) (英語). doi:10.17487/RFC7540. RFC 7540。
- ^ "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.