Cookie: ステートレスな HTTP でセッションを実現する仕組み
Web アプリケーションでは、ユーザーの操作によってたくさんの HTTP リクエストが発生します。 これらのリクエストは前後で関連性を持っていますが、HTTP はその関連性を保持できません。 これは、HTTPがステートレスなプロトコルであるためです。
このレクチャーでは、ステートレスな HTTP 通信でユーザーの状態を維持する方法について説明します。 Cookie を利用したセッション管理の基本的な概念と、それを実現するための具体的な技術について解説します。
目次
前提:HTTP はステートレスなプロトコル
Web アプリケーションの要素技術である HTTP は、ステートレスなプロトコルです。 ステートレスとは、サーバーが前後のリクエストを記憶していないことを意味します。
ステートレスなプロトコルのままでは、便利なアプリケーションを作れません。 例えばショッピングサイトでは、ユーザーがカートに商品を追加したり削除したりするたびに、カートの状態を保持する必要があります。 しかし、ステートレスな HTTP ではそのような状態を保持できません。 このような問題を解決するために、HTTP では Cookie を使い状態を管理します。
Cookie を使った HTTP でのセッション管理
セッションとは、同一のクライアントからの複数回のリクエストのことです。 セッションを実現するためには、サーバーがクライアントを識別できる必要があります。 「このクライアントは以前に『あの』リクエストをしてきたクライアントだ」ということをサーバーが判断できなければいけないということです。
セッションを実現するために、HTTP では Cookie を用います。 Cookie は、サーバーがクライアントに一時的な情報を保存するため手法です。 これにより、サーバーは各リクエストを特定のクライアントと関連付けることができます。
Cookie を使ってセッションIDを共有する方法
Cookie を使ったセッションIDのやりとりについて、HTTP リクエストとレスポンスの例を見てみましょう。
- セッション開始時に、サーバーはレスポンスヘッダーの
Set-Cookie
を使用して、クライアントにセッションIDを送ります - そのレスポンスを受け取ったクライアントは、Cookie を保存します
- クライアントはリクエストの度に、リクエストヘッダーの
Cookie
にセッションIDをセットしてサーバーに送り返します - サーバーは、リクエストヘッダーの Cookie からセッションIDを取得し、リクエストを特定のセッションに紐づけます。
このように、レスポンスヘッダーの Set-Cookie
とリクエストヘッダーの Cookie
を使って、サーバーとクライアントはセッションIDをやり取りします。
まとめ
このレクチャーでは、HTTP でステートフルな挙動を実現するための技術である Cookie について学びました。
- HTTP はステートレスなプロトコルであり、前後のリクエストの関連性を記憶できない
- ステートレスなHTTPでは、Cookie を使ってリクエストをまたいだ状態管理が実現できる
- サーバーは、レスポンスヘッダー
Set-Cookie
を使ってクライアントに Cookie を渡す - クライアントは、リクエストヘッダー
Cookie
に Cookie をセットしサーバーに渡す