PHPのセキュリティ実装

session は、ログイン状態など「ユーザーごとの状態」を管理するための仕組みで、
HTTP が本来「状態を持たない(ステートレス)」通信であることを補う役割を持つ。

セッション自体は「攻撃を防ぐ機能」ではないが、
ログイン状態・ユーザー識別・権限管理など、セキュリティ機能の土台として非常に重要な仕組みである。

セッションを使うことで、
フォームの「入力 → 確認 → 送信」や、
ECサイトの「カートに入れる → カート内容確認 → 注文画面へ」など、
ページ遷移をまたいでデータを保持する処理を実現できる。

サーバー側ではユーザーごとのデータをセッション保存領域に保持し、
それを識別するために セッションID を使う。


Cookie は、ブラウザ側に保存される小さなテキストデータで、
PHP のセッションでは「セッションIDをブラウザに覚えさせる」ために使われる。

流れとしては:

  1. サーバーがランダムな セッションID を生成する
  2. そのセッションIDを Cookie(例: PHPSESSID=xxxx)としてブラウザに送る
  3. ブラウザは以降のリクエストで、その Cookie を毎回サーバーに送信する
  4. サーバーは Cookie から受け取ったセッションIDを使って、
    セッション保存領域から該当ユーザーの セッションデータ(配列) を取り出す

PHP の通常のセッションでは、
ブラウザ側の Cookie には「セッションIDだけ」が保存され、
実際のユーザーデータはすべてサーバー側に保存される。

この意味で、Cookie は「セッションデータそのもの」を持つのではなく、
サーバー側のセッションデータへアクセスするための鍵🔑の役割を果たす。


CSRFトークン は、フォーム送信時などに一緒に送られるランダムな文字列で、
「そのリクエストが本当に自分のサイトの正規のフォームから送られたものか」を確認するために使われる。

典型的な流れ:

  1. フォームを表示するタイミングで、サーバーがランダムな CSRFトークン を生成する
  2. そのトークンを セッションに保存 し、同じ値をフォーム内の hidden フィールドなどに埋め込む
  3. ユーザーがフォームを送信すると、CSRFトークンも一緒に送信される
  4. サーバー側で
    • セッションに保存されているトークン
    • フォームから送られてきたトークン
      を比較し、一致すれば処理を実行し、不一致なら処理を中止する

この仕組みによって、
外部サイトからユーザーの Cookie(=ログイン中のセッション)を悪用して送られたリクエストであっても、
正しいCSRFトークンが付いていないため拒否できる。