7
9

More than 1 year has passed since last update.

パスワード変更で、そのユーザのHTTPセッションをすべて破棄する

Posted at

はじめに

Webアプリケーションで、利用者が「パスワード変更」を行ったら、そのユーザのHTTPセッションをすべて破棄する。
という実装を一般的なWebアプリケーション・フレームワークではどのように実装するのかという点について考察した。


なぜこれが必要なのか

ユーザのHTTPセッションが、不正行為者にハイジャック(乗っ取り)されている場合、利用者はパスワード変更で不正行為者が乗っ取っているHTTPセッションを破棄することができる。

しかしながら、パスワードが漏洩している場合は、不正行為者が先にパスワード変更されると「おしまい(パスワード変更での2要素認証は必須)」だが、不正行為者よりも先にパスワード変更ができれば、不正行為をその時点までに止めることもできる。

(セッションハイジャックされた原因がそのままだと、再度ハイジャックされるかもしれないが・・・)

passChg02a.png


一般的なWebアプリケーションのHTTPセッション管理の仕組み

一般的には「セッションID方式」だと思う。
このセッションID方式によるHTTPセッション管理は、「セッションID」と呼ばれる一意で推測困難な値を、Webブラウザの(多くは)クッキーに埋め込み、その値を元にHTTPリクエストをどのHTTPセッションか認識する、というものである。
さらに、セッションIDごとにWebアプリケーション・サーバ側にメモリ(セッション変数/セッションオブジェクトと呼ばれる)が確保されて、データを保持することができる。
この方式の特徴としては、HTTPセッション間は独立であるので、「パスワード変更したユーザかどうか」を見極める仕組みがひつようとなる。

passChg01.png


解決策

ログイン時にセッション変数/セッションオブジェクトに何かを記憶させておき、このセッションの年齢というか生存期間が判断できるようにする。
全てのHTTPアクセスのサーバ側の処理の一番最初で、この値をデータベース側の値と比較し、古ければ強制的にログアウトさせる。
(ログイン画面へリダイレクトさせる)


具体的解決策1

セッション変数に、パスワードの更新日時を保持し、その値とデータベース側の最新のパスワード更新時間を比較し、
過去のものであれば、セッションを破棄(ログアウト)し、ログイン画面へリダイレクトさせる。

passChg03a.png


具体的解決策2

セッション変数に、ログイン日時を保持し、その値とデータベース側の最新のパスワード更新時間を比較し、
過去のりものであれば、セッションを破棄(ログアウト)し、ログイン画面へリダイレクトさせる。

passChg04a.png


その他

他のやり方もあると思う。
そういうのはコメントに書いてほしい。


以上

7
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
9