JWTのペイロードにアクセス許可とロールを含める必要がありますか?


9

クライアントの権限と役割に関する情報をJWTに含める必要がありますか?

JWTトークンにそのような情報があると、有効なトークンが来るたびに非常に役立つため、ユーザーに関する権限に関する情報を抽出するのが簡単になり、データベースを呼び出す必要もありません。しかし、そのような情報を含め、データベースで同じことをダブルチェックしないことは、セキュリティの問題でしょうか?

または、

上記のような情報はJWTの一部ではなく、データベースのみを使用してユーザーのアクセスロールとアクセス許可を確認する必要がありますか?

回答:


7

トークンにクレームを含める目的は、リソースと認証プロバイダーの間でそのような通信を行う必要がないようにすることです。

リソースは、トークンに有効な署名があることを確認し、コンテンツを信頼することができます。

秘密鍵が認証サーバーに秘密であると仮定すると、あなたは良いです。一部のプロバイダーは、リスクを軽減するためにキーを変更しています。

考えてみれば、リソースが認証サーバーにコールバックしてクレームを取得した場合。次に、同様の信頼方法によって適切なサーバーと通信するようにします。


すばらしい回答に感謝します。「リスクを軽減するために一部のプロバイダーはキーを変更する」というあなたの発言から、あなたが何を意味するのかについてもっと知っていただけますか。?
Anshul Sahni

1
そのため、認証プロバイダは、固定の署名鍵を持っているのではなく、それを頻繁に変更し、リソースサーバーが公開鍵の半分をダウンロードするためのエンドポイントを提供します。リソースは頻繁に認証サーバーを呼び出す必要がありますが、リクエストごとに1回ではありません
Ewan

そのため、サービスによって調号が変更される
たびに

1
通常、それらには複数の可能なキーがあるため、処理中のトークンは無効化されません。トークンには、使用するリソースを指示するための「キーID」が含まれます
Ewan

ここで見落としているのは、JWTのデータが無効化された場合の処理​​方法だけです。サーバー側で役割が変更されたものの、クライアントがすべての役割のセットを持つトークンを保持しているとします。サーバー側でトークンを取り消すことができるようにする必要があります。これにより、古い情報を保持するトークンが無効になり、以降のリクエストで使用できなくなります。これは、何らかの理由で(サーバーがトークンを取り消せるように)Ewansが何らかの形で提案しているものと一致しています。
Laiv、

1

私の経験から、すべてのシステムがいくつかの中心的な役割と権限データベースを使用している場合、それらすべてをJWTに追加できます。

ただし、このアプローチは、認証サーバー自体がトークンを受信して​​信頼するターゲットシステムについて何も認識していないSSOシナリオではうまく機能しない可能性があります。

ユーザーの役割と権限は、完全にJWTトークンの受信者にあります。これは、SSO認証とJWTを、既に権限サブシステムが設定されている一部のレガシーシステムに統合する場合に特に当てはまります。


私はこれに同意します。idpはこのユーザーjwtが他のどのサービスと通信するかを認識していないため、ユーザー権限は特にSSOのjwtの一部であってはなりません。ユーザーのIDが確認されたら、リソースは承認部分を実装する必要があります
マニッシュRawat

また、JWTでの許可の要求は、単純なモノリシックAPIを超える優れたアイデアではないことにも同意します。私はそれについてのブログ記事を書いた:sdoxsee.github.io/blog/2020/01/06/...
sdoxsee
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.