こんにちは!
今回はクッキーとセッションの違いについて、アウトプットしていきたいと思います。
HTTP通信はステートレスなプロトコルらしい。
ステートレスとは状態がないを意味しています。
HTTPプロトコルではリクエストを送り、レスポンスを受け取った時点でその通信は終了してしまうんです。
つまり、一度目の通信でクライアントからいくつかの情報を受け取ったとしても、2度目の通信は前の状態は引き継ぎがない全く関係のない通信になるんです。
僕、前職でアパレル販売員やってました。
当時の僕は記憶力に乏しく(⚠︎今もです。)、
一度接客したお客さんが再来店された際に全くその情報を覚えていないというポンコツっぷりを発揮していました。
僕が覚えていないということは、
お客様側から僕に情報を再びお教えいただかなければいけません。
客「トップスのサイズは普段はMでズボンのウェストは28インチ、足のサイズは27.5で〜〜(これ全部前回来店した時お前にいうたやんけ!!!なんでもう一度言わなあかんねん!!!)」
顧客ファーストに考えられないとかマジありえん‥。
僕も常にステートレスな状態と言えるでしょう。
しかし、実際はHTTP通信がステートフルな通信がされいるかの如く、僕もお客様情報を覚えていられる方法があるんですよ!!
cookieとsessionとは
cookie
cookieとはHTTPヘッダーに格納できるテキストデータで、このデータはクライアントのブラウザに保存されます。
cookieを利用しブラウザに値を格納することで、HTTPプロトコルの値を保持できない問題を解決できますね!
でもこれってめっちゃ危険な状態なんです。
重要な機密性の高い情報をクッキーに保存すれば、サーバーと通信するたびにそれらをHTTPヘッダーに設定することになります。
また、クライアント側で保持できることで改ざんの可能性も出てきますよね。
よってクッキーだけでステートフルな通信を作ることはセキュリテイ上あんまり好ましくないですよね。
ポンコツアパレル販売員の僕で例えてみましょう。
なかなか顧客情報が覚えられない僕はこう考えました。
「そうや!お薬手帳みたいに顧客手帳(クッキー)を作成して、来店時に顧客情報を俺が書き込むんや!それを顧客一人一人に
持っておいてもらって再来店時に俺に渡してくれたらええんや!!顧客手帳を来店時にいただくことでその人の情報を取得することができる!!」
いざこの方法を試してみるとある顧客様が再来店時に顧客手帳の情報を書き換えられていました。
「おい!50000円のズボンを購入したって顧客手帳に書いてあるのに袋開けたら入ってへんやんけ!!」
これは大変です!顧客手帳(クッキー)をお客さん側が保持することでデータを改竄されてしまいました。
(本当はレシートとかで調べようあるんやけどね。)
余談ですけど、まじでまじでこんなことやっちゃ販売員としてだけじゃなく人として失格ですよ。
お客さんへの愛情が感じられないですし、顧客情報はお店が管理するものです。
因みに僕は本当に覚えられないことが悔しかったので、当時来店された際にメモ取るようにしていました。
session
クッキーはHTTPヘッダーに書くのできるテキストデータで、これはクライアントのブラウザに保存されるものでした。
セッションはクライアントとサーバの通信の状態を保持することができます。
セッションを利用して様々なHTTP通信一つのまとまりとして扱うことをセッション管理と言います。
じゃあクッキーとの違いはなんでしょうか?
それはセッションはクライアントのブラウザではなくサーバー側に保存されるということです。
サーバーではあるセッションと紐付いたキーであるセッションIDを保存しておいて、
セッションIDのみをクライアントに渡します。
セッションIDをクライアントに渡す手段として一般的にクッキーを利用します。
セッションIDを受け取ったクライアントはクッキー経由でサーバーに渡すことで,
以前の通信の状態を保持したセッションを取り出すことができるんです!
これを再びポンコツで例えてみましょう。
来店されたお客様にID付きのポイントカードを作成してもらいます。
顧客情報ファイルをお店で保管し、顧客一人一人の情報をポイントカードのIDとともに管理。
再来店された顧客はポイントカードをポンコツに渡すだけでいいんです。
ポイントカードをお預かりしたポンコツは顧客情報に紐付けられたIDから
情報を引っ張ってくることができるので、セキュリティ面の観点から
セッションで顧客情報を管理する方がいいのではとポンコツは気付きました!!
まとめ
HTTP通信はステートレスなプロトコルです。
クライアントの一度のリクエストからレスポンスを返すと通信が終了してしまいます。
そこでHTTPヘッダーに格納できるデータであるクッキーを利用して、セッションIDをクライアント側に送信します。
セッションIDを受け取ったクライアントはクッキー経由でサーバーに渡すことで以前の通信の状態を保持したセッションを取り出すことができる!!