sessionとcookieの違いについて整理しよう

# この記事の作成理由
この記事を書こうと思ったきっかけは、「セッションとクッキーの違いってなに？」という質問をされて上手く答えられなかったので、自分で調べたものをメモとして残そうと思いました。

# そもそもクッキーはなぜ必要なの？？
まず、そもそもなぜクッキーが必要なのかについて書いていきます。
結論を言うと、ブラウザとサーバー間の通信は状態を持たない通信 **「HTTPステートレス」** だからです。

### HTTPステートレス通信
簡単に、HTTPステートレスについて説明します。

太郎君　「ネットで買い物をしよう！鍋を作りたいからまず必要なネギをカートに入れよう」
サーバー「太郎君、初めまして！カートにネギを入れたよ！」
太郎君　「よし、カートにネギが入ってるね」

![スクリーンショット 2022-08-13 8.18.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/979980/68b4d418-070f-7207-d31a-6b4e62c9cfbf.png)

太郎君　「次は、お肉もカートに入れてっと」
サーバー「太郎君、初めまして！カートにお肉を入れたよ！」
太郎君　「あれ？？さっき入れたネギが入ってなくて、お肉だけになってる！！」

![スクリーンショット 2022-08-13 8.24.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/979980/1da425f8-631c-8842-9e95-a5dadfec4005.png)

このように、同じブラウザ（太郎君）でリクエストを行ってもサーバーでは同一人物と認識できず、毎回初めまして！の状態になることを、「HTTPステートレス」といいます。

ただ、ショッピングカートがこのような状態だと不便なので対策が必要ですね。
なので、情報を保持してあげる必要があります。その時に、よく出てくる単語が __「セッション」__ や __「クッキー」__ という言葉です。

# セッションについて
まずは、「セッション」について説明します。

下記はセッションについての説明です。

https://www.ntt.com/bizon/glossary/j-s/session.html
>コンピューターネットワークにおけるセッションとは、通信の開始から終了までを指します。クライアントとサーバーで通信を行う場合であれば、クライアントからサーバーへ接続した時点でセッションが始まり、サーバーから切断するとセッションが終了します

つまり、最初のショッピングカートの例で言うと太郎君とサーバーでの１回のやり取りを1つのセッションということができます。

ここで、あれ？セッションってブラウザ（セッションID）とサーバー側に保存されるやつじゃないの？？と思った方は後ほど説明しますので、少々お待ちください。


# クッキーについて
次に、クッキーについて説明します。

Wekipedia上では下記の説明がされています。

https://ja.wikipedia.org/wiki/HTTP_cookie
>HTTPにおけるウェブサーバとウェブブラウザ間で状態を管理する通信プロトコル、またそこで用いられるウェブブラウザに保存された情報のことを指す。ユーザ識別やセッション管理を実現する目的などに利用される

つまり、ショッピングカートでネギを入れた人（１回目の太郎君）と肉を入れた人（２回目の太郎君）を同じ人だと識別するためにはクッキーが必要になるということですね。

#### クッキーの仕組み
クッキーのざっくりとした仕組みを説明します。

①まず太郎君がログインIDとパスワードをサーバーに投げます。するとサーバー側で、ログインが成功した場合は太郎君であることを証明するためのクッキーを渡します。

![スクリーンショット 2022-08-15 22.06.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/979980/38b93f1b-248a-364e-2ded-8130eeef2564.png)

②太郎君がもう一度先ほどのサイトを訪れました。
　今回は２回目の訪問なので、先程①で発行されたクッキーをサイトに渡します。
　するとサーバー側は、このサイト訪問者が①の時と同じ人物（太郎君）だと認識ができます。
![スクリーンショット 2022-08-15 22.09.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/979980/5bb4b5b9-8650-c911-a283-5a155ad8ebdb.png)


このように、クッキーを使うことでHTTPステートレスという状態を持たない通信においても同一人物が否かを判断できるなどの情報の保持を行うことができます。


#### クッキーの種類について

|               |session cookie    　　　　　　　　　　　 |persistent cookie  　　　　　　　　　　　　　 |
|---------------|-------------------------------------|------------------------------------------|
|よく使われる名称　|セッション           　　　　　　　　　　　|クッキー            　　　　　　　　　　　　　 |
|利用期間　　　　　|一時的なクッキー（session ≒ 特的の期間） 　|ずっと使えるクッキー（persistent ≒ 持続する）  |
|具体例　　　　　　|ブラウザを閉じると消えるクッキー 　　　　　　|ブラウザを閉じても消えないクッキー  　　　　　　　|
|保存場所　　　　　|ブラウザとwebサーバ 　　　　　　　　　     |ブラウザのみ  　　　　　　　　　　　　　　　　　　|
|有効期間　　　　　|設定しない 　　　　　　　　　　　　　　　　　|設定できる  　　　　　　　　　　　　　　　　　　  |　　　


:::note info
cookieの種類の中にセッションという名称でよく使われているsession cookieが存在している
:::

では、cookieの種類がどのような働きをしているのか説明します。


## session cookie（通称：セッション）
まず、ユーザーがログイン情報等を入れて、サーバーに情報を送ると、サーバーからランダムなID（セッションID）が発行されます。ユーザー側にはセッションIDが渡され、データストアには実際の値（ユーザーIDなど）が保存されます。サーバー側はセッションIDを受け取ることで、ユーザーの特定を行うことができます。また、セッションIDを使用することで、機密情報をサーバーに送ることなくユーザー特定が可能になります。

![スクリーンショット 2022-08-16 22.19.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/979980/665bb406-ef45-313d-76d2-fd804dd55e6e.png)


「クッキーの表について」の表に記載しましたが、このクッキーはブラウザを閉じると消えるクッキーとなります。ですので、ブラウザを閉じて、もう一度このサイトに訪れるとクッキー状態は以下のように消えてしまい、セッションIDによるユーザー特定ができなくなります。
![スクリーンショット 2022-08-19 7.13.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/979980/c399d874-dea4-9fb0-61af-324cd5f3163d.png)

## persistent cookie（通称：クッキー）

こちらはデータを直接cookieに保存する方法です。

![スクリーンショット 2022-08-19 7.26.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/979980/199cb7ad-ae82-c357-58da-5d8b176c7274.png)

ユーザーがログインとパスワードをサーバーに送り、cookieが発行されます。
先程との違いは、ユーザーIDや会員情報などのデータを直接cookieに入れているところです。
ただ、このままだと任意にユーザーが書き換え可能なので署名付きの暗号化を行います。
また、このcookieはpersistent（持続する）cookieなので、ブラウザを閉じても消えずに、再びサイトを訪れた際にも情報が保持されています。



# まとめ

sessionとcookieについて混乱する原因の一つとして、通信の開始から終了までをセッションと呼んでいますが、session cookieの通称もセッションと呼んでいるため、この「セッション」という言葉がどちらを指しているのか分からなくなり、混乱を生み出しているのではないかと思いました。

session cookieのデータストアでの種類などもあったのでこれはまた別の機会に勉強してみます。

# 参考にしたサイト

[セッションとクッキーの謎：違いを説明できるようになる動画](https://www.youtube.com/watch?v=EgUgmYLuLYE&t=557s)

[HTTP解説 その6 セッションとクッキーの仕組み (ざっくり解説)](https://youtu.be/htHxvL-Gxks)

[HTTP解説 その7 クッキーの詳細説明](https://youtu.be/QAjGRC4keUY)

[HTTP解説 その8 セッションの詳細説明](https://youtu.be/uZ6H_bBiv0k)