Works by

Ren's blog

@rennnosuke_rk 技術ブログです

認証におけるRemember Meの仕組み

Remember Me とは

Remember Meはアカウント認証によくある機能の一つで、ユーザがサービスにログインしたときユーザの入力したアカウント情報をサーバ側で保持しておく機能です。

Remember Me を有効にすることで、ユーザはサービスへのアクセスを一旦終了した場合でも、
再度サービスに接続したときにログイン状態を維持することが可能です。

f:id:rennnosukesann:20180217222722p:plain

Remember Me の仕組み

Remember Me 機能を提供する方法の一つに、クッキーを二つ使うものがあります。

この方法では、クライアントがアカウント認証をパスしたとき、サーバがそのクライアントに対して以下の二つのクッキーを発行します。

  • 通常のクッキー
    通常のWebサービスと同様に発行されるクッキーです。このクッキーには、通常Expired属性が付加されません。すなわち、ブラウザを閉じた瞬間にこのクッキーは破棄されます。

  • Remember Me 用クッキー
    Remember Me 専用のクッキーです。このクッキーのExpired属性には100000日などの半永久的な期間が設定されます。

クッキーの属性定義はこちら

Remember Me を設定したユーザアカウントがログインに成功した時、サーバはDBに保持するユーザレコードのRemember Meフラグに該当する属性をtrueにします。当該フラグがtrueのユーザから再度アクセスがあったとき、サーバはクライアントのRemember Me 用クッキーを参照します。

Remember Me 用クッキーは半永久的にクライアントに保持されているので、サーバはRemember Me 用クッキー内のセッションIDを参照でき、ユーザがログイン状態でサービスを利用することを許可することができます。

上記手法におけるRemeber Me の懸念点

この手法で実装したRemember Me 機能によって、クライアント側には半永久的なクッキーが残留してしまいます。

そもそも、クッキーというものはセッションIDの漏洩とそれによるセッションハイジャックを防ぐために、Expired属性が設定されず、ブラウザが閉じたときに自動的に破棄され、サーバから再発行されるのが一般的です。

そのため、Remember Meの実装はサービスの内容・セキュリティ要件等を鑑みた上で実装するのが良さそうです。(Remember Me 用クッキーの残留期間を調節して、数日程度で破棄させるというやり方もあります)

参考文献

https://triple-underscore.github.io/RFC6265-ja.html