質問: そもそもCOOKIEとSESSIONが理解できてなかったため、qitaの記事を参考にしながら理解を深めようと思っていたのですが、以下の点で概ね理解があっているかを確認したく投稿させていただきました。 ### 1) session_start()によるID発行 クライアントがリクエストし、session_start()によって、サーバー側はセッションidが未発行の場合には、セッションidを発行する。この時クライアントサイドではCOOKIEにデフォルトでsession_nameを変更しない場合、名前:値としてPHPSSID:xxxxxxxxxが保存されるとともに、サーバー側ではセッションファイルが作成されるとともに、COOKIEのPHPSSID:xxxxxxxxxと紐付けがされる。 ### 2)一連の処理に置けるデータの保存やチェック クライアント側ではCOOKIEは偽装可能(ユーザーが好きに値を変えて変更できてしまう)ため、COOKIEに保存されたセッションIDによりサーバー側でデータをチェックすることやセッション間のデータの保存をする必要がある。 ***最も重要な点を言い換えれば、ステートレスを前提としたhttp通信の環境下で、リスクに少ないサーバー側でデータを保存等をする。またそれを適切にやりとりするためクライアント側ではCOOKIEによりセッションIDだけを持たせ、サーバー側ではこのIDに紐づく情報をセッションファイル内に保存させる仕組みとなっている***。 ### 3) セッションIDが既に発行でsession_start()が実行される場合 セッションidが既に発行されているおり、session_start()がサーバー側で実行される場合には、既存のセッションを再開する。(マニュアル)つまり、クライアントから送られてきたリクエストのCOOKIEに保存されているセッションIDを取得すし、サーバー側でそれに紐づくセッションファイルを呼び出し、情報を呼び起こす。(例えば、echo $_SESSION['name']などでセッションファイルに保存された連想配列の添字'name'に値にページ遷移後でもアクセスすることができる) これらの理解があっていることを前提とした場合ですが、 ### A) $_COOKIEの使いどころ ユーザーのページ遷移に伴って、一連で処理させたい場合、$_SESSIONは上記で理解できるのですが、$_COOKIEの使いどころがいまいちピンときません。$_COOKIEに保存されるセッション名はsession_name()で変更するでしょうが、開発側でCOOKIEのexpireやmax-ageを調整して期間を短くして、セキュアに運用したい等の目的で$_COOKIEは使われるのでしょうか? ### B) 一連処理を実現するためのSESSIONやCOOKIEを利用する場合のセキュリティ上の対策 これは記事に載っていないですが例えば(セッションハイジャック対策ですが)、 * $_COOKIEや$_SESSIONの有効期間を短くしたりdestroyすることにより、みだりに長く情報を保存しない。 * session_regenerate_id();で遷移の都度idを変更して、cookie側とセッションファイル側のidを更新する * session名をsession_nameによりPHPSSIDから変更する 等があげられたりしますが、実務上、さらに注意すべき点や対策に不足がある点はございますでしょうか、また正直最後のセッション名の変更はセキュリティ上、あまり意味がないきがするのですが、どういった理由でPHPSSIDから変更すべきなのでしょう? ### C) セッションidを変更しているのに$_COOKIEにアクセスすると変更されない現象 以下のvar_dump($_COOKIE['amturing']);をした場合、xxxxxxxxが返され、これはsession_regenerate_id();される前のidであり、その後に取得しているCOOKIE側のセッションIDの値であるためなぜ、yyyyyyyyが取得されないのかがわかりません。実際にGoogle ChromeのディベロッパツールのApplicationのCOOKIEではyyyyyyyyが表示されております。 ``` session_name("amturing"); session_start(); $oldid=session_id(); session_regenerate_id(); $newid=session_id(); var_dump($oldid);//xxxxxxxx echo ""; var_dump($newid);//yyyyyyyy var_dump($_COOKIE['amturing']);//xxxxxxxx ``` 長文となり、申し訳御座いませんが よろしくお願い申し上げます。
回答: $_COOKEと$_SESSIONの大きな違いは 値をブラウザ側に保持するか、サーバに保持するかの違いです。 ただし、$_SESSIONは、$_COOKIEを一つ利用します。 それは、サーバ側のセッションデータを特定する為に SessionIDを$_COOKEに入れてます。 また、セッションID以外の、$_COOKEは、セッションとは一切無関係です。 ブラウザ側に、値を保持するのは、現実的には、セキュリティの問題を起こしますので、$_SESSIONを利用するのが賢明です。