【Laravel】sessionとcookie
の前に
Requestクラスについて
中身にはHTTPメソッド、使用ブラウザの情報やクエリパラメータなど色々。
https://scrapbox.io/files/660182044c266d002455d038.png
セッションやクッキー情報なども呼ぶことができる。
Request $requestという書き方は、DI(Dependency injection)という考え方
依存性の注入
別のオブジェクトを外部から渡すことでクラス間の依存性を下げる。
サービスコンテナによって楽に扱うことができる
セッション
設定ファイルはconfig/session.php
databaseドライバを使うならマイグレーションをする(queueと似ている。)
code:.env
# この辺で指定する
SESSION_DRIVER=file
SESSION_LIFETIME=20160
この場合、デフォルトなら下記の形で入る
'files' => storage_path('framework/sessions'),
つまりサーバ側のstorage/framework/sessionsに置いておくということ。
ドライバをデータベースにするとテーブルで格納されるようになる。
セッション操作する
確認
code:php
dd($request->session());
Illuminate\Session\Store {#440 ▼
"_token" => "80X3zgLqPGgJ9JLK5DluIhJ5KllrA5RsC7AvS5Hp"
"url" => []
"login_web_59ba36addc2b2f9401580f014c7f58ea4e30989d" => 1
]
#handler: Illuminate\Session\FileSessionHandler {#439 ▶} }
こんな感じで、セッションidなど様々な要素が含まれている
値の格納と呼び出し
code:php
$request->session()->put('users', 'skonishi');
$users = session('users');
dd($users);
// "skonishi"
// 削除するときは$request->session()->forget('users') で良い
この値はブラウザなどから確認することはできない。
セッションIDを使ってusersという情報をサーバーへ見にいき、skonishiという値を取っているイメージ。
cookie
値の操作
code:php
# cookie一覧確認
$cookie = $request->cookie();
# 値の設定
setcookie('sample', 'cookie_value_desu');
# 確認
echo $_COOKIE"sample"; // cookie_value_desu https://scrapbox.io/files/6602d0dbac184f0025c118ad.png
cookieの値とセッションID
この記事がわかりやすい。
流れ
アプリケーションにリクエストを送ったタイミングで、cookieにxxx_sessionという値が作られる
これはxxx_sessionというセッション名で、セッションIDが値として暗号化されたもの
vendor/laravel/framework/src/Illuminate/Session/Middleware/StartSession.phpで作られている
セッションID
dd(\Cookie::get());で見た内容とブラウザで確認できる値は異なる
dd()で確認できるのがサーバー側、ブラウザで確認できるのがクライアント側という認識でOK
https://scrapbox.io/files/6602d6c41c79ba0026170021.png
これはLaravelのKernelでcookieとして保管したセッションIDが暗号化されているから。
app/Http/Middleware/EncryptCookies.php
これをコメントアウトすると、サーバー側とブラウザ側で同じセッションIDが格納されている動作が確認できる
リクエスト時にセッションIDをサーバー側で暗号化して発行し、それをクライアント側に持たせている。
認証におけるcookieとセッション
流れ
認証した時、セッションIDをクライアント側で保存させる
その時セッションIDを持つドライバにログイン情報を保存させている
ログインする前と後で、セッションの値が変わるはず。
認証が終わったら
ログインが成功したら、セッションに値が格納されていることになる
つまりクライアントからのリクエスト時に、cookieの情報(セッションID)がサーバー側に送られてくる
サーバー側でセッションIDの中に含まれている情報を取得して、そのユーザーが認証済みかどうかを判定する