【PHP初心者向け】セッションは「駅のコインロッカー」だ!Cookieとの決定的な違いとIDの正体

セッション webシステム

クッキーはブラウザで管理するけれど、セッションはサーバで

前回の以下の記事で、Cookie(クッキー)について解説しました。

あれは「ユーザーの背中に張り紙をする」技術でした。

しかし、ここには致命的な弱点があります。張り紙は誰でも読めるし、その気になれば書き換えられるということです。

もしあなたが、銀行の残高やパスワードをCookieに保存したらどうなるか。

背中に「暗証番号は1234」と書いて渋谷のスクランブル交差点を歩くようなものです。自殺行為です。

そこで登場するのが「セッション(Session)」です。

これは、大事な荷物をユーザーに持たせず、サーバー側の「コインロッカー」に預ける仕組みです。


仕組み:あなたは「鍵」を持つだけ

セッションの仕組みは、駅のコインロッカーや、荷物預かり所と全く同じです。

  • 預ける
    あなたがサーバーに重要なデータ(ログイン情報など)を渡す。
  • 保管
    サーバーはそれを自分の倉庫(メモリやファイル)に厳重に保管する。
  • 鍵を渡す
    サーバーはあなたに「引換券(セッションID)」だけを渡す。

ここが重要です。あなた(ブラウザ)が受け取るのは、意味のない乱数の文字列だけです。

「a7f3…」のような、ただの記号です。これ自体には何の意味もありません。

次にアクセスする時、あなたは「引換券」だけを見せる。

するとサーバーは引換券の番号を見て、倉庫からあなたのデータを取り出します。

これならひとまず安心です。

もし誰かに引換券を見られても、ただちにあなたの個人情報は漏れません。データ本体はサーバーという要塞の中にあるからです。

もし誰かに引換券(セッションID)が知られてしまった、またその可能性があると思ったら、一刻も早く「ログアウト」ボタンを押しましょう。

これで、漏れてしまった自分の引換券(セッションID)は何の役割も持たなくなります。

あなたの借りているコインロッカーのカギ穴が、新しいものに交換されるようなものです。


セッションID:世界に一つの引換券

この「引換券」のことを、専門用語で「セッションID」と呼びます。

実はこのセッションIDの受け渡しに、前回解説したCookieが使われています。

Cookieという封筒の中に、データそのものではなく「ロッカーの鍵」だけを入れてやり取りしているのです。

  • Cookie単体
    封筒の中に「現金」が入っている(これだと危険)
  • CookieとSession
    封筒の中に「ロッカーの鍵」が入っている。現金はロッカーの中に入っている(これなら安全さが上)

この違いをイメージとして持つのがオススメです。


PHPでの使い方:session_startの儀式

PHPでセッションを使うには、必ず最初にやらなければならない儀式があります。

session_start() です。

session_start(); // ロッカーの使用開始を宣言

// データを預ける
$_SESSION["login_user"] = "田中";Code language: PHP (php)

session_start() を書いた瞬間、PHPは自動的に以下の仕事をします。

  • ユーザーが「鍵(セッションID)」を持っているか確認する。
  • 持っていなければ、新品の鍵を発行してCookieに保存させる。
  • 持っていれば、サーバー上のロッカーを開けて中身を取り出す。

これらを全部自動でやってくれます。

開発者は、$_SESSION という箱にデータを入れるだけ。あとはPHPが勝手にサーバー側に保存してくれます。

取り出す時も簡単です。以下のソースコードは、別ページのPHPとお考え下さい。

session_start(); // 各PHPファイルごとに書くようにする

echo $_SESSION["login_user"]; // 結果:田中Code language: PHP (php)

ページを移動してもデータは消えません。サーバー側のロッカーに入っているからです。

session_start()の注意点

session_start関数を呼ぶときには、HTMLタグや空白、改行などを出力する前(ファイルの本当に一番最初) に書かないとエラーになる、という点に注意です。

そのため、慣れないうちはPHPファイルの最初の行に書いてしまうのが無難でしょう。


Cookieとの使い分け:貴重品はロッカーへ

「全部セッションにすればいいじゃないか」

そう思うかもしれません。

しかしセッションはサーバーのメモリやディスクを消費します。何万人もの客が全員ロッカーを使ったら、サーバーがパンクします。

使い分けの基準は基本的に「重要度」です。

  • Cookie(手荷物)
    「メニューの開閉状態」や「既読フラグ」など、わりとどうでもいい情報。消えても困らないもの。盗まれても被害が少ないもの。
  • Session(ロッカー)
    「ログイン中のユーザーID」「カートの中身」「決済情報」。絶対に漏洩してはいけないもの。データ量が多いもの。

リスク:鍵を盗まれたら終わり

セッションは比較的安全ですが、無敵ではありません。「セッションハイジャック」という攻撃手法があります。

これはロッカーを壊すのではなく、あなたの手から「鍵(セッションID)」を盗み取る手口です。
カフェのフリーWi-Fiなどで通信を盗聴され、セッションIDをコピーされたらやばいです。

攻撃者は手に入れたあなたの鍵を使って堂々とロッカーを開け、あなたになりすましてログインします。

これを防ぐには、通信を必ず暗号化(HTTPS化)するのが大事です。鍵の受け渡しを、透明なパイプではなく黒塗りの土管の中で行うイメージです。


まとめ:サーバーを信じろ、自分を信じるな

  • Cookie
    ユーザーに持たせるメモ。改ざんされるし盗み見られる。
  • Session
    サーバーに預けるロッカー。ユーザーは鍵を持つだけ。

Webアプリケーションを作る際、ユーザー(ブラウザ)側にあるデータは一切信用してはいけません。

重要なデータはすべてサーバー側のセッションに隠す。これが鉄則です。

あなたのサイトのユーザーを、丸裸で歩かせることのないようにしましょう。

ちゃんとロッカーを用意してあげるのが、管理人の務めです。

コメント

タイトルとURLをコピーしました