【IT基本】Cookieとセッションって初めて聞いたけど、ざっくりと何なん？


# １．はじめに
はじめまして、未経験からエンジニア転職を目指しているごんです。

Web上ではECサイトや掲示板などユーザー情報を登録し、利用できるサービスが多くありますよね。これらは一度ログインさえしていれば他の関係ないWebサイトを閲覧したあとに、見に行ってみるとログインされている状態で閲覧できると思います。

例えば「昨日、楽天市場の買い物かごに欲しいもの入れたけど何が入ってたか確認したい！」と思い、楽天市場にアクセスするとログインされている状態で見れるはずです。

実はこれって**Cookie**と**セッション**という技術がなければ実現できないことで仮にこれらの技術がなかったとしたら、毎回ログイン画面から入力してログインして、買い物かごに入っていた商品も消えているので再度買い物かごに入れないといけなくなります。
これってめっちゃ面倒くさいですよね（汗）

このように非常に重要な役割を果たしており
**「Cookieとセッションはユーザーを識別するために欠かせない技術」**　と始めはざっくりと理解しておけばいいかなと思います。


# ２．前提知識　〜HTTP通信ってなんやたっけ？〜
HTTP通信は以下のイラストの通り、1回のリクエストに対してレスポンスがあり、この1往復で通信が完了します。
このためサーバーは **「前後のアクセスが関連したアクセスなのか」が分からず、以前の状態を覚えることができません。**
このようにHTTP通信は状態（state）を持たないため「**Stateless　Protocol（ステートレス・プロトコル）**」と呼ばれてます。
![http_protocol.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3117662/94575a8a-b78f-75e4-8895-b9a2bb3c70db.png)
以前の状態を覚えてないと、たくさんの不都合があります。
例えば、一度グルメサイトでお気に入りのお店を登録し、
「あのお店めっちゃ美味しかったから家族とも行きたいけど、日曜日空いてたかな？」
と思い、再度グルメサイトのお気に入りからお店を調べようとしてもお気に入りには登録されていません。
サーバーは、どのユーザーがどこのお店を登録したかいちいち覚えられないからです。

状態を保持しながらHTTP通信をするにはどうしたらいいでしょうか？
そこで考えられたのが<font color="red">**Cookie**</font>です。

次にCookieについて見ていきます。



# ３．Cookieって何なん？
サーバーが膨大な数のクライアントをそれぞれ認識するためにはどうしたらいいでしょうか？

考えられたのが、リクエストがあったユーザーに受付番号のような一意の値を渡し、２度目のリクエストの際に一緒に受付番号を渡すことによって、サーバー側で保存している受付番号によりどのユーザーかを識別できるようになり、各ユーザーの状態を覚えることができるという仕組みです。
最近では病院などでも受付の後に、受付番号を渡されるときもありますよね。

ではCookieとは何者なのでしょうか？
**Cookieは、<font color = red>クライアントのブラウザにテキスト情報を保存する仕組み及び保存された情報</font>のことを指します。**

上記でいうと、クライアント側で受付番号をCookieに保存することになりますね。

言葉だけではイメージしにくいですので、以下のイラストも併せてご覧ください。

![cookie_image (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3117662/64bb69c8-b322-562f-8fb2-2365a6a2ca62.png)

# ４．セッションって何なん？

Cookieについてざっくり理解したところで、セッションについて見ていきましょう。
**セッションとは、<font color = red>一連の処理の始まりから終わりまでを表す概念</font>のことを指します。**

「ん？　概念って言われてもあんまり良く分からんねんけど、、、」

ってなりませんか？　僕はなりました（笑）

具体例で見ていきましょう。
例えば、美味しいレストランで食事がしたいって思ったとき、
「グルメサイトにログイン→　お店を検索→　お気に入りに追加→　ネット予約→　ログアウト」
のようなユーザーによる一連の動作があります。
この一連の動作が**セッション**にあたります。

HTTP通信はステートレスのためセッションのような一連の動作を扱うことができませんでしたが、Cookieを利用することにより一連の動作として扱えるようになりました。
![session_image (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3117662/63d1c098-5fff-cc73-e6f8-8068bd5da311.png)

それではCookieを使ったセッション管理についておさらいして、終わりにしましょう。

【接続１回目】
ユーザーからの初回アクセス時、サーバーは**セッションファイル作成するとともにセッションIDを発行します。**
ユーザー情報が入ったセッションファイルをサーバー側で保存する一方、クライアント側では**セッションIDをCookieに保存します。**
これまで受付番号と例えていたものはセッションIDだったのですね。

【接続２回目以降】
クライアントは**Cookieに保存されたセッションIDを毎回サーバーに自動送信し**、サーバーでは受け取ったセッションIDに該当するセッションファイルがある場合には、セッションファイルに保存されたデータを基にユーザー認証やユーザーごとにブラウザの表示内容を切り替えます。

この仕組みによりHTTP通信というステートレスな通信方法でも、ユーザーごとに状態の保持ができるようになりました。

:::note warn
*Q. Cookieに直接ユーザー情報を保存してもセッション管理は行えるのでは？*

A. 可能ではあるが、Cookieの欠点が２点あるため現実的ではない。
　⇒１つ目は、Cookieに保存される情報は暗号化されておらず、第三者に漏れたり、簡単に改ざんすることができるため。
　　２つ目は、Cookieに保存できるデータ容量が多くなく限りがあるため。
:::

# ５．終わりに
Cookieとセッションについて理解しているつもりでしたが、言語化するとなるととても難しかったです(^_^;)
その反面、理解も深まったので定期的にアウトプットしていく必要があるなと思いました。

なんとなく知ってるけど、
「今からこの用語・技術について説明してくれる？」
って言われると難しいものなどこれから記事としてまとめて整理していきたいと思います。

最後までご覧いただきありがとうございました！

# ６．参考文献
- [Qiita - 【PHP超入門】Cookieとセッションについて　](https://qiita.com/7968/items/ce03feb17c8eaa6e4672#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB) by @7968さん
- [ プロになるためのWeb技術入門 ](https://amzn.asia/d/6IZxyez)