🙄

HTTPでやりとりする仕組み

2023/02/25に公開

HTTP(HyperText Transfer)

  • HTTPはその名の通り、「HyperText」つまりHTMLなどのテキストファイルや、画像などのコンテンツをやり取りする時に使われるプロトコルです。
  • WEbサイト閲覧などで使用されるHTTPは一番馴染みのあるもの。
  • HTTPはWebの進化に合わせて、機能追加と改良を重ね、さまざまなバージョンが誕生しているが、基本動作は昔と変わりない。

HTTPメッセージによる「要求」と「応答」

  • HTTPでは他のクライアント/サーバーシステムと同様にクライアントであるWebブラウザが要求を送り、サーバーであるWebサーバーがその要求に対して応答を返すといった単純なやり取りを繰り返すことで、Webサイト閲覧を可能としている。
  • HTTPにおいて、WebブラウザとWebサーバーでやり取りする際に利用されるのが「HTTPメッセージ」と呼ばれるデータ形式です。HTTPメッセージを利用されるのがを利用することで、Webブラウザがどういったデータが欲しいのかという要求をWebサーバーに伝える事ができ、またWebサーバーもHTTPメッセージを利用してWebブラウザの要求に対する応答ができる。

二種類のHTTPメッセージ

  • Webブラウザからの要求であるHTTPリクエスト
  • Webサーバーからの応答であるHTTPレスポンス
    基本的に一つのHTTPリクエストに対して、一つのHTTPレスポンスを返す。

HTTPメソッド

HTTPリクエストを用いて、Webサーバーに具体的な要求内容を伝えているのは、HTTPリクエスト内に含まれる「HTTPメソッド」です。HTTPメソッドは目的別に複数定義されております。

  • HTMLファイルなどコンテンツを取得したい場合は「GET」メソッド利用されます。
  • データをWebサーバーに対して送信する場合は「POST」メソッドが利用されます。
  • Webサーバーが保管しているコンテンツを書き換えることを「PUT」メソッド
  • Webサーバーが保管しているコンテンツを削除することができるメソッドを「DELETE」メソッド

「GET」と「POST」の違い

  • コンテンツを取得する際に利用するGETメソッドは、POSTメソッドと同じようにデータを送信する際にも利用できますが、GETメソッドとPOSTメソッドでデータの送信方法は異なります。
  • GETメソッドを利用してデータを送る場合は、URLの後ろに送りたいデータを付与して送ります。
  • 一方、POSTメソッドを利用してデータを送る場合は、HTTPリクエスト内のメッセージボディ内にデータを含めて送ります。
  • GETメソッドを利用しデータを送る場合、URLにデータが組み込まれるため、送ったデータがWebブラウザの閲覧履歴に残っています。一方、POSTメソッドを利用した場合はメッセージボディ内にデータが組み込まれるため、閲覧履歴には残りません。
  • そのため、ショッピングサイトや会員制のWebサイトにおいて、ログインする際に「ユーザーID」や「パスワード」といったデータをWebサーバーに対して、送る場合は、機密性を考慮して、POSTメソッドが利用される。
    また、パソコンに基搭載されている一般的なWEBブラウザである、Internet Explorerでは、URLに使用できる文字列は2083文字以内と制限されるため、大量にデータを送信する場合においてもPOSTメソッドが利用される。
  • 参考記事
    HTTPメソッド4種類(GET,POST,PUT,DELETE)について概要と違いを理解する
    https://developers-book.com/2020/07/20/140/

ステータスコード

  • Webブラウザから要求されたHTMLファイルや画像といったデータをWebサーバーはHTTPレスポンスとして、応答しますが、HTTPレスポンス内にはHTTPリクエストに対するWebサーバー内での処理結果が含まれている。
    ステータスコードと言います。
  • ステータスコードは3桁の数字からなり、処理内容によって100番台から500番台までの5つに分類されています。
  • Webサイトを閲覧する際は、ステータスコードを見ることはありませんが、Webブラウザ上にWebサイトが正常に表示されている場合は「200」番のステータスコードが返ってきます。
  • 時々エラー画面として「ページが見つかりません」といった画面が表示されることがありますが、その際は「404」番のステータスコードが返ってきます。

ステータスコードの分類

ステータスコードは、以下の5つに分類されています。

  • 100番台
    • HTTPリクエストを処理中であることを通知しています。Webサーバーがデータを受け入れ可能かどうか確認するための一時応答で使用されている。
  • 200番台
    • HTTPリクエストに対して、正常に処理した場合に通知している。Webブラウザ上でWebサイトが正常に表示された場合は、ほとんどがこのステータスコードを返している。
  • 300番台
    • HTTPリクエストに対して、転送処理などのWebブラウザ側で追加の処理が必要であることを通知しています。WebサイトのURLが変更されている場合などに使用される
  • 400番台
    • クライアント(Webブラウザ)のエラーであることを通知している。リクエストされたHTMLファイルなどがWebサーバーに存在していない場合にこのステータスコードを返す。「404 Not Found」は一般的に一番良く見かけるステータスコードです。
  • 500番台
    • Webサーバーのエラーであることを通知している。Webサーバーが何らかのエラーによってリクエストに応えられない場合や高負荷状態で一時的にWebコンテンツを転送できない場合にこのステータスコードを返す

