HTTPによる通信とCookie
HTTPは、クライアント(ブラウザなど)とサーバー間で通信を行います。
クライアントはテキストや画像が欲しいときにリクエストメッセージをサーバーに向かって投げ、これを受け取ったサーバーはクライアントに向けてレスポンスメッセージを返します。
リクエストメッセージには、GETやPOSTといったHTTPメソッドや、プロトコルバージョン、リクエストヘッダーフィールドなどが含まれています。そして、レスポンスメッセージには、プロトコルバージョンやレスポンスヘッダーフィールド、HTML文章などの転送されるデータが入っているメッセージボディなどが含まれています。
HTTPの通信方法
HTTP初期のバージョンでは、通信を行なう度にTCPによる接続と切断を繰り返していました。
つまり、データの送受信の際には、次のようにHTTPリクエスト/レスポンスを間に挟んでTCPコネクションの接続・切断を毎回行っていました。
- HTML文章を取得するため、TCPコネクションを接続
- HTTPリクエスト
- HTTPレスポンス
- TCPコネクションの切断
- 画像を取得するため、TCPコネクションを接続
- HTTPリクエスト
- HTTPレスポンス
- TCPコネクションの切断
これは当時のデータ量が少ない通信では問題なかったようですが、今日では多くのテキストや画像の受け渡しを行なう場面も増えてきており、1つのリクエスト毎に接続と切断を行なうのは無駄が多く見られるようになってきました。
そのため、HTTP1.1と一部のHTTP1.0では持続的接続という方法が使われるようになりました。この方法では、クライアントかサーバーのどちらかが明示的に接続を切断するまでTCP接続を繋げたままにしておきます。
持続的接続では、接続と切断の処理を繰り返す必要がないので、サーバ側では処理の負荷が軽減され、クライアント側ではWebページの表示が高速化されるという利点があります。
この方法を使うことで、HTTP初期バージョンの通信は次のように改善されます。
- TCPコネクションの接続
- HTML文章を取得するためのHTTPリクエスト
- 画像を取得するためのHTTPリクエスト
- HTML文章を取得するためのHTTPレスポンス
- 画像を取得するためのHTTPレスポンス
- TCPコネクションの切断
TCPコネクションの接続・切断を繰り返す必要がないのはとても便利ですが、この通信を行なうにはサーバ側とクライアント側、どちらも持続的接続をサポートしている必要があります。
また、持続的接続は、複数のリクエストを並列して発行できるパイプライン化を可能にします。
パイプライン化によって、これまでHTTPリクエストを1つ送れば、そのレスポンスが返ってくるまで次のリクエストが送れなかったのが、続けてリクエストを送信することが出来るようになります。
- TCPコネクションの接続
- HTML文章を取得するためのHTTPリクエスト
- 画像を取得するためのHTTPリクエスト
- HTML文章を取得するためのHTTPレスポンス
- 画像を取得するためのHTTPレスポンス
- TCPコネクションの切断
毎回サーバーからのレスポンスを待つ必要が無くなり、並列してリクエストを送ることができるようになるので、ただ持続的接続を使うよりもリクエストの完了が速くなります。これは、リクエストの回数が多いものほど有効な方法となります。
HTTPとCookie
CookieはWebサイトの提供者がサイト訪問者のデータを一時的に保存しておく仕組みです。
HTTPには状態を保存する仕組みが無いため(ステートレス)に、以前サーバーとやり取りしたリクエストやレスポンスの結果を管理できません。これでは現在のWebサイトのようにサイト上でユーザーのログイン情報を保持しておくことができません。HTTPのこの部分を補うために、Cookieは作られました。
最初、Cookieを持っていない状態でのやり取りは次のように行われます。
二回目以降、クライアントはCookieを付けてサーバにリクエストを投げるので、その内容を記憶しているサーバーは以前の状態を踏まえた上でレスポンスを返すことができます。
Cookieには、1つのサーバが同じクライアントに向けて発行できるCookieの数が制限されてたり、それぞれのCookieに有効期限が設定されています。