Spring Boot、Spring Security、OAUTH2、JWTを認証トークンとして使用する基本認証システムを実装しました。それは大丈夫ですが、データベースにJWTを保存し、誰かがそれを使用して認証されたリクエストを行うたびにトークンが存在するかどうかをチェックするのが理にかなっていると思っていましたか?具体的には、次のシナリオを考えていました。ユーザーはモバイルデバイスで認証され、そのデバイスを失くして、そのデバイスの認証を解除したいのです。その後、ユーザーIDに発行されたトークンをクリアし、彼に割り当てられたすべてのトークンの認証を解除する操作を発行できます。その他の方法で?私はこれを間違っていると考えていますか、それとも過度に複雑なことですか?
これは、モバイルアプリから呼び出されるREST APIを保護するためです。
JWTをデータベースに保存することはできますが、JWTの利点の一部が失われます。 JWTには、暗号化を使用してトークンが正当であることを確認できるため、毎回db内のトークンをチェックする必要がないという利点があります。データベースでトークンを検索する必要がある場合は、情報を伝達しない不透明なトークンを使用して、サーバーとデータベースに情報を提供することもできます。一方、dbにトークンを保存する場合、JWTがトークンタイプに適しているとは思いません。言ったように、トークンをdbに保存すると失効の利点があります。それはすべて、あなたが何を達成したいのかに依存します(より速い認可など対オンデマンドで取り消す能力)。
必要に応じて、dbにトークンを保存せずにOWT2でJWTを使用できます。 JWTには設定可能な有効期限がありますが、それ以降は無効になります。通常、アクセストークンは(JWTであるかどうかに関係なく)セキュリティのために短命でなければなりません。誰かの電話が盗まれてアクセストークンが取得されることが懸念される場合、解決策はそれらのトークンをすぐに期限切れにすることだと思います(30分?)。 oauth2を使用している場合、誰かがアプリの使用を停止する手段は、実際の所有者が承認サーバー上のモバイルアプリクライアントの認証を解除して、アクセストークンが発行されないようにすることです。
有効期限を設定できます(モバイル1週間の場合)。ユーザーのカスタムフィールドrefreshId
を追加します(これにはuuidを使用できます)。次のセットは、クレームパラメーターで発行(「iat」)。 refreshId
をdbに保存し、それをClaimsパラメーターとして設定します。次に、トークンを検証するたびに、トークンの「年齢」を確認する必要があります。 1時間以上経過している場合は、DBからデータをロードしてrefreshId
値を確認し、現在の「iat」値で新しいトークンを作成してモバイルデバイスに送信する必要があります。トークンを無効にする必要がある場合は、dbでrefreshId
の新しい値を生成するだけです。 1時間後、すべてのトークンが正しくなくなるため、ユーザーはすべてのデバイスに再度ログインする必要があります。必要に応じて、より多くのカスタムソリューションを作成できます。