Open2
JWT(Json Web Token) について📝

JWT(Json Web Token) について📝
JWTは、JSON形式のデータを用いたトークンで、認証や情報交換のために使われるオープンスタンダード(RFC 7519)です。主にWebアプリケーションで、ユーザー認証や権限管理を安全かつ効率的に行うために利用されます。
JWTは以下のような特徴を持っています:
- コンパクト: 軽量で、HTTPヘッダーやURLに簡単に埋め込める。
- 自己完結的: トークン自体に必要な情報が含まれており、サーバー側でデータベースを参照せずに検証可能。
JWTの構造
JWTは「ヘッダー(Header)」「ペイロード(Payload)」「署名(Signature)」の3つの部分で構成され、それぞれをドット(.
)で区切った形式で表されます。たとえば:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
1. ヘッダー(Header)
- トークンのタイプ(通常は
"JWT"
)と署名に使用するアルゴリズム(例:HMAC SHA256
やRSA
)を指定。 - JSON形式で記述され、Base64Urlでエンコードされる。
{ "alg": "HS256", "typ": "JWT" }
2. ペイロード(Payload)
- トークンに含まれる実際のデータ(クレーム、Claimsと呼ばれる)。
- 主に3種類のクレームがある:
-
登録済みクレーム:
iss
(発行者)、sub
(対象)、exp
(有効期限)、iat
(発行時刻)など。 - 公開クレーム: 任意の公開情報(例: ユーザーIDやロール)。
- プライベートクレーム: アプリケーション固有のデータ。
-
登録済みクレーム:
- 例:
{ "sub": "1234567890", "name": "John Doe", "iat": 1516239022 }
- これもBase64Urlでエンコードされる。
3. 署名(Signature)
- ヘッダーとペイロードを結合し、秘密鍵(または公開鍵/秘密鍵ペア)を使って署名したもの。
- 署名アルゴリズム(例: HS256)に基づいて生成され、トークンの改ざん防止に役立つ。
- 計算式(HS256の場合):
HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
JWTの仕組み
- 発行: ユーザーがログインすると、サーバーはJWTを生成し、ユーザーに返す。
-
送信: クライアント(ブラウザやアプリ)は、リクエストのたびにJWTをHTTPヘッダー(通常は
Authorization: Bearer <token>
)に含めてサーバーに送信。 - 検証: サーバーは署名を検証し、トークンが有効かつ改ざんされていないことを確認後、ペイロードの情報(例: ユーザーID)を利用して処理を行う。
主な用途
- 認証(Authentication): ユーザーがログインした後、セッション管理の代わりにJWTを使って認証状態を維持。
- 認可(Authorization): ロールや権限情報をペイロードに含めてアクセス制御に利用。
- 情報交換: サーバー間やクライアント-サーバー間で安全にデータを共有。
利点
- ステートレス: サーバーがセッション情報を保持する必要がないため、スケーラビリティが高い。
- 分散システム対応: トークン自体に情報が含まれるため、複数のサーバーで共有可能。
- クロスプラットフォーム: JSONベースなので、さまざまな言語や環境で簡単に扱える。
注意点と課題
-
トークンの取り消しが難しい: 有効期限(
exp
)が切れるまでトークンは有効。取り消しにはブラックリスト管理が必要。 - ペイロードは暗号化されない: Base64Urlエンコードは単なるエンコードであり、暗号化ではない。機密情報は含めないように注意。
- サイズ: 情報量が増えるとトークンが長くなり、HTTPヘッダーのサイズ制限に影響する可能性がある。
- セキュリティ: 秘密鍵が漏洩すると署名が偽造されるリスクがある。また、XSS(クロスサイトスクリプティング)でトークンが盗まれる可能性も考慮が必要。
実際の使用例
- シングルサインオン(SSO): 一度のログインで複数のサービスにアクセス可能。
- API認証: REST APIなどでクライアントがサーバーにアクセスする際のトークンとして利用。
補足
JWTは、用途に応じて適切に設計することが重要です。
例えば、機密性の高いデータは暗号化(JWE: JSON Web Encryption)と組み合わせて使うこともあります。

JWTの実装について参考事例📝
echo 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9' | base64 -d