メッセージヘッダー

  • HTTPリクエストとHTTPレスポンスはいずれも「メッセージヘッダー」を利用することで、HTTPメッセージに件する詳細な情報を送信することが可能。
  • メッセージヘッダーは複数の「ヘッダーフィールド」と呼ばれる行から成り立っており、それぞれのヘッダーフィールドはフィールド名、その後にコロン(:)と一文字分の空白、そしてフィールド値で構成される。
  • ヘッダーフィールドはそれぞれが持つ情報の種類によって、以下の4つの分けることができる。

一般フィールド

  • HTTPリクエストとHTTPレスポンスの両方に含まれるヘッダーフィールド。代表的なものとして、HTTPメッセージが作成された日付を示す「Date」があります。

リクエストヘッダーフィールド

  • HTTPリクエストのみに含まれるヘッダーフィールド。
  • 代表的なものとしてWebブラウザといったクライアントの固定情報を示す「User-Agent」があります。
    Webサーバーは「User Agent」を参照して、スマートフォンからの接続であれば、スマートフォン向けのWebサイトを表示するといったクライアント毎に異なる処理を行うことができる。

レスポンスヘッダーフィールド

  • HTTPレスポンスのみに含まれるヘッダーフィールド。代表的なものとして、Webサーバー機能を提供するプロダクト情報を示す「Server」があります。ただ、詳細なプロダクト情報がわかってしまうと攻撃対象となる可能性があるため、「Server」が示す情報を制限することも可能です。

エンティティヘッダーフィールド

  • HTTPリクエストとHTTPレスポンスの両方に含まれるヘッダーフィールド。
  • 一般ヘッダーがHTTPメッセージ全体に対しての付加情報を示す。
  • 代表的なものに、データの種類を示す「Content-Typeがある。」

TCPによるデータ通信

  • WebブラウザからのHTTPリクエストと、それに対してのWebサーバーからのHTTPレスポンスを繰り返し行うことでWebサイトを閲覧できますが、これらHTTPのデータのやり取りを行うのはTCP(Transmisson Control Protocol)の役割です。
  • TCPはWebサイトの閲覧だけではなく、メールの送受信やファイルの送受信といったさまざまなデータ転送時に利用されます。
  • TCPではまず、クライアントとサーバーがお互いに通信ができる状態なのかを確認し、「コネクション」と呼ばれる通信経路を確立した上でデータのやり取りを行います。
  • この「コネクション」の確立は、次の3回のやり取りにより行われます。

クライアントからの接続要求(SYN)

  • クライアントからサーバーに対して、接続を要求するためのSYNパケットと呼ばれるデータを送ります。
  • SYNパケットを受け取ったサーバーは、それに対して応答します。

クライアントに対して確認応答及び、サーバーからの接続要求(SYN+ACK)

  • TCPでは、信頼性のある通信を実現するために、データを送信した後、必ず送信相手からの確認応答を受け取ってデータの送信が完了したと判断します。この確認応答がACKパケットと言います。

  • クライアントからの接続要求に対して、サーバーがACKパケットを送信することで、接続可能であることを伝えます。

  • サーバーはACKパケットを送信するのと同時にクライアントに対して接続を要求するためにSYNパケットを送信する。

  • サーバーに対しての確認応答(ACK)
    サーバーからの接続要求に対してクライアントはACKパケットを送信。
    このようにお互いにSYNパケットを送りACKパケットで応答することで、双方向で通信可能なことを確認し、コネクションの確立が完了する。

  • コネクションの確立によりクライアントとサーバーがお互いに通信可能であると確認した上でデータのやり取りが開始される。

HTTP/2のやりとり

  • HTTPは、HTTP/0.9, HTTP/1.0, HTTP/1.1, HTTP/2, HTTP/3 といった具合に機能追加と改良が重ねられてきました。最初に登場したHTTPにはバージョン番号はありませんでしたが、以降のバージョンと区別するために、後にHTTP/0.9と呼ばれるようになり、現在はHTTP/2が最も多く使われている。

HTTPキープアライブ

  • HTTPリクエストやHTTPレスポンスといったデータのやり取りはTCPを利用して、行われていますが、HTTP/1.0以前はWebブラウザからHTTPリクエストを送信するたびにTCPにおけるコネクションを確立し、WebサーバーがHTTPレスポンスとしてデータを引き渡した段階でコネクションを閉じるという方式が用いられていました。
  • そのため、画像が埋め込まれていた場合、一度コネクションを確立し、Webページを受け取った後にコネクションを閉じ、画像を取得するために再度コネクションを確立する必要がありました。
  • 1つのWebページ内に多数の画像が埋め込まれるといった使い方が普及すると、HTTPリクエストごとにコネクションを確立していたので、効率が悪く、無駄な通信が発生しています。
  • そこで、HTTP/1.1以降では、コネクションを継続して、利用する方式になりました。
    上記の機能をHTTPキーアライブと言います。

