JSON Web トークン (JWT)
JSON Web Token (JWT) はエンコードされたデータを表します。 コンパクトで自己完結型、そして安全です。 JSON Web トークンには主に 2 つの種類があります。
- 暗号化された JWT: トークンの機密性が確保され、意図した受信者だけがその内容を読み取ることができます。
- 署名された JWT: トークンの整合性が保証され、受信者はトークンが変更されていないことを確認できます。
| 機能 | 署名されたJWT | 暗号化されたJWT |
|---|---|---|
| 完全性 | はい | はい |
| 秘密保持 | いいえ | はい |
| 目的 | トークンが改ざんされていないことを確認し、送信者の身元を確認します。 | 意図した受信者だけがトークンを読み取れるようにする |
JWT にはクレームが含まれます。 暗号化された JWT の場合、クレームは非表示になります。 署名された JWT の場合は、クレームの整合性を検証できます。 Liferay は署名された JWT を使用して送信者の ID を確認します。 クライアントが JWT に署名する方法は 2 つあります。
- 対称キー (共有シークレット): 対称キー署名では、必要な当事者間でクライアント シークレットを共有します。 共有シークレットを使用して JWT に署名すると、認可サーバーによって検証されます。 有効な場合、認可サーバーはアクセス トークンを発行します。
- 非対称キー (公開キー/秘密キーのペア): 非対称キー署名では、秘密キーを使用して JWT に署名します。 サーバーは署名を検証するための公開鍵を保持します。 有効な場合、認可サーバーはアクセス トークンを発行します。
JWT構造
JWT には、ヘッダー、ペイロード、署名の 3 つの部分が含まれており、ドット (.) で区切られています。)。
ヘッダ
JOSE (JSON Object Signing and Encryption) ヘッダーとも呼ばれ、使用されるハッシュ アルゴリズム、JWT のタイプ、場合によってはキー ID (kid) を宣言するキーと値のペアが含まれます。
{
"alg": "HS256",
"typ": "JWT"
}
ペイロード
ペイロードには、エンティティ (通常はユーザー) に関する属性が含まれます。 これらの属性は一般にクレームと呼ばれます。
{
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022
}
署名
署名は送信者を識別します。 JWT に小さな変更を加えると、署名が無効になります。 署名を取得するには、ヘッダーとペイロードを Base64 でエンコードし、共有秘密キーまたは秘密キーを使用したハッシュ アルゴリズムを使用して署名します。 その後、再度 Base64 でエンコードされます。
| 一部 | オリジナル | Base64エンコード |
|---|---|---|
| ヘッダ | {"alg":"HS256","typ":"JWT"} | eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 |
| ペイロード | {"sub":"1234567890","name":"John Doe","iat":1516239022} | eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ |
| 署名 | Base64(エンコードされたヘッダー & ペイロードは共有秘密鍵または秘密鍵を使用して署名されます) | eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c |
共有秘密の場合、アルゴリズムは対称 (HS256) である必要があり、秘密鍵の場合、アルゴリズムは非対称 (RS256) である必要があります。
JWTの形成
ヘッダーとペイロードはBase64でエンコードされ、ドット(.)で区切られます。)。 署名値はBase64でエンコードされ、ペイロードの後に(.で区切られて追加されます。)。
これら 3 つを組み合わせると、サンプル JWT が生成されます。
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
JWTを使用する理由
- JWT にはエンティティに関する必要な情報がすべて含まれているため、サーバーはセッション データを保存する必要はありません。 これにより、システムはステートレスかつスケーラブルになります。
- 通常のアクセス トークンでは、多くの場合、サーバーがトークンを保存し、有効期限をチェックする必要があります。 これにより、API 呼び出しとデータベース検索の回数が増加し、JWT と比較して効率が低下します。
- JWT は業界標準に準拠しており、異なるシステム間での導入が容易です。 通常のアクセス トークンでは独自の形式が使用される場合があります。