質問: セッションの実現方法についての質問です。 「プロになるためのWeb技術入門」という本を参考にしております。 「セッションIDの受け渡し方には選択肢があります。CookieによるセッションIDの受け渡しはセッションIDが外部に漏れる可能性が低く、安全なのですが、ブラウザのセキュリティの設定によってはCookieの受け入れを拒否されることがあり、その場合はセッションを実現させることができません。 代替手段としては、GETリクエストのパラメータが考えられます。PHPではCookieが利用できない場合、「PHPSESSID」というパラメータ名でリクエストのURLにセッションIDが含められるようにformタグが自動的に書き換えられ、サブミット時にGETパラメータとしてセッションIDが渡されるようにしています。このような手法はURLリライティングと呼ばれています。 同様にTomcatでも「jsessionid」というパラメータがGETリクエストに付加されます。 Tomcatでは初回アクセス時にCookieとURLリライティングを併用してセッションIDをブラウザに送ります。そして、ブラウザから次に送られるリクエストの内容から、Cookieが利用出来るならばCookieのみを、そうでないならば、URLリライティングのみを使用するよう判断します。」 CookieによるセッションIDの受け渡しは理解しているのですが、URLリライティングによるセッションIDの受け渡しがイマイチわかりません。 まず、上の文章の前半で登場するPHPでのURLリライティングについてですが、Cookieが使えないならば、ブラウザ側はどのようにしてセッションIDを知るのでしょうか? どうにかしてブラウザ側がセッションIDを知ることができれば、あとはURLリライティングによりセッションを実現することができるのはわかるのですが。 「TomcatではCookieとURLリライティングを併用してセッションIDをブラウザへ送ります。」とありますが、ブラウザに対して、URLリライティングを使って、セッションIDを送るというのが理解できません。と言いますのも、HTTPレスポンスを見ますと、そのようなURLを記述した部分は見つけられないからです。 これは一体どのような意味なのでしょうか? 以上、2点ですが、回答お願い致します。
回答: 当該書籍にGETとPOST、HTTPがステートレスであるという点についてなど解説があったかと思いますので、そちらを読むなり、実際にPHPで何かを作ってみると理解しやすいかと思います。が、以下で一応説明してみます。 #### 前提のGETリクエストについて まず、ブラウザ上でとかを開くと、Googleにて「hogehoge」キーワードでutf-8エンコードのページが開きます。 上記のようなURLによるリクエスト(GET)を行うと、サーバー側(Google)は、qというキーの「hogehoge」というデータと、ieというキーの「UTF-8」というデータを受け取ることが出来ます。これがGETリクエストによる値の受け渡しです。 しかし、HTTPはステートレスですので、同じGoogleサーバーにあるはずの検索結果の次のページをそのまま開こうとしても、次のページにqというキーの「hogehoge」という検索ワードは引き継がれません。そのため、Googleの「次へ」のボタンのURLを見ていただけば分かりますが、ちゃんと「?q=hogehoge」が入っています。 #### 1つ目について PHP(Tomcatも仕組み的には似ていますが)は、ブラウザからのリクエストに対して、指定されたPHPファイルのコードを実行して結果をレスポンスとして返します。 質問文の該当部分をそのまま読むと、当該PHPファイルの中に ``` ``` というものがもしあった場合、 ``` ``` 的に書き換えた結果をレスポンスとして返してくるということかと思います。 ``は、通常POST(or GET)でのリクエスト送信を行いますが、PHPSESSIDをキーに=以後の値をサーバーが受け取れるということです。 現在では、セッションハイジャックの危険がありますので、このような実装はダメです。 #### 2つ目について 「ブラウザに対してセッションIDを送る」「URLリライティングを使ってセッションIDをブラウザに送る」が理解出来ないとのことなのですが、URLリライトの仕組みを見ていただいた方が早いと思います。( →URLリライトと301リダイレクトの仕組み \| Moz \- SEOとインバウンドマーケティングの実践情報 \| Web担当者Forum ) 大まかにいって、サーバーからブラウザに「そのURLこっちだよ」といい、ブラウザが「あ、そうなの?変えとくわ」という仕組みが存在し、その「こっちだよ」にセッションIDが付加されたものが渡されているということです。あとは、次のページに遷移するときに、そのセッションIDが付加されたままのURLで遷移すればよいということになります。