HTTPパイプライン

  • HTTPにおけるデータのやり取りの効率化のために、HTTP/1.1では、HTTPパイプラインと呼ばれる呼ばれる機能がサポートされている。
  • HTTPでは通常一つのHTTPリクエストを送信し、それに対するHTTPレスポンスを受け取るまでは次のHTTPリクエストを送信することができませんが、HTTPパイプラインはHTTPレスポンスを待つことなく複数のHTTPリクエストを送信することができる

HTTPS

  • インターネットの普及に伴い、Webサイトを通じてショッピングやバイキング、チケット予約などのサービスが利用できるようになる。
  • その際にクレジットカード番号が盗聴されたり、注文内容が改ざんされたり、「なりすましサイト」によって個人情報が盗まれたりする危険性がある状況で安心して利用することができない。
  • こういったことから、大切なデータを守る仕組みが「HTTPS」です
  • HTTPSとはHTTP over SSL/TLSの略で、HTTPの通信において、暗号化方式である、SSL(Secure Sockets Layer)やTLS(Transport Layer Security)を利用することでWebサイトを安全に使うことができます。

安全性の保護

  • 盗聴防止(暗号化)
    - Webサイトを閲覧する際に実際にはいくつものサーバーを経由するため、第三者が通信内容を傍受することは比較的簡単です。
    • 万が一傍受されても内容を解読しないためにデータを暗号化にしてくることにより、第三者からの盗聴を防ぐ
  • 改ざん防止
    • ネットバイキングにおいて、振込先情報が書き換えられてしまうといったデータの改ざん対策として、「メールダイジェスト」が送られる。
    • 「メールダイジェスト」とは、あるデータから一意の短いデータ(ハッシュ値)を取り出す計算のことです。データの送受信時にハッシュ値を比較して改ざんを検知する。
  • なりすまし防止
    • Webサーバーに「SSLサーバー証明書」と呼ばれる「電子説明書」を配置しておき、接続時に検証することにより、Webサイトを運営する会社の身元を確認できる。

Cookie(クッキー)

  • HTTPはステートレスなプロトコルであるため、WebブラウザとWebサーバーの一連のやり取りにおいて、状態を保持し、管理する仕組みがない。
  • 死のためショッピングサイトなどで状態を保持し管理する必要がある場合にはCookieと呼ばれるデータが用いられる。

Cookieのやりとり

  • Webサーバーへ接続してきたWebブラウザに対して、コンテンツなどと一緒にWebブラウザに保存してもらいたい情報をCookieとして送る。
  • 例えばショッピングサイトであれば、接続したいWebブラウザを識別するための情報をCookieとして送る。Cookieを受け取ったWebブラウザはそれを保存しておき、次にWebサーバーに接続する際に保存しておいたCookieを送信することでm Webサーバーは接続してきた相手を識別することができる。

メッセージヘッダーの利用

  • Cookieの送信にはメッセージヘッダーが利用される。
  • WebサーバーはHTTPレスポンスに「Set-Cookie」ヘッダーを含めることでCookieを送信でき、WebブラウザはHTTPリクエストに「Cookie」ヘッダーを含めることで送信できる

セッションCookie

  • 有効期限が設定されていないCookieは、Webブラウザが閉じると同時に削除される。このようなCookieをセッションCookieと呼ぶ。一方、期限が設定されたCookieはWebブラウザを閉じても削除されず、有効期限が車でWebブラウザに残る。
  • CookieはWebブラウザの識別にも利用されるため、盗まれると他人になりすまされることがある。
    そのため、ショッピングサイトなどでは、セッションCookieがよく利用される。

セッション

WebブラウザとWebサーバーのやりとりにおいて、一連の関連性のある処理の流れを「セッション」と呼ぶ
例えば、ショッピングサイトで商品を買う場合の「商品を選ぶ」→「商品をカゴに入れる」→「商品を購入する」といった処理の流れがセッションという

セッション管理

  • Webサーバーへのアクセスは1台のWebブラウザだけではなく、多数のWebブラウザから行われる。そのため、あるWebブラウザからの処理を関連性のある一連の処理(セッション)として扱いたい場合はCookieを用いてセッションを管理できる
  • セッション管理に置いてWebブラウザを識別するための情報を「セッション🆔」と呼ぶ
  • セッション🆔はWebサーバーで生成され、Cookieを含めてWebブラウザに送信される。
  • Webサーバーからセッション🆔を受け取ったWebブラウザは次回以降、Cookieにセッション🆔ウィ含めてから処理を行うことで、Webサーバーとのセッションを維持できる。
  • セッション内でやりとりされた「何の商品を買い物かごに入れたか」などの処理は、セッション🆔を用いて、Webサーバーに保存されている自身のセッションデータで参照できる

Discussion