Open saitos01 opened 6 years ago
いくつか質問させてください。
セッションID
はクライアント、サーバー側どちらで生成されますでしょうか?PHPSESSID
) はクライアント側では 何に
保存されますでしょうか?sessionID(asdf...)
がサーバ側へ渡されたときに「応える内容」がわかるのはなぜ、sessionIDと値はどちらで(クライアントorサーバー側)でどのように管理されているからでしょうか。@koizumi1227 ↑ 質問になります。
@shoheis
セッションIDはサーバー側で生成され、session_start()関数でセッションが作成されます。
クライアント側ではブラウザのcookieに保存されます。
session_startをすることで$_SESSION変数にデータ保存をすることが可能になり、 sessionIDによりクライアント毎に変数の内容を把握できるように。サーバーに保存されているsessionIDとクライアントのcookieに保存されているsessionIDが一致することで保存されていた変数を引き続きやりとりができる。期限設定がされていなければ、ブラウザを閉じた時にsessionIDは消えてしまう
クライアント側ではcookieにsessionIDが保存されるのが一般的で、cookieが使えない場合はGETパラメータでやりとりも可能。(ただしセキュリティの面でほぼなし) サーバー側ではsessionIDとsession情報がファイルに保存される。 (サーバー側のファイルは期限設定することで自動削除される。)
以上です!お願いします。
@koizumi1227 Goodです!合ってますね!
せっかくなのでイメージ共有させていただきます(counterだとわかりにくいのでサンプルを変更してます)。
<?php
session_start(); # セッションID発行(PHPSESSID=af1dd12f08cef7bec046da8879e2f48d)
$_SESSION[‘username’] = ”koizumi”;
echo "セッションに格納しました。";
?>
以下のイメージでサーバ側に管理されます。
セッションID(PHPSESSID) | username |
---|---|
af1dd12f08cef7bec046da8879e2f48d | koizumi |
レスポンスに PHPSESSID=af1dd12f08cef7bec046da8879e2f48d
が乗っかった状態で応答します(正確にはSet-Cookie: PHPSESSID=af1dd12f08cef7bec046da8879e2f48d
の形)。
CookieにセッションIDが保存されます(赤枠)。こちらもすでにご存知でしたね。
リクエストには以下の情報が乗っかります。
PHPSESSID=af1dd12f08cef7bec046da8879e2f48d
こちらも正確にはCookie: PHPSESSID=af1dd12f08cef7bec046da8879e2f48d
の形。
<?php
session_start(); # セッションIDがすでにある場合は、セッションIDをキーにセッション情報を取得。
echo $_SESSION[‘username’];
?>
リクエストに乗っかってきたセッションIDの情報PHPSESSID=af1dd12f08cef7bec046da8879e2f48d
に基づき値を取得する。
セッションID(PHPSESSID) | username |
---|---|
af1dd12f08cef7bec046da8879e2f48d | koizumi |
bjalkajhgajhuoai0a0b7a0ba808b030b | saito |
PHPSESSID=af1dd12f08cef7bec046da8879e2f48d
のusername
はkoizumi
なので、echo $_SESSION[‘username’];
をした時にkoizumi
が出力される (例え 他に sessionID が格納されていたとしても 一致しない saito は表示されません )。
@shoheis 例を作っていただきありがとうございます! session変数なら変数として複数作ることが可能なのはわかるのですが、 sessionID自体を一つのクライアントに対して複数のIDを割り振ることはできるんでしょうか?
@koizumi1227
sessionID自体を一つのクライアントに対して複数のIDを割り振ることはできるんでしょうか?
こちらで達成したい機能としてはどのようなものがありますでしょうか(別の機能で補えるかもしれませんので)。
@shoheis その複数のIDを使って何かを実装したいとかは特に考えてはいなかったのですが、 sessionで調べてる際に、強引ではあるもの作れるようなことを見たので興味本位でした。 一つのクライアントに対して一つを発行するよう設計されてる上でそんなことができるのか?という疑問があったので。
@koizumi1227 なるほどです。 確かにあまり機能としては思いつかないので、やらないことかもしれませんね。
強引ではあるもの作れるようなこと
こちら記事わかりましたらURL貼ってくださると助かります(もしすぐに見つからなければ大丈夫です)
機能面以外でもSessionIDの管理としてもコードが複雑になりそうなのであまりやりたい処理ではない気がしております。 コードが複雑になるということはバグの可能性やセキュリティ上の穴になる可能性が高まるということにも繋がってしまいますので!
@shoheis すいませんでした!! よくよくみたらJavaでした…。それがこちらのURLです。 http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=28658&forum=12
@koizumi1227 ありがとうございます!
ちなみに セッションの仕組みや考え方に関しては「(主にブラウザを使った)Webサービス作り」で共通のものですので、PHPでもJavaでも他言語であってもそれが上記に該当するのであれば同じ考え方ができますよ!
今回の初心者用トレーニングの他の内容も同様に「Webサービス作り」で共通するものだと思ってください。他言語でも通用します(よって全ての内容がとても大事です)!
という前提のもとですが
そもそもセッションは1クライアントにつき1つ発行するものとして設計されたものです。 URLRewriting を利用して複数セッションを持たせよう、っていうのはかなり力押しの、イケてないソリューションだと思ってください。
とあるようにイケてないリューションのようですね。Webサービス作りでのこうあるべきという決まりや設計にはなるべく沿っていったほうが良いです。その中でどのように解決するかを最初に模索するべきで、最終手段として逸脱したバットノウハウを使うという流れになるかと思います。 ただ実際は逸脱する手段を使うケースはほぼないと思っておいてください。
いただいたURLの課題も流れをみると別の問題があるか別の解決手段があるようですね。
ただ、これはどうなんだろうという疑問を持つことは大切です。 今回も疑問を持ったことで理解が進んだ部分もあるかと思います。
今後もバンバン聞いてくださいませ!
@koizumi1227 【追記】 これは決まりだから〜、習慣だから〜 ということから一歩踏み込んで なぜそうきまっているのか、逆になぜバットノウハウなのか、なぜ逸脱しているのか を考えることも重要です。
@shoheis ありがとうございます!調べてもわからないことは聞いていきます!
言語によるプログラムの組み方は違えど、仕組みによる考え方は一緒ですね! 逸脱する手段を使ったとしても後々のバグやセキュリティの可能性のリスクを考えると、基本にのっとった方法をまずは考えたほうがよさそうですね。
逆になぜバットノウハウなのか、なぜ逸脱しているのか を考えることも重要です。
このきっかけができたので今回はjavaと間違えてしまいましたが収穫はあってよかったです!
@koizumi1227 収穫があったようで何よりです!
セッションについて調べてみましょう。
「セッションの仕組み」から調べて、次に「PHPでセッションを使う方法」を調べてみる順番が良いかと思います。
このIssueでは、「セッションの仕組み」を頭の中でイメージできることが重要になります。 もし不安でしたら図を書いていただけるとこちらで確認することができます。
「PHPでセッションを使う方法」に関しては調べてみると簡単なサンプルコードが手に入るのでそちらを一度試してみるのがいいと思います。
master から branchを切ってPRくださいませ。