web-dev-qa-db-ja.com

ステートレスアーキテクチャでオンラインユーザーを追跡する

私はステートレスアーキテクチャを所有しており、認証時にクライアントとサーバー間でJWTトークンを交換します。

データベースに(1日に1回)ユーザーアクセスに関連するタイムスタンプを保存したい。
確かに、誰がアプリにアクセスしていたのかを1日程度のマージンで示すことができるようにしたいと思います(かなりオンラインユーザーのようなものです)。

良い解決策(各クライアント要求でデータベースにヒットしないようにするため)私は、recentUserAccessTimestampというプロパティをJWTトークンに追加し、すべての要求でそれをクライアントに送信することを推測しました。

質問です:サーバーでの各リクエストの直後に、クライアントに既存のトークン(WebAppの場合はLocalStorageなど)を置き換えることをお勧めしますか?

4
Mik378

リクエスト間でJWTをローテーションすることは確かに可能ですが、すぐにいくつかの問題が発生します。

  • JWTを発行するためにどのサイドチャネルを使用しますか? HTTP応答ヘッダー?拡張レスポンスボディ?
  • クライアントはどのようにして複数の同時リクエストを発行できますか? JWTは要求/応答サイクル全体でローテーションされるため、既存のJWTを再利用するとファンキーな競合状態が発生します。

すべてのクライアント要求でDBを更新したくないと言っていました。しかし、JWTをローテーションする場合、とにかく新しいJWTをRedisまたは別の永続化メカニズムに保存する必要はありませんか?したがって、リクエストごとにユーザーアクセスデータを格納するだけでよいと思います。

マーケティング担当者は、取得する分析データの種類にバナナを使います。それを保存することでen masseを使用すると、同僚の苦痛を大幅に軽減でき、ヒーローのように見えます。

1つの最後の考え。問題のデータの一部の損失を許容できる場合は、メインアプリケーションのメモリ内キューに書き込むだけです。バックグラウンドスレッドは、データを永続ストアに定期的にフラッシュできます。今、誰もが勝ちます。

1
user169469

数分前にこれを探していたところ、この質問に遭遇しました。奇妙なことですが、私はこれに対する正解にまっすぐ進むことを期待していました。

それで私は思いつきました。私はそれを行う最善の方法は、サードパーティまたはあなたのセカンドサーバーを通してそれを処理することであると信じています。つまり、モバイルアプリを構築している場合は、成功したログインとログアウトの両方でセッションを設定できる分析ツールを統合できます。

クライアントを制御できず、サーバーサイドで実行したい場合:

  • トークンの有効期限を1〜2時間程度の短い値に設定します。
  • クライアントに適切なトークン更新メカニズムを作成する
  • 新しいlatest_activity-または必要なもの-日時列/フィールドをユーザーに追加します-またはそれを呼び出すもの-テーブル/コレクション
  • クライアントからのリクエストが成功するたびに-ユーザーは認証され、ユーザーの行のこの列を更新し、現在の日付と時刻に設定します-このためのユーティリティ関数を作成します。
  • 分析する際、ユーザーからのリクエストが1/2時間以内に受信されなかった場合(つまり、上記のトークンの有効期間が短い場合)、ユーザーはログアウトしていると想定できます。

SQLiteのような別のデータベースでこれを行うこともできます。はるかに高速。

0
Nick Rameau