JWTアクセストークンの仕組み
JWTアクセストークンの仕組み、APIリクエストの認可方法、短期間にすべき理由、含めるべきクレーム、リフレッシュトークンとの違いについて解説します。
詳細な説明
アクセストークンは、保護されたリソースへのアクセスをベアラーに許可する認証情報です。JWTとして実装された場合、アクセストークンは自己完結型の署名付きトークンであり、リソースサーバーが追加のデータベースクエリや認可サーバーへの呼び出しなしにリクエストを認可するために必要なすべての情報を持ちます。
アクセストークンの構造:
{
"iss": "https://auth.example.com",
"sub": "user_abc123",
"aud": "https://api.example.com",
"exp": 1700001500,
"iat": 1700000600,
"scope": "read:data write:data",
"roles": ["editor"]
}
トークンには、アイデンティティと有効性のための標準クレーム(iss、sub、aud、exp)と、認可判断のためのアプリケーション固有のクレーム(scope、roles)が含まれます。リソースサーバーは署名を検証し、有効期限を確認し、受信者が自身と一致するか検証し、クレームを使用してリクエストされた操作を許可するかどうかを判断します。
短い有効期間が重要な理由:
アクセストークンの有効期間は短く設定すべきで、通常5〜15分です。JWTは一度発行されると簡単に失効させることができないため、有効期間が短いほど、盗まれたトークンを攻撃者が悪用できるウィンドウが限定されます。有効期限後、クライアントはリフレッシュトークンを使用して新しいアクセストークンを取得する必要があり、これが認可サーバーにとってユーザーの現在のステータスと権限を確認する自然なチェックポイントとなります。
アクセストークンに含めるべき内容:
リソースサーバーが認可判断に必要なクレームのみを含めてください。大量のデータの埋め込みは避けてください。すべてのクレームがトークンサイズを増加させ、トークンはすべてのAPIリクエストとともに送信されます。ユーザーの識別子、ロールまたはパーミッション、トークンの意図された受信者とスコープを含めてください。機密性の高い個人情報は含めないでください。JWTはエンコードされているだけで暗号化されていないため、傍受した誰もがデコードできます。
送信と検証:
アクセストークンは通常、HTTP Authorizationヘッダーで送信されます: Authorization: Bearer eyJhbGc...。リソースサーバーはトークンを抽出し、発行者の公開鍵(RS256/ES256の場合)または共有秘密鍵(HS256の場合)を使用して署名を検証し、expとaudクレームを確認し、埋め込まれたクレームに基づいて認可を評価します。このステートレスな検証が、JWTアクセストークンが水平スケーリングにおいて魅力的である理由です。
ユースケース
REST APIがすべてのリクエストで受信したJWTアクセストークンを検証し、scopeクレームをチェックして呼び出し元がアクセスしているエンドポイントに対する権限を持っているか確認します。