JWTのsub(主体)クレーム

JWT sub(主体)クレームの仕組み、トークンのプリンシパルの識別方法、サブジェクト値のベストプラクティス、認可における役割について解説します。

Claim

詳細な説明

sub(主体)クレームは、JWTの対象となるプリンシパルを識別します。ほとんどのアプリケーションでは、これはユーザーIDまたはアカウント識別子です。JWT仕様(RFC 7519)では、subの値は発行者のコンテキスト内でローカルに一意であるか、グローバルに一意である必要があり、文字列でなければなりません。

一般的な使用法:

{
  "sub": "auth0|507f1f77bcf86cd799439011",
  "name": "Jane Developer",
  "iat": 1700000000,
  "exp": 1700003600
}

ここで、subクレームにはIDプロバイダーからの一意のユーザー識別子が含まれています。この値は、受信サービスがデータベース内のユーザーを検索し、認可ルールを適用し、リクエストを特定のアカウントに関連付けるために使用します。

subに何を入れるべきか:

データベースの主キー、UUID、またはプロバイダー固有のユーザーIDなどの不変で安定した識別子を使用してください。メールアドレスやユーザー名のような変更可能な値を主体として使用しないでください。ユーザーがこれらを変更する可能性があるためです。メールアドレスを使用していてユーザーがメールを変更した場合、古いトークンのsubは正しくマッピングされなくなります。UUIDのような不変IDはこの問題を恒久的に解決します。

マルチテナントシステムにおけるsub:

マルチテナントアーキテクチャでは、subクレームだけではテナント間でユーザーを一意に識別するのに十分でない場合があります。iss(発行者)クレームと組み合わせてグローバルに一意なアイデンティティを作成してください。JWT仕様では、(iss, sub)のペアが一意であることが保証されています。例えば、発行者https://tenant-a.auth.comからのsub: "user123"と、https://tenant-b.auth.comからのsub: "user123"は異なるアイデンティティです。

認可と認証:

subクレームはトークンが誰を表すかを識別します(認証)が、何ができるかを規定するものではありません(認可)。認可の判断は、ロール、パーミッション、スコープなどの追加クレームに基づいて行うべきです。subクレームの存在だけでアクセスを許可しないでください。常にトークン署名を検証し、主体がリクエストされたリソースに対して必要なパーミッションを持っているか確認してください。

ユースケース

APIゲートウェイが各リクエストのJWTからsubクレームを抽出し、正しいユーザーコンテキストにルーティングして、ユーザーごとのレート制限を適用します。

試してみる — JWT Decoder

フルツールを開く