koizumi1227 / php-training

0 stars 0 forks source link

セッションを利用してみましょう #15

Open saitos01 opened 6 years ago

saitos01 commented 6 years ago

セッションについて調べてみましょう。

「セッションの仕組み」から調べて、次に「PHPでセッションを使う方法」を調べてみる順番が良いかと思います。

このIssueでは、「セッションの仕組み」を頭の中でイメージできることが重要になります。 もし不安でしたら図を書いていただけるとこちらで確認することができます。

「PHPでセッションを使う方法」に関しては調べてみると簡単なサンプルコードが手に入るのでそちらを一度試してみるのがいいと思います。

master から branchを切ってPRくださいませ。

koizumi1227 commented 6 years ago

session

saitos01 commented 6 years ago

いくつか質問させてください。

初めてのアクセスの時 について

sessionIDと共にindex.phpを渡す について

何かしらの要求とsessionID(asdf...) をサーバへ 、応える内容とsessionID.... について

saitos01 commented 6 years ago

@koizumi1227 ↑ 質問になります。

koizumi1227 commented 6 years ago

@shoheis

初めてのアクセスの時 について

セッションIDはサーバー側で生成され、session_start()関数でセッションが作成されます。

sessionIDと共にindex.phpを渡す について

クライアント側ではブラウザのcookieに保存されます。

何かしらの要求とsessionID(asdf...) をサーバへ 、応える内容とsessionID.... について

session_startをすることで$_SESSION変数にデータ保存をすることが可能になり、 sessionIDによりクライアント毎に変数の内容を把握できるように。サーバーに保存されているsessionIDとクライアントのcookieに保存されているsessionIDが一致することで保存されていた変数を引き続きやりとりができる。期限設定がされていなければ、ブラウザを閉じた時にsessionIDは消えてしまう

クライアント側ではcookieにsessionIDが保存されるのが一般的で、cookieが使えない場合はGETパラメータでやりとりも可能。(ただしセキュリティの面でほぼなし) サーバー側ではsessionIDとsession情報がファイルに保存される。 (サーバー側のファイルは期限設定することで自動削除される。)

以上です!お願いします。

saitos01 commented 6 years ago

@koizumi1227 Goodです!合ってますね!

せっかくなのでイメージ共有させていただきます(counterだとわかりにくいのでサンプルを変更してます)。

初めてのアクセス時

<?php
session_start(); # セッションID発行(PHPSESSID=af1dd12f08cef7bec046da8879e2f48d)
$_SESSION[‘username’] = ”koizumi”;
echo "セッションに格納しました。";
?>

以下のイメージでサーバ側に管理されます。

セッションID(PHPSESSID) username
af1dd12f08cef7bec046da8879e2f48d koizumi

レスポンスに PHPSESSID=af1dd12f08cef7bec046da8879e2f48dが乗っかった状態で応答します(正確にはSet-Cookie: PHPSESSID=af1dd12f08cef7bec046da8879e2f48d の形)。

sessionIDと共にindex.phpを渡す について

CookieにセッションIDが保存されます(赤枠)。こちらもすでにご存知でしたね。

d62c1012 7690 11e6 9202 60ab79c66ab6

何かしらの要求とsessionID(asdf...) をサーバへ

リクエストには以下の情報が乗っかります。 PHPSESSID=af1dd12f08cef7bec046da8879e2f48d

こちらも正確にはCookie: PHPSESSID=af1dd12f08cef7bec046da8879e2f48d の形。

応える内容とsessionID(asdf...)を返す

<?php
session_start();  # セッションIDがすでにある場合は、セッションIDをキーにセッション情報を取得。 
echo $_SESSION[‘username’];
?>

リクエストに乗っかってきたセッションIDの情報PHPSESSID=af1dd12f08cef7bec046da8879e2f48d に基づき値を取得する。

セッションID(PHPSESSID) username
af1dd12f08cef7bec046da8879e2f48d koizumi
bjalkajhgajhuoai0a0b7a0ba808b030b saito

