cookie(クッキー)とsession(セッション)の違い・使い分け

セッションとクッキーの違い

大きな違いは
クライアント側(ブラウザ)かサーバー側か

使いわけは
cookieは気軽に使えるがブラウザ側にデータを保存すると改竄される可能性が当たり中身が見られたりする可能性がある。
sessionは大きなデータを保存できる、改竄されない、中身が見られないといった特徴がある。

...じゃあsesssionでもてばいいんじゃないかい?

そういうわけじゃないから両方使われている!


参考
セッション管理の周辺知識まとめ – PAYFORWARD
ステートフル ステートレスとはどういうことか - Sojiro’s Blog


◼︎まずはhttpについて
httpはステートレスなプロトコル。クライアントがサーバー側にリクエストを送りその結果を返す。その1往復で通信は切れる。状態は維持されない。これがhttpの通信の原則。

よくある例のハンバーガーショップの注文のやつで毎回「〜〜セットの〜〜バーガーの〜〜」みたいに全部言うやつ。

しかし、情報を維持したい時がある。買い物かごとか。
これはステートフルなhttp通信をしているように見せかけるように実装することで実現できる。
方法は2つあり、クッキーを利用する用法とセッションを利用する方法である。

◼︎クッキー

httpヘッダーに格納できる小さなテキストファイルであり、クライアントのブラウザに保存される。

<流れ>
クライアント側がサーバーにリクエストを送る。(クッキーなし)
サーバー側はリクエストにクッキーがないことを確認したら、ユーザー情報などを書き込んだクッキーをレスポンスに乗せて返す
クライアント側が保存。
クライアント側が2回めのリクエスト時に、ヘッダーにクッキーを格納してリクエスト。
サーバー側は受け取ったクッキーでユーザー判別して、以前の通信を関連付ける。

→しかし、クライアント側でクッキーが改竄される可能性もあり、これだけではセキュリティの高いステートフルな通信は好ましくない

◼︎セッション

システムにログインしてからログアウトするまでの一連の操作をセッション。その操作の中のそれぞれの状態をセッション状態。
セッションを利用して複数のhttp通信を1つのまとまりとして扱うことをセッション管理。
サーバー側でセッションID(あるセッションと紐付いたキー)とセッションを保存している。
クライアント側にはセッションIDだけなんらかの方法で送信する。(クッキーを利用、URLのクエリストリングに渡す方法,hidden属性に渡す方法)。セキュリティの観点からクッキーを使うことが多い。

クライアント側はセッションIDをクッキーに乗せて送ることで、以前の通信を記録しているセッション情報を取り出すことができる。

◼︎スケールアップとスケールアウト

スケールアップ・・・既存のサーバの機能を強化してパフォーマンス上げること。
スケールアウト・・・サーバ台数増やしてサーバー群のパフォーマンスをあげること。

◼︎ステートフルとステートレス

ステートフル・・・サーバー側がクライアントのセッション情報を保持している。
ステートレス・・・保持していない。

ステートフルはやりとりが簡潔になるが、クライアントの状態を常に把握するためクライアント数が増えると負荷が大きくなる。
サーバーを複数台置くときは同期させないといけないのでスケールアウトには向いていない。

ステートレスはやりとりが冗長になるが、状態に依存しないので良いこともある(ざっくりしかわからん)

◼︎まとめ

クッキーとセッションはべつものではなく、一緒に使われることでセキュリティが高いステートフルな通信を実現しているということでした。べつものと考えていたから混乱していた。あとは実装することでしっくりくると思われる。

◼︎ブラウザで試すことができるすごい簡単な例
最初にsetして、2回目はsetをコメントアウトしてechoで呼んでみる例。

<?php

//Cookie=======
//他のファイルからも取得できる

//cookieをセット
setcookie("username", "taguchi", time()+60*60/*現在時間から1時間後まで*/);
//cookieを削除
//setcookie("username", "taguchi", time()+60*60/*現在時間から1時間後まで*/);

//初回にセットすれば2回目からはechoでtaguchiが表示される
//echo $_COOKIE['username'];
//========


//Session======
//セッションを使うときはsession_start();を呼ぶ

session_start();

$_SESSION['username'] = "taguchi";
//session削除
//unset($_SESSION['username']);

//echo $_SESSION['username'];
//==========
?>