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が含まれます。いわゆるリダイレクト先を示す情報です。