JWT(JSON Web Token)の基礎
1. JWTとは?
JWT(JSON Web Token)は、ユーザー認証と情報交換のために広く使用されるコンパクトでURLセーフなトークン形式です。JWTはJSON形式のクレーム(情報)を含むトークンで、セキュリティを保ちながらデータの転送を簡単に行うことができます。
2. JWTの構造
JWTは3つの部分から構成されており、それぞれがドット(.
)で区切られています。これらの部分は、以下の通りです。
- ヘッダー(Header)
- ペイロード(Payload)
- 署名(Signature)
2.1 ヘッダー(Header)
ヘッダーには、トークンのタイプ(JWTであること)と使用する署名アルゴリズム(例えばHMAC SHA256またはRSA)を指定します。
{
"alg": "HS256",
"typ": "JWT"
}
このヘッダーはBase64URLエンコードされ、トークンの最初の部分を構成します。
2.2 ペイロード(Payload)
ペイロードには、トークンのクレームが含まれています。クレームには、登録済みクレーム、公開クレーム、非公開クレームの3種類があります。
- 登録済みクレーム:トークンの有効期限(exp)、発行者(iss)、対象者(sub)などの標準的なクレーム。
- 公開クレーム:定義されたクレームで、共有が推奨されるもの。
- 非公開クレーム:定義したクレームで、アプリケーション固有のもの。
例:
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}
このペイロードもBase64URLエンコードされ、トークンの二番目の部分を構成します。
2.3 署名(Signature)
署名部分は、エンコードされたヘッダー、ペイロード、秘密鍵を使用して生成されます。これにより、トークンの改ざんが防止されます。
署名の作成例(HMAC SHA256を使用):
HMACSHA256(
base64UrlEncode(header) + "." + base64UrlEncode(payload),
secret
)
署名部分は、トークンの最後の部分を構成します。
3. JWTの使用例
3.1 認証
JWTは、認証の文脈で最も一般的に使用されます。ユーザーがログインすると、サーバーはJWTを生成し、クライアントに返します。クライアントは、このトークンを以降のリクエストのヘッダーに含めて送信します。
例:
Authorization: Bearer <token>
サーバーは、受け取ったトークンを検証し、リクエストを処理します。
3.2 情報交換
JWTは、安全に情報を交換する手段としても使用されます。トークンの内容は署名によって保護されているため、送信されたデータが改ざんされていないことを確認できます。
4. JWTの利点
- コンパクト:JWTはコンパクトなため、URLやHTTPヘッダーに容易に含めることができます。
- 自己完結型:JWTはクレーム情報を自分自身に含むため、データベースアクセスが不要になります。
- セキュリティ:適切な署名アルゴリズムと秘密鍵の管理により、安全な情報交換が可能です。
5. JWTのセキュリティ
JWTの使用においては、いくつかのセキュリティベストプラクティスを守る必要があります。
- 秘密鍵の保護:署名に使用する秘密鍵は、厳重に管理する必要があります。
- 短い有効期限:トークンの有効期限を短く設定し、定期的に更新することで、リスクを軽減します。
- HTTPSの使用:トークンを送受信する際には、常にHTTPSを使用して通信を暗号化します。
JWTの構成部分を復元
JWTは3つの部分(ヘッダー、ペイロード、署名)から構成されており、それぞれの部分はBase64URLエンコードされています。以下はその各部分を復元した例です。
ヘッダー(Header)
JWTの最初の部分で、トークンのタイプと署名アルゴリズムを示しています。
エンコードされたヘッダー部分:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
デコードすると、以下のようなJSONになります:
{
"alg": "HS256",
"typ": "JWT"
}
ペイロード(Payload)
JWTの中央の部分で、ユーザーやトークンに関する情報(クレーム)が含まれています。
エンコードされたペイロード部分:
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaGgRG9lIiwiaXNTb2NpYWwiOnRydWV9
デコードすると、以下のようなJSONになります:
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}
署名(Signature)
JWTの最後の部分で、トークンの整合性を検証するために使用されます。
エンコードされた署名部分:
4pcPyMD09olPSyXnrXCjTwXyr4BsezdI1AVTmud2fU4
署名は以下のように生成されます:
HMACSHA256(
base64UrlEncode(header) + "." + base64UrlEncode(payload),
secret
)
JWTの完全な例
画像のJWTをテキスト形式で表現すると:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaGgRG9lIiwiaXNTb2NpYWwiOnRydWV9.4pcPyMD09olPSyXnrXCjTwXyr4BsezdI1AVTmud2fU4
これは、次のように構成されています:
- ヘッダー:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
- ペイロード:eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaGgRG9lIiwiaXNTb2NpYWwiOnRydWV9
- 署名:4pcPyMD09olPSyXnrXCjTwXyr4BsezdI1AVTmud2fU4
これらの3つの部分がドット(.)で区切られた形式がJWTです。Base64URLデコードを行うことで、各部分の内容を人が読める形に復元することができます。
まとめ
JWT(JSON Web Token)は、認証と情報交換のための強力で柔軟なツールです。そのコンパクトな構造と自己完結型の特性により、様々なアプリケーションで広く利用されています。適切なセキュリティ対策を講じることで、安全かつ効果的にJWTを活用することができます。