★【HTTP】 Request/Response Header

引用元 webtan.impress.co.jp

1 ) ブラウザ → サーバーの「HTTPリクエスト」

HTTPリクエストはブラウザが送るものなので、

HTTPリクエストを作るのはブラウザである。

サーバーは、受け取ったHTTPリクエストの内容からどんな情報を返すかを判断します。




HTTPリクエストには

1) HTTPリクエストライン

2) HTTPヘッダー

3) HTTPリクエストボディ (データ本体)

の3つのパートがあります。




GET /products/bone_substitute HTTP/1.1

Host: XXX.com

Connection: keep-alive

Upgrade-Insecure-Requests: 1

User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9

Sec-Fetch-Site: same-origin

Sec-Fetch-Mode: navigate

Sec-Fetch-User: ?1

Sec-Fetch-Dest: document

Referer: https://XXX.com/nav/route

Accept-Encoding: gzip, deflate, br

Accept-Language: ja,en-US;q=0.9,en;q=0.8,zh-TW;q=0.7,zh;q=0.6

Cookie: XSRF-TOKEN=TTTTTTTTTTTTTTTTTT; 

laravel_session=SSSSSSSSSSSSSs

1) HTTPリクエストライン

GET /products/bone_substitute HTTP/1.1

HTTPリクエストの1行目が、リクエスト内容を示す [HTTPリクエスト行]
ここには、
(1) メソッド (2) URL (3)HTTPのバージョン
の3つの情報が含まれている。


「メソッド」はWebではほとんどの場合「GET」で、
この場合、HTTPリクエストでは「データ本体」は送られません。
メソッドが「POST」の場合
(フォームから情報を送信するなどでmethod="POST"が指定されている場合)は、
HTTPヘッダーの後にデータ本体が続きます。


2行目以降が[HTTPヘッダー]で、次のようなものが代表的です。

(1) ユーザーエージェント名(User-Agent)

ブラウザの種類やOSの情報。
アクセスしているのがブラウザではなく検索エンジンのクローラの場合、
「Googlebot」などの名前が入ります。

(2) リファラReferer

どのページから発生したリクエストなのかを示します。 よく知られているのは、ページAにあるリンクをクリックしてページBに行った場合に、
ページBへのHTTPリクエストにリファラーとしてページAが入ることです。 ほかにも、ページCを表示する際にページ内で使われている画像をリクエストする際に、
画像のHTTPリクエストにリファラーとしてページCが入っています。


(3) 更新されていたら(If-Modified-Since)/同じでなければ(If-None-Match)

ブラウザは、一度表示したデータを「ローカルキャッシュ」として保存しておき、
同じデータは何度も通信して取得しなくてもいいようにしています。
そのときに、ローカルキャッシュのデータが変更されていないかチェックするために、
ファイルの変更日付や管理情報をリクエストに含めておきます。
すると、「更新されていなければその旨教えて」という意味になります。

(4) クッキー(Cookie

ブラウザに保存されているクッキーデータは毎回サーバーに送られています。
ログイン状態を続けられるのは、ログイン時にサーバーから送られたクッキーをブラウザが保存しておいて、
リクエストの際に送っているからですね。

(5) 受け取り希望(Accept、Accept-Language、Accept-Encoding、Accept-Charset)

どんなデータを受け取りたいか、画像の種類や、言語、文字コードなどの希望を伝えます。
英語バージョンと日本語バージョンなど複数の内容を提供している場合、
サーバーはこの情報を元に適切な情報を返したり、動的なページでうまく提案したりできます。




HTTPレスポンス

2) サーバー → ブラウザの「HTTPレスポンス」

HTTPレスポンスはサーバーがブラウザに送るものですから、
HTTPレスポンスを作るのはサーバーです。
ブラウザは、受け取ったHTTPレスポンスを処理して画面に表示します。




HTTPレスポンスには

(1) HTTPレスポンスライン

(2) HTTPヘッダー

(3) HTTPレスポンスボディ (データ本体)

の3つのパートがあります。




「データ本体」は、私達が通常見ているHTMLや画像のデータです。
実際にはブラウザは、
データ本体の前に「レスポンス状態行」と「HTTPヘッダー」を受け取っていますが、
通常、画面には表示してくれません。

HTTP/1.1 200 OK

Date: Thu, 11 Jun 2020 02:54:57 GMT

Server: Apache/2.4.6 (CentOS) OpenSSL/1.0.2k-fips PHP/7.1.33

X-Powered-By: PHP/7.1.33

Cache-Control: no-cache, private

Set-Cookie: 
XSRF-TOKEN=TTTTTTTT; expires=Thu, 11-Jun-2020 04:54:57 GMT; Max-Age=7200; path=/

Set-Cookie: laravel_session=SSSSSSSSS; expires=Thu, 11-Jun-2020 04:54:57 GMT; Max-Age=7200; path=/; httponly

Keep-Alive: timeout=5, max=100

Connection: Keep-Alive

Transfer-Encoding: chunked

Content-Type: text/html; charset=UTF-8

HTTPレスポンスの1行目が、リクエストに対する返答の状態を示す「レスポンス状態行」です。
ここには、「状態コード」(「HTTPステータスコード」とも呼ばれる)などが含まれます。

HTTP/1.1 200 OK

「HTTPヘッダー」は、データ本体の前に送られてくる、
各種の状態を示す情報が入れられている部分です。
HTTPレスポンスの代表的なHTTPヘッダーには次のようなものがあります。

(1) コンテンツタイプ(Content-Type)

データがHTMLなのか画像なのかや、文字コードなどの情報。

(2) 再利用期限(Expires)

取得したデータを再度サーバーに問い合わせなくても
ブラウザが再利用していい期限(キャッシュの制御に使われる)。

(3) データの最終更新日時(Last-Modified)やエンティティ情報(ETag)

HTMLや画像などがいつ更新されたものかの情報や、
サーバー上のファイルの場所ID、ファイルのサイズ、更新日時などから算出した、
更新チェック情報。
次回同じデータをリクエストする際に、これらの情報を使って更新されているかどうかを確認します。

(4) キャッシュ制御(Cache-ControlやPragma)

ブラウザや通信を橋渡しするプロキシが、データのキャッシュをどう扱うかの情報。

(5) 接続状況(Connection)

接続を持続するのか(keep-alive)、毎回接続を切断するのか(close)。
ブラウザもサーバーもHTTPバージョン1.1の持続接続(keep-alive)を使える場合、
通信のやりとりが効率良くなります。

(6) 移動先(Location)

リクエストと違う場所からデータを取得するように示す指示。
新しい場所のURLが含まれます。いわゆるリダイレクト先を示す情報です。