[Laravel] 認証がセッションの有効期限を変更しても反映されず維持される時

2019年6月7日ITLaravel

・config/session.php の lifetime (分単位)を変更したのに、
・.env の SESSION_LIFETIME (分単位)を変更したのに、、
・php.ini の session.gc_maxlifetime (秒単位)を変更して、session.gc_probability / session.gc_divisor の割合も調節したのに、、、
・ブラウザを全て閉じたのに、、

[環境]
PHP 7.2.4
Laravel 5.6.27
MySQL 5.7.22

それでも認証が切れずにログインを再度せずに認証が維持され、ハマっていたのですが、

原因は「Remeber Me」でログイン維持されていたことが原因でした。

通常のログインでは「XSRF_TOKEN」「laravel_session」しか cookie にトークンは保存されませんが、

when-laravel-sessions-not-working1.png

Remeber Me にチェックを入れて、ログインした時や、Socialite を使って、SNSログインした場合は「remeber_web_xxxxx」というトークンが発行され、ログアウトするまで認証が維持されます。

when-laravel-sessions-not-working2.png

セッションが切れても、Remeber Me がオンでログインされていたら、セッションは再作成されるので、ログインが維持される、つまり認証され続けるということですね。

引用:

・remember_web_59ba36addc2b2f9401580f014c7f58ea4e30989d
こちらは、「Remember Me」のためのクッキーで、Laravelではログインした日から5年間と期限はハードコードされています。つまり、同じブラウザを使用し続けるなら、ログオフしない限り5年間ログインなしでアクセス可能です。

このクッキーが使用されるシナリオは簡単にはこうです。

ログイン後、2時間アイドルが続いたらあるいはブラウザを閉じたら、現在のセッションは無効になります。

セッションが無効となると、ユーザーの認証が不可能となります。なぜなら、セッションの中に含まれていたユーザーのIDの取得が不可能となるからです。そうなるとログインの画面に遷移して、再度ログインしなければなりません。

しかし、「Remember Me」をオンとしてログインしていたなら、この時点で、まだ期限までたっぷり時間がある「Remember Me」のクッキーを見に行きます。

このクッキーの中には、暗号化されたユーザーIDが入っているので、それを非暗号化して再度セッションを作成します。これにより、再度ログインをすることなしに、ログインした状態をキープすることが可能となるのです。

引用元:
ログインのRemember Me

参考:
https://readouble.com/laravel/5.6/ja/authentication.html

スポンサーリンク

Posted by nobuhiro harada