HTTP/1.1 Upgradeヘッダー
From Wikipedia, the free encyclopedia
| HTTP |
|---|
| 主要項目 |
| リクエストメソッド |
| ヘッダーフィールド |
| ステータスコード |
| 認証方式 |
| セキュリティホール |
Upgradeヘッダーは、HTTP/1.1で導入されたHTTPヘッダーフィールドの1つである。通信の交換時に、クライアントはクリアテキストの要求を行うことから始まり、後で新しいHTTPプロトコルバージョンにアップグレードされるか、別のプロトコルに切り替えられる。コネクションのアップグレードはクライアントからリクエストされなければならない。サーバがアップグレードを強制したい場合には、426 Upgrade Requiredというレスポンスを送ることができる。その場合、クライアントはコネクションを開いたまま、適切なupgradeヘッダーを付加した新しいリクエストを送信することができる。
1つの用途としては、リクエストを通常のHTTPポートで開始し、Transport Layer Security(TLS)に切り替える場合が挙げられる[1]。実用的にはそのような使い方は稀であり、暗号化HTTPの通信の開始時にHTTPSを利用するほうが非常に一般的である。
サーバは426ステータスコードを返すことで、レガシークライアントに失敗がクライアントに関係することを警告できる(400 レベルコードは、クライアントの失敗であることを意味する)。
セキュアな接続を確立するためのこの方法は、次のような理由で有利である。
- 複雑で問題が多いサーバサイドのURLリダイレクトを必要としない
- セキュアなウェブサイトのヴァーチャルホスティングが可能になる(ただし、HTTPSではServer Name Indicationを使用することも可能である)
- 特定のリソースにアクセスする手段を1つにすることで、ユーザーの混乱を防ぐことができる
同一のリソースが暗号化されたセキュアな方法と暗号化されていない方法の両方でサーバから取得できる場合、サーバとの暗号化されたコネクションを保持しながらも、中間者がクライアントとの接続が暗号化と認証が行われていない状態を保持できてしまう可能性がある。
この手法の欠点には次のような点が挙げられる。
WebSocketでの利用
WebSocketもこの仕組を使用してHTTPサーバと互換性のある方法で接続を確立する[2]。WebSocket Protocolは2つのパートに分かれる。ハンドシェイクはupgradeされた接続を確立し、その後、実際のデータを転送する。最初に、クライアントはWebSocket接続をUpgrade: WebSocketとConnection: Upgradeヘッダーを使用してリクエストする。サーバは、プロトコルをサポートしていれば、同一のUpgrade: WebSocketとConnection: Upgradeヘッダーで応答し、ハンドシェイクを完了する[3]。一度ハンドシェイクが成功裏に完了したら、データの転送が始まる。