web-dev-qa-db-ja.com

JWTでロールを設定することはベストプラクティスですか?

JWTの使用を検討しています。 jwt.ioの例 では、ペイロードデータに次の情報が表示されています。

"admin": true

管理者はロールと見なすことができるため、私の質問です。トークンペイロードでの役割の設定は習慣的/良い習慣ですか?ロールを動的に変更できることを考えると、私は非常に疑問です。

12
ayorosmage

クライアントにとって有益な場合、トークンに追加情報を保存するためにクレームを作成することを妨げるものはありません。

ただし、JWTに依存するのは認証(呼び出し元)のみです。 authorization(呼び出し側ができること)を実行する必要がある場合は、永続ストレージから呼び出し側の役割/許可を検索して、最新の値を取得します。

10
cassiomolin

公式のJWTサイトでは、JWTのユースケースとして「認可」(「認証」とは対照的に)を明示的に言及しています。

JSON Web Tokensはいつ使用する必要がありますか? Authorization:これは、JWTを使用する最も一般的なシナリオです。ユーザーがログインすると、後続の各リクエストにJWTが含まれ、ユーザーはそのトークンで許可されているルート、サービス、およびリソースにアクセスできます。シングルサインオンは、オーバーヘッドが小さく、さまざまなドメインで簡単に使用できるため、現在JWTを広く使用している機能です。

そうは言っても、セキュリティの観点から、トークンにロールまたはアクセス許可を本当に含めるかどうかを再検討する必要があります。

(以下のテキストは、かなり短期間の受け入れられた答えへのより「詳細な」フォローアップとして理解することができます)

トークンを作成して署名したら、トークンの有効期限が切れるまで許可を与えます。しかし、誤って管理者権限を付与した場合はどうなりますか?トークンの有効期限が切れるまで、誰かが誤って割り当てられた権限であなたのサイトを操作しています。

一部の人々は、トークンが短命であると主張するかもしれませんが、これは、人が短時間で行うことができる害の量を考えると、強力な議論ではありません。他の人々は、トークンの個別のブラックリストデータベーステーブルを維持することを推奨します。これにより、トークンの無効化の問題は解決されますが、バックエンドに何らかのセッション状態追跡が追加されます。 –そのため、リクエストが到着するたびにブラックリストにdb-callを行い、まだブラックリストに登録されていないことを確認する必要があります。これは「余分なdb-callを避けるためにロールをJWTに入れない」という目的に反すると主張するかもしれません:ブラックリストに対してdb-callを行う場合、代わりにdb-callを行ってブラックリストを持たないようにします。

したがって、認証クレームをトークンに追加する代わりに、ユーザーのロールとアクセス許可に関する情報を、いつでも完全に制御できる認証サーバーのデータベースに保持できます(たとえば、ユーザーの特定のアクセス許可を取り消す)。リクエストが到着した場合、現在のロールを認証サーバー(またはアクセス許可を保存している場所)から取得します。

ちなみに、 IANAによって登録されたパブリッククレーム のリストを見ると、これらのクレームは認証を中心に進化しており、ユーザーが許可されていることを処理していないことがわかります(承認)。

だから要約すると...

  • JWTにロールを追加する(a)利便性が重要であり、(b)権限を取得するための余分なデータベース呼び出しを避けたい場合、および(c) (d)権限の追加によるJWTのペイロードの(わずかな)増加については気にしないでください。

  • JWTにロールを追加し、ブラックリストを使用します(a)ある人に与えてはいけない権利が割り当てられている時間枠を防ぎたい場合(b)着信リクエストごとにブラックリストへのリクエストを作成するコストがかかることを受け入れます。(c)権限の追加によるJWTのペイロードの(わずかな)増加を気にしません。

  • JWTにロールを追加せず、オンデマンドでフェッチする(a)権利が割り当てられている時間枠を禁止したい場合tまたは(b)ブラックリストのオーバーヘッドを回避するか、(c)JWTペイロードのサイズをわずかに増やすことを避け、(d)着信リクエストのロールを時々/常にクエリするコストがかかることに同意する場合。

11
B12Toaster

前述の here で、ASP.NET CoreはJWTで言及されているrolesを自動的に検出します。

{
  "iss": "http://www.jerriepelser.com",
  "aud": "blog-readers",
  "sub": "123456",
  "exp": 1499863217,
  "roles": ["Admin", "SuperUser"]
}

アプリケーションの特定の部分を保護するために一般的に使用される ASP.NETロール にそれらを「マッピング」します。

[Authorize(Roles = "Admin")]
public class SettingsController : Controller

JWTを提供(および署名)するサーバーは、一般的に authorization server と呼ばれ、単なるauthentication serverとは呼ばれません、したがって、JWTにロール情報(またはスコープ)を含めることは、それらが 登録されたクレーム でなくても意味があります。

8
Glorfindel