質問: セッションの挙動について教えて下さい。 `session_start();`でセッションを開始した時に、 クライアント側のクッキー(デフォだと$_COOKIE['PHPSESSID'])がなければセッションIDを与え、 サーバーには同セッションIDのセッションファイルが作成されると思います。 その後、`session_regenerate_id(true);`でセッションIDを振り直すと、 クライアント側にセッションIDは残ったままになりますが、 サーバーのセッションファイルは削除されます。 ・・・ここまでまず、あっているでしょうか? 次に、`session_id();`で(セッションがある場合)現在のセッションIDを取得できますが、 現在のセッションというのは何を参照してきているのでしょうか? セッションファイルが無くても、デストロイしていなければ、`session_id();`をコールすると、 最後に付与したセッションIDが表示されます。 例えば、セッションファイルを故意に削除したとして、 認証で、`session_id();`で取得したセッションIDと、クッキーに保存したセッションIDが一致するかを チェックするとします。 そうした場合、セッションファイルがなくても認証は通るのでしょうか? また、$_SESSION['hoge']などに値を入れていたとして、echoする場合、 これも`session_id();`に一致するセッションファイルに書いてある値を表示させているのでしょうか? 例えば`session_id();`にIDが入っていて、セッションファイルが無い場合どうなるのでしょうか? テストしているとよく分からなくなってきました。 何卒、ご教授頂けますと幸いです。 補足 セッションの認証で、`session_id();`とクッキーのセッションIDが一致するか。 また、セッション変数に入っている値が一致するか。 という認証を行おうと思っているのですが、 取得した`session_id();`のセッションファイルがあるかどうかを確認するという作業も要るのか・・・? (そんなの調べても誰も書いてなかったですが) と思ったのですが、不要でしょうか。 セッション変数、クッキーとセッションファイルの連携が理解しきれませんでした。
回答: グダグダ回答書いていたのですがもっと簡潔にまとめます. ###### 初回の`session_start();` セッションIDが生成される. `$_SESSION`が利用可能になる. `Set-Cookie: PHPSESSID=xxx`というCookieが送られる. ###### `session_write_close();` `$_SESSION`をセッションファイルにシリアライズして保存する. `$_SESSION`の機能を停止する. **ただし,実行する前の値は残る.** **この処理は明示的に行わなくても終了時に勝手に行われる.** ###### 2回目以降の`session_start();` `$_COOKIE['PHPSESSID']`を元にセッションファイルを特定する. デシリアライズして`$_SESSION`に復元する. ###### `session_regenerate_id();` セッションIDが再生成される. 第1引数にtrueを渡していれば,古いセッションファイルの削除が行われる. `Set-Cookie: PHPSESSID=xxx`というCookieが送られる.**古いCookieはクライアント側で上書きされる.** ###### 対応するセッションファイルが無いPHPSESSIDを送ってきたときの`session_start();` PHP5.5.4以降で`session.use_strict_mode`が有効な場合 → 自動的に`session_regenerate_id();` 相当の処理が行われたあと,`$_SESSION`が利用可能になる. それ以外の場合 → `$_SESSION`が利用可能になる. 備考: PHP5.5.2以降のstrict sessionsモードでセッションフィクセイション対策はどうすればよいか ###### `setcookie(session_name(), '', 1);` クライアント側のCookieのみ削除要請する. 現在メモリ上に展開している`$_SESSION`やセッションファイルには影響を与えない. 実際には,次にクライアントはPHPSESSID無しでアクセスしてくるため,新しいセッションが形成される. これだけを行った場合,古いセッションのデータは破棄されずにガベージコレクションが発生するまで残留してしまう. ###### `$_SESSION = [];` 現在メモリ上に展開している`$_SESSION`のみ空にする. クライアント側のCookieやセッションファイルには影響を与えない. 実際には,`session_write_close();`のタイミングでセッションファイルが空にされる. ###### `session_destroy();` セッションファイルを削除し, `$_SESSION`の機能を停止する. クライアント側のCookieや現在メモリ上に展開している`$_SESSION`には影響を与えない. 【備考】