ExpressJS、Mongodb(Mogoose)を使用してアプリケーションを構築しています。アプリケーションには、ユーザーがアクセスする前に認証する必要があるルートが含まれています。
現在、私は同じことをするために高速ミドルウェアを書いています。ここでは、JWTトークンの助けを借りて、ユーザーが認証されているかどうかを確認するmongodbクエリを作成しています。しかし、これが私のデータベースに不必要なリクエストの負荷をかけるかもしれないと感じています。
この特定のタスクにredisを統合する必要がありますか?
APIのパフォーマンスが向上しますか?または既存のmongodbアプローチを進める必要がありますか?
これに関するより多くの洞察を得るならば、役に立つでしょう。
TLDR:ある時点でトークンを取り消す機能が必要な場合は、はい、Redisなどの高速なものにトークンを保存します。
JWTを使用することの十分に文書化された欠点の1つは、たとえばユーザーをログアウトする必要がある場合やトークンが危険にさらされた場合にトークンを取り消す簡単な方法がないことです。トークンを取り消すとは、何らかのストレージでトークンを検索し、次に何をするかを決定することを意味します。 JWTのポイントの1つはdbへのラウンドトリップを回避することであるため、適切な妥協案は、rdbmsよりも負担の少ないものに保存することです。それはRedisにとって完璧な仕事です。
コメントで示唆されているように、良いアプローチはリストをブラックリスト(つまり、無効化されたトークンのリスト)にすることです。要求ごとにリストを検索して、トークンがリストに存在しないことを確認します。トークンを格納するために確率的アルゴリズムを使用することにより、ルックアップステップ中のメモリスペースとパフォーマンスをさらに向上させることができます。単純な実装は、トークン全体をredisブラックリストに保存しないことです。トークンの最初の数文字を保存するだけです。その後、より永続的なソリューション(ファイルシステム、rdbmsなど)を使用して、完全版のブラックリストを保存できます。これは楽観的なルックアップであり、ブラックリストにトークンが存在しないことをすぐに通知します(より一般的なケースです)。検索されているトークンがredisブラックリストのアイテムと一致する場合(最初の数文字が一致するため)、永続ストアの追加のルックアップに移動します。このためのアルゴリズムを実装するためのより効率的で比較的単純な別の方法は、ブルームフィルターと呼ばれるものです。
Redisを使用してjwtラベルを保存できます。 Redisは、このようなデータを保存するのにはるかに高速で便利です。 Redisへのリクエストがパフォーマンスに大きな影響を与えることはありません。ライブラリを試すことができます jwt-redis