質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.53%
Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

セッション

Sessionはクライアントがサーバに送ったすべてのリクエストのことを指します。

Express

ExpressはNode.jsのWebアプリケーションフレームワークです。 マルチページを構築するための機能セットおよびハイブリッドのWebアプリケーションを提供します。

Q&A

解決済

1回答

1432閲覧

Node.jsで、同じセッションIDの二重ログインのみ防ぎたい

tetakaha759

総合スコア20

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

セッション

Sessionはクライアントがサーバに送ったすべてのリクエストのことを指します。

Express

ExpressはNode.jsのWebアプリケーションフレームワークです。 マルチページを構築するための機能セットおよびハイブリッドのWebアプリケーションを提供します。

0グッド

2クリップ

投稿2022/09/28 00:01

編集2022/09/28 16:47

前提

タイトルの通りとなりますが、Node.jsにて同じセッションIDにおける二重ログインのみ防ぎたい、と考えています。

「同じセッションID」とは、「同じブラウザで、別のタブ/ウィンドウで同一アカウントにてログイン」している場合を想定しています。

よって、同じブラウザでも「シークレットウィンドウ」を使ったり、FireFoxとChromeといった別のブラウザを使った場合は、含まれません(セッションIDが異なるため)。

実現したいこと

同じブラウザであるアカウントでログインし、別のタブ/ウィンドウで同じアカウントでログインしようとした際、「すでにログイン中です」ということで、ログインを拒否したく存じます。

そのログイン拒否を行う際の判定基準となるものを、ご存じの方はご教示いただけませんでしょうか。

イメージとして、同じブラウザでも各タブごとに固有の値があれば、それを利用できるかもしれません。
もしくは、固有の値を持たせるような仕組みです。

発生している問題・エラーメッセージ

現状で、エラーメッセージは特にありません。

試したこと

「express-session」の「req.headers」などの値を参照してみましたが、「cookies」に含まれる値は同一ブラウザで別のタブ/ウィンドウであっても、全く同じでした。

タブ/ウィンドウとしての固有値は、「req(HTTPリクエスト)」オブジェクトには含まれていないのでしょうか。

補足情報(FW/ツールのバージョンなど)

Node.js v14.15.5
express 4.17.1
express-session 1.17.2

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

やりたいことは明確に記載いただいていますが、非常に珍しい要件です。二重ログインを禁止したいというのは、同一ユーザーでは一つのセッションIDのみ払い出すという要件が一般的でして、これは「異なるブラウザからはログインは禁止するが一つのブラウザの別タブからはログインは許可する(積極的に許可したい訳では無いが禁止することが難しいため)」という要件になります。ご質問の要件は、その意味で珍しいです。
調査いただいたように、別タブからのリクエストは同一になると思いますし、タブを区別する識別子はリクエストにはついてないと思います。

そうなると、使えそうな技術としてはsessionStorageあたりかと思います。sessionStorageはJavaScriptから使えるストレージで、「タブごとに区別される」ことが特徴です。
例えば以下のような方法が考えられます。

  1. ログイン処理をした直後に1回だけJavaScriptでsessionStorageに firstSession=1 などの値をセットする
  2. ページ遷移の毎にsessionStorageを確認して、firstSessionがセットされているかを確認し、セットされていない場合は別タブからのアクセスなので、「別タブでは表示できません」などのエラーを表示する

この方法だと、煩雑ですし、JavaScriptを無効にすると回避されてしまう可能性が高いです。

そこで、「そもそもなぜ別タブからのアクセスを禁止したいか」という理由を教えていいただければ、その原因に対する解決策を提示できる可能性はあります。

投稿2022/09/28 01:50

ockeghem

総合スコア11697

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tetakaha759

2022/09/28 06:20

ご回答、ありがとうございました。 「そもそもなぜ別タブからのアクセスを禁止したいか」についてですが、同じセッションIDからシステムへタスクを実行すると、システム側で「どのセッションからのタスクであるか」が判断できなくなってしまい、動作が不安定になるためです。 セッションIDが別であれば、同じアカウントIDからのタスク実行でも、特に問題は発生しません。 よって、システム上には全て一意なセッションIDでのアクセスが、求められることになります。 こちらで、ご質問へのご回答になっていましたでしょうか。
ockeghem

2022/09/28 06:48

回答に書いたように世の中の大半のサイトは別タブからの利用も許容していて、かつ特に問題は発生しません。 なので、セッションIDが同じで問題が発生するのであれば、そちらの方が問題だと思います。別タブからの利用を制限するのは根本的解決ではないと思います。 なので、別の質問として、「動作が不安定になる」条件を書いて解決策を聞いた方がいと思います。
tetakaha759

2022/09/28 07:47

コメント、ありがとうございました。 ご指摘いただいた件について、解決策をお聞きするか再度検討いたします。 こちらのご回答を、ベストアンサーとさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.53%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問