社内研修「HTTPから学ぶTCP/IP基礎」(3)

前回に引き続き、HTTPリクエストヘッダについてです。
必須であるHost以外にも多くのヘッダフィールドがありますが、今回は「コンテントネゴシエーション」に使われる、ヘッダフィールドについて説明していきます。
コンテントネゴシエーションとは、Webサーバからのレスポンスを、ユーザが最も利用できるコンテンツにする仕組みです。
例えば、https://www.xxxxx.com/という、あるWebサイトにアクセスした場合、https://www.xxxxx.co.jp/にリダイレクトされ、日本語のページが表示される場合があります。
これはWebサーバが、「利用者は日本語のWebページを欲しがっている」と判定したためです。
(コンテントネゴシエーションではなくGoogleのようにIPアドレスで国を判定している場合もあります。)
コンテンツネゴシエーションに使われるヘッダフィールドは、Accept, Accept-Charaset, Accept-Language, Accept-Encoding, User-Agentがあります。その中で特にWebアプリケーションで使われやすいAccept-Language, User-Agent、そして、意識をすることがないですが通信量を減らすために使われているAccept-Encoding について説明します。

Accept-Language

直訳すると「受け入れる言語」。つまり、WebブラウザがWebサーバに対して「この言語でレスポンスをもらえませんか?」という要望を伝えるためのヘッダです。
Accept-Language: ja,en-US;q=0.7,en;q=0.3
上記の場合、日本語→アメリカ英語→何でもいいので英語、の優先順で要求をしています。
このフィールド値はOSのセットアップ時に設定した言語を元に決まります。私の場合は、日本語で設定しているので、上記の値となっています。
複数の言語でコンテンツを用意している場合、どの言語を出すかの選択方法として、Accept-Languageの値を参照し、Webサーバで判定する方法がとられることがあります。
この方法はGoogleのような全言語を網羅している場合なら有効かもしれませんが、「日本語と英語だけ」など用意している言語が少ない場合は、Accept-Languageを使わずにユーザに選択させる方が手っ取り早いかもしれません。

User-Agent

OSやブラウザの種類、バージョンを表します。
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:41.0) Gecko/20100101 Firefox/41.0
例えば上記だとOSはMac OS X 10.10、Firefox 41.0を使っていることが分かります。Webサーバではこの値を使って、PCからのアクセスか、または、携帯からのアクセスかを判断し、それぞれに応じたコンテンツを返す、ということを行います。
ただし、以前のPCブラウザと携帯ブラウザに比べて、現在はPC、タブレット、スマホのブラウザの性能差はほとんど無くなり、違いは画面サイズくらいになっています。そのため、User-Agentでコンテンツそのものを出し分けるのではなく、レスポンシブWebデザインという技術を使ってCSSで画面サイズに応じた表示を変える、というのが主流のようです。

Accept-Encoding

対応可能な圧縮方式を表します。
Accept-Encoding:gzip,deflate
WebサーバでAccept-Encodingに対応している圧縮方式があれば、圧縮をしてリクエストを返します。圧縮されたコンテンツはブラウザで展開後に表示されるので、利用者は意識することがありません。
今回もtelnetを使って圧縮する場合、しない場合を見てみます。
前回はWindowsのtelnetコマンドを使いましたが、今回はMacで行います。
アプリケーションのターミナルを開き、telnetを実行します。
http3-1
Windowsの場合はこのあとローカルエコー(送信した文字を表示する機能)を有効にしましたが、Macの場合はデフォルトで有効になっているようなので、そのままリクエストを送ります。
リクエストにAccept-Encodingを設定した場合です。
文字化けしていますが、これはgzipで圧縮されたコンテンツを表示しようとしているためです。
http3-2
リクエストにAccept-Encodingを設定しない場合です。
圧縮されておらず、HTMLがそのまま表示されています。
http3-3

以上、コンテンツネゴシエーションに関わるリクエストヘッダについて説明をしました。
次回もまだリクエストヘッダが続きます。