質問: **質問背景** ・JavaScriptでセッションIDを取得しようと思い、document.cookieを表示してみました > > PHPSESSID=ランダム文字列? > > > --- **質問1.session_start()と明記しなくてもセッション開始している?** ・PHPでsession_start();と明記していないのに、document.cookieで内容が表示されました ・セッションidは、session_start();と明記しなくても、発行されるのでしょうか? ・ユーザがページへアクセスした段階で常に発行され、クライントのCookieへ格納される仕様? --- **質問2.セッションIDの発行主体は?** ・セッションはサーバが発行する、とどこかに書いてあったのですが、PHPとの関係は? ・Apacheで運用している場合、セッションIDの発行主体はApache? ・デフォルトでキーがPHPSESSIDとなる以上、PHPがセッションIDを発行している? ・PHPだけがセッションを利用するわけではないとは思うのですが...... --- **質問3.クッキーに格納されるセッションIDの数は?** ・クッキーはどんな単位で保存されるのでしょうか? ・セッションID毎? ・1PCから異なるブラウザで特定ページへアクセスした場合、発行されるクッキーは一つ? --- **質問4.セッションIDのセキュリティ** ・アクセス解析等で、セッションID格納を検討しているのですが、セキュリティ的にどれぐらい重要な情報なのでしょうか? ・有効期限が切れていたら第三者にとっては全く無意味な情報? ・また有効期限内であっても、他情報との紐付けがなければ気にする必要はない?(ブラウザ画面等で表示しても大丈夫?)
回答: ### 質問1.session_start()と明記しなくてもセッション開始している? php.iniなどで`session.auto_start`がonになっていると、スタートします。 それ以外では、スタートしないはずです。 デフォルトではセッションクッキーは明確に破棄しない限り、ブラウザが閉じるまで保持し続けます。 ### 質問2.セッションIDの発行主体は? PHPがApacheのモジュールとして動いているなら、発行元はApacheと言えるかもしれません。 > > PHPだけがセッションを利用するわけではないとは思うのですが...... > > > PHPだけが利用します。PHPの機能です。 ### 質問3.クッキーに格納されるセッションIDの数は? > > クッキーのに格納されるセッションIDの数は? > > > これは、クッキーの仕組みを理解しておられないのかな?と思います。 `PHPSESSID`というクッキーは値が一つしか持てません。その値がセッションIDということです。 (クッキー自体、処理を入れれば複数の値を入れることができますがPHPはそれをしていません) > > クッキーはどんな単位で保存されるのでしょうか? > > > これは、`session_set_cookie_params`で変えることができます。 ドメイン全体にするか、それともpathを指定するか、などです。詳しくはマニュアルをご覧ください。 > > 1PCから異なるブラウザで特定ページへアクセスした場合、発行されるクッキーは一つ? > > > ブラウザごとです。クッキーがブラウザごとに保存されるからです。 ### 質問4.セッションIDのセキュリティ セッションハイジャックという方法がありますので、それを考えるとあまり表示するというのは考え物だと思います。(クッキーを使うことでハイジャックはされにくくなってはいます) `session_regenerate_id()`を使ってセッションIDをコロコロ変えることで、セキュリティを上げることができます。 > > ・アクセス解析等で、セッションID格納を検討しているのですが、セキュリティ的にどれぐらい重要な情報なのでしょうか? > > ・有効期限が切れていたら第三者にとっては全く無意味な情報? > > ・また有効期限内であっても、他情報との紐付けがなければ気にする必要はない?(ブラウザ画面等で表示しても大丈夫?) > > > 内部的に用いることは全然問題ないと思いますが、実際にセッションが有効な場合、上にも書いたように外部に公開するのはセキュリティリスクがあります。 アクセス解析で使うということは、`session_regenerate_id()`を使わず、セッションIDを固定するので、余計外部に公開は避けるべきでしょう。 ### お断り あくまで、わたしshi_ueが理解した事柄なので、間違っていることもあるかもしれません。 このあたりの話は、調べるといくらでも出てくるので、ググって見るのが早いでしょう(笑)