PHPSESSID=af1dd12f08cef7bec046da8879e2f48dusernamekoizumiなので、echo $_SESSION[‘username’];をした時にkoizumiが出力される (例え 他に sessionID が格納されていたとしても 一致しない saito は表示されません )。

koizumi1227 commented 6 years ago

@shoheis 例を作っていただきありがとうございます! session変数なら変数として複数作ることが可能なのはわかるのですが、 sessionID自体を一つのクライアントに対して複数のIDを割り振ることはできるんでしょうか?

saitos01 commented 6 years ago

@koizumi1227

sessionID自体を一つのクライアントに対して複数のIDを割り振ることはできるんでしょうか?

こちらで達成したい機能としてはどのようなものがありますでしょうか(別の機能で補えるかもしれませんので)。

koizumi1227 commented 6 years ago

@shoheis その複数のIDを使って何かを実装したいとかは特に考えてはいなかったのですが、 sessionで調べてる際に、強引ではあるもの作れるようなことを見たので興味本位でした。 一つのクライアントに対して一つを発行するよう設計されてる上でそんなことができるのか?という疑問があったので。

saitos01 commented 6 years ago

@koizumi1227 なるほどです。 確かにあまり機能としては思いつかないので、やらないことかもしれませんね。

強引ではあるもの作れるようなこと

こちら記事わかりましたらURL貼ってくださると助かります(もしすぐに見つからなければ大丈夫です)

機能面以外でもSessionIDの管理としてもコードが複雑になりそうなのであまりやりたい処理ではない気がしております。 コードが複雑になるということはバグの可能性やセキュリティ上の穴になる可能性が高まるということにも繋がってしまいますので!

koizumi1227 commented 6 years ago

@shoheis すいませんでした!! よくよくみたらJavaでした…。それがこちらのURLです。 http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=28658&forum=12

saitos01 commented 6 years ago

@koizumi1227 ありがとうございます!

ちなみに セッションの仕組みや考え方に関しては「(主にブラウザを使った)Webサービス作り」で共通のものですので、PHPでもJavaでも他言語であってもそれが上記に該当するのであれば同じ考え方ができますよ!

今回の初心者用トレーニングの他の内容も同様に「Webサービス作り」で共通するものだと思ってください。他言語でも通用します(よって全ての内容がとても大事です)!

という前提のもとですが

そもそもセッションは1クライアントにつき1つ発行するものとして設計されたものです。 URLRewriting を利用して複数セッションを持たせよう、っていうのはかなり力押しの、イケてないソリューションだと思ってください。

とあるようにイケてないリューションのようですね。Webサービス作りでのこうあるべきという決まりや設計にはなるべく沿っていったほうが良いです。その中でどのように解決するかを最初に模索するべきで、最終手段として逸脱したバットノウハウを使うという流れになるかと思います。 ただ実際は逸脱する手段を使うケースはほぼないと思っておいてください。

いただいたURLの課題も流れをみると別の問題があるか別の解決手段があるようですね。

ただ、これはどうなんだろうという疑問を持つことは大切です。 今回も疑問を持ったことで理解が進んだ部分もあるかと思います。

今後もバンバン聞いてくださいませ!

saitos01 commented 6 years ago

@koizumi1227 【追記】 これは決まりだから〜、習慣だから〜 ということから一歩踏み込んで なぜそうきまっているのか、逆になぜバットノウハウなのか、なぜ逸脱しているのか を考えることも重要です。

koizumi1227 commented 6 years ago

@shoheis ありがとうございます!調べてもわからないことは聞いていきます!

言語によるプログラムの組み方は違えど、仕組みによる考え方は一緒ですね! 逸脱する手段を使ったとしても後々のバグやセキュリティの可能性のリスクを考えると、基本にのっとった方法をまずは考えたほうがよさそうですね。

逆になぜバットノウハウなのか、なぜ逸脱しているのか を考えることも重要です。

このきっかけができたので今回はjavaと間違えてしまいましたが収穫はあってよかったです!

saitos01 commented 6 years ago

@koizumi1227 収穫があったようで何よりです!