1. ホーム
  2. http

[解決済み] HTTPの "Host "ヘッダーとは何ですか?

2022-03-02 20:02:35

質問

HTTPリクエストの送信時にTCPコネクションが既に確立されていることから、IPアドレスとポートは暗黙のうちに知られています -- TCPコネクションはIP + ポートです。

では、なぜ Host ヘッダを作成します。 これは、TCP 接続に含まれる IP アドレスにマッピングされたホストが複数ある場合にのみ必要なのでしょうか?

どのように解決するのですか?

その Host ヘッダーは、ウェブサーバーにどの バーチャルホスト を使用します(設定されている場合)。同じバーチャルホストに複数の エイリアス (=ドメインとワイルドカードドメイン)。この場合、アドレスされた異なるドメインに基づいて異なる動作を提供したい場合は、Webアプリケーションでそのヘッダーを手動で読み取る可能性が残っています。これは、ウェブサーバーで、次のように設定することができるからです(私の誤解でなければ、必ず設定しなければなりません)。 1 vhostをデフォルトのホストとして使用します。このデフォルトホストは host ヘッダが設定されたバーチャルホストのどれとも一致しない場合にのみ使用できます。

ということですね。複数のホストと言うと誤解を招くかもしれませんが、あなたは正しく理解しています。ホスト(アドレス指定されたマシン)は同じですが、実際にIPアドレスに解決されるものは、異なるものです。 ドメイン名 (サブドメインも含む)と呼ばれるものです。 ホスト名 (ただし、ホストではありません!)。


この仕様により、初期のSSLでは、クライアントが指定したドメインに対応する証明書をウェブサーバーが配信しなければならないという問題がありました。しかし、どの証明書を使うか知るためには、ウェブサーバーはアドレスされたホスト名をあらかじめ知っている必要がありました。しかし、クライアントはその情報を暗号化された経路でしか送らないので(つまり、証明書がすでに送信された後)、サーバーはあなたがデフォルトのホストを閲覧していると仮定しなければなりませんでした。つまり、1つのIPアドレス/ポートの組み合わせにつき、1つのSSL保護されたドメインが存在することになります。

これを克服したのが サーバー名表示 しかし、サーバー名が再びプレーンテキストで転送されるため、中間者(man-in-the-middle)からは どのホスト名 に接続しようとしている。

ウェブサーバーはサーバー名表示からホスト名を知っているはずですが Host ヘッダーが廃止されたわけではありません。なぜなら、Server Name Indicationの情報はTLSハンドシェイクの中でしか使用されないからです。セキュアでない接続では、Server Name Indicationは全く存在しないので Host ヘッダはまだ有効(かつ必要)です。

もう一つの面白い事実:すべてではないにせよ、ほとんどのウェブサーバーは、HTTPリクエストに正確に1つの Host ヘッダは、たとえデフォルトのvhostしか設定されていないため省略可能であったとしても。つまり、http(get)リクエストに最低限必要な情報は、最初の行に含まれる METHOD RESOURCEPROTOCOL VERSION と、少なくとも Host ヘッダはこのようになります。

GET /someresource.html HTTP/1.1
Host: www.example.com

MDN Documentation on "Host" header というような表現をしています。

<ブロッククオート

Hostヘッダーフィールドは、すべてのHTTP/1.1リクエストメッセージで送信されなければなりません。A 400 (Bad Request) ステータスコードは、HTTP/1.1 リクエストに送信されます。 メッセージは、Hostヘッダーフィールドを欠くか、または2つ以上含んでいます。

ダレル・ミラー氏が言及したように、完全な仕様は以下のサイトで見ることができます。 RFC7230 .