なりすまし検知にも効果的、重複ログイン排他制御

実務で役に立ちそうな課題としてなりすまし対策について考えてみたいと思います。

ヤフーJAPAN等のポータルサイトで無料ということもあって、
アカウントを持っている方が多いと思います。

そしてこのようなほとんどのポートタルサイトではログインする時、
複数の携帯やパソコンから一つのアカウントで同時にログインできることが多いです。

このため、この点について気にする方は少ないかもしれません。

でも、見知らぬ人に自分のアカウントでなりすましによる悪用が行われることに不安を少しでも持つ方であれば、その事を知る機会を増やしたいとも思うはずです。

一般的ななりすまし対策の一例としてはなりすましを監視し、
メールでサイト管理者に通知する仕組みもあるようですが、
一般のユーザにも通知というのは余り聞いたことがありません。

ただ、もし同じアカウントで一人しかログインできないようにすることができれば、
少なくともログイン中の間のなりすましを防ぐまたは自身で知ることが可能になります。
(少し、話のもって行き方が強引だったかもしれませんが、)その方法について考えてみましょう。

別の"セッションとクッキーについて"という記事のまとめでご紹介しました
「インターネットサイトのログイン処理は銀行窓口の受付処理に例えることができる。(クッキーに含まれるセッションIDと銀行の受付番号は概念的に同じということができる)。」
という点がヒントになりそうです。

では、その方法の一例です。

ショッピングサイトの利用例

Aさんがブラウザ(以下、Aさんクライアント)を介して、
某ショッピングサイト(以下、サーバー)にログインし、
買い物中に見知らぬ人が、
別のパソコンのブラウザ(以下、なりすましクライアント)からログインしてきた場合に、
Aさんが、サーバーから突然ログアウトされ、なりすましに気付く流れを例にお話します。

(サーバー側の視点で話を進めていきます。)

  • 【STEP1】Aさんクライアント→サーバーの向きにAさんのアカウント情報(ユーザ名とパスワード等)が送られます。
  • 【STEP2】サーバー側ではアカウント情報が正しいことを確認し、
    サーバー→Aさんクライアントの向きにランダムに生成した不規則な値、
    セッションIDを含む情報、クッキーを返します。
    同時にセッションIDを含む情報をAさんクライアントがログアウトするまで、
    一時的に保管して置きます。
  • 【STEP3】以降、Aさんクライアントはサーバーにアクセスする度にAさんクライアント→サーバーの向きにセッションIDを送り続けます。
  • 【STEP4】サーバー側ではその都度、一時的に保管しているセッションID(STEP2参照)とAさんクライアントから送られてきたセッションIDが一致することを確認し、
    Aさんクライアントが期待するページを返し続けます。

ここで事件発生です。

  • 【STEP5】なんと見知らぬ人によって、
    なりすましクライアント→サーバーの向きにAさんのアカウント情報が送られてきました。
  • 【STEP6】サーバー側ではアカウント情報が正しいことを確認し、
    同時にその時、保管していた同アカウント情報に対するセッションIDと同じであるかどうか確認しました。

    そして当然ながらその時、保管していたものはAさんクライアントが
    今まさに利用中のセッションIDと同じものであったため、一致しません。

    サーバー側はそれを古いと判断し、
    そのセッションIDを廃棄
    し(セッション破棄)、
    なりすましクライアントがログアウトするまで、
    新しいセッションIDが代わりに保管されることになってしまいました。

しかし...

  • 【STEP7】Aさんクライアント→サーバーにセッションIDが送られてきた時、
    サーバー側では、一時的に保管しているセッションID(なりすましクライアントのもの)とAさんクライアントから送られてきたセッションIDが一致しないルールに従い、
    Aさんクライアントへは期待するページでなく、
    再度ログイン認証要求する画面を送る
    ことになりました。

その後、Aさんクライアントはショッピング中に突然ログイン認証画面が表示されたので、
不安に思い、速やかにショッピングサイトに電話し、
アカウントの一時停止をお願いすることで事無きを得ました。

まとめ

①同じアカウントで一人しかログインできないようにする方法例

  • 新しいセッションIDのローカル保存
    サーバー側でログイン認証処理時にアカウント情報の正誤チェックだけでなく、
    同じアカウントで他にログインしている人がいるかどうかのチェックも合わせて行うこと
    (アカウント情報とセッションIDをセットにした情報を一時的に保管すること)
  • 古いセッションIDの破棄
    同じアカウントで他にログインしている人がいた場合、
    その人が持つセッションIDの情報を破棄するようにすること。

次回は、引き続きWEB技術として、
Googleマップや新着ニュースのお知らせにも利用されているクライアント、
サーバー間の非同期通信(Ajax通信)についてご紹介したいと思います。
(もし、何か興味がある課題がありましたら、コメント頂ければうれしいです)。

  • B!