はじめに
今回はクッキーとセッションについて勉強しましたので、アウトプットしていきたいと思います
HTTPはステートレス
HTTPはステートレスなプロトコルです。 ステートレスとは、「状態を保持しない」という意味になります。「状態が保持できない」とは、リクエストする度に、どんなリクエストをしたのかという情報を保持することができない。
毎回リクエストする度に、前回どんなリクエストをしたのか全く覚えてません。
ステートレスに対して「状態を保持」のことを、ステートフルという。
HTTPの弱点
さて、ここで困ることが起きます。 皆さんがよく利用するWEBサイトである会員のログインなどです。
1度ログインしたはよいものの、次のリクエスト(例えばページを変えるなど)のタイミングではログインしたという状態を保持することができないため、ログイン状態を維持することができないということになります。
そのため、「ログインしているかどうか」の状態をチェックをする必要があります。
例えば状態を保持するために、以下のようにurlのパラメータへ、loginができているかの情報を持たせるという方法があげられます。
しかし、上記の問題として、login=OKというパラメータを手で容易に変更、改ざんすることができてしまうという問題があります。
これにより、システムとしては意図しない方法で挙動を操作されてしまう危険性があります。
システムとして意図しない操作により情報が操作されることで、
例えば、不正なログインでの商品購入や、個人情報の流出などの問題が発生するリスクがあります。
このような危険性を回避する解決策となるのが、CookieとSession
Cookie
Webサーバーが発行し、ブラウザで保持されるテキストデータのことです。以下はhttpヘッダーの中身です。 httpヘッダーはクライアント(ブラウザ)とサーバー側が情報をやり取りする際に渡している追加情報です。この追加情報の中にCookieのやり取りも含まれます。
何をしてくれているのか
Cookieをユーザーのブラウザに保存することにより、次回同一サイトを訪れた際、前回の続きのページを表示するような、いわゆる、Webサイトとユーザー間の「会員証」のような働きをしてくれています。
Cookieの流れ
- ブラウザにアクセスしたタイミングで、WebサーバーからCookieが発行され、ブラウザに渡される。
- ブラウザはCookieを保存する。
- 次回以降ブラウザは、CookieとともにWebサーバーへアクセスする。
- WebサーバーはCookieの内容に合わせて、必要な情報を踏まえたページを表示する。
① ページのリクエスト
② リクエストされたページを返す
③ ②のレスポンスの際に、cookieも一緒に渡す
④ Cookieと一緒にページをリクエストする
⑤ Cookieを見て、前回来てくれたユーザーであることを判断する
⑥ Cookieを元に、そのユーザーに適したページを返す
一方で、Cookieにも弱点はあります。 それは、Cookieはクライアント側に依存するため、パラメータと同様にデータを改ざんすることができてしまうのです。
そこでSessionが登場します。
Session
一連の処理の始まりから終わりまでを表す概念のことで、ここではクライアントとサーバーの通信状態のことを指します。Sessionは、Webサーバーで保持されるデータになります。
Cookieは、ブラウザで保持されるデータ
Sessionは、Webサーバーで保持されるデータ
① emailとpasswordを持たせてログインのリクエストをする
② emailとpassword情報を元にSession IDを発行し、Session IDをCookieに保持させた上で、ログイン後画面を表示させる
③ Session IDを元に、ページのリクエストをする
④ Session IDを元に、リクエストしているユーザーが誰かを特定する
⑤ 該当するユーザーに合致する情報を返す(Aさん用の画面を表示させる)
SessionにはIDを割り振ることで管理することができます。保持されたSessionが必要な場合はIDを指定することで取り出すことが可能です。
例として、ネットショッピングについて挙げてみます。
ネットショッピングにログインし、商品をカートに入れ、購入までを一連の処理(Session)として扱いたいですが、
冒頭で説明した通り、HTTPはステートレスのため、一連の処理(セッション)として扱えません。
そこで、先程説明したCookieを利用して、一連の処理(セッション)として扱います。
Cookieに一意の値(Key)を入れ、リクエストするときにCookieにある値(Key)も一緒に送ることで、同一人物であることが識別可能になり、一連の処理として扱うことができるようになる。
しかし、Cookieに保持するデータは改ざん可能なため、CookieにSessionのIDを格納することで、より安全に一連の処理を行うことが可能。
#参考記事
この一冊で全部わかるWeb技術の基本(書籍)