JWT Token Decode(JSON Web Token の解読とクレーム読み方)
JWT 認証 セキュリティ JavaScript
結論:30秒で JWT トークンを解析する
- 構造:
Header.Payload.Signature(ドット区切りの Base64URL) - exp クレーム: トークン有効期限(Unix タイムスタンプ秒)
- 解析ツール: 下のコンポーネントで完全ローカル解析
1. オンライン JWT デコーダー
JWT文字列を貼り付けると、Header と Payload の JSON をブラウザ内のみで解析します(データは外部に送信されません)。
🔍 この場でJWTをデコードして中身を確認する
注意: このツールはデコードのみ行います。署名検証は行いません。改ざん検知には利用できません。
※ 入力・貼り付け時に自動でデコードされます
署名の検証 (Signature Verification)
2. JWT の 3 パート構造
JWTはドット(.)で区切られた3つの Base64URL 文字列で構成されています。
eyJhbGciOiJIUzI1Ni... . eyJzdWIiOiIxMjM0NTY3... . SflKxwRJSMeKKF2QT4f...
[ Header (ヘッダー) ] . [ Payload (ペイロード) ] . [ Signature (署名) ]
- Header (ヘッダー): アルゴリズム(
alg:HS256,RS256等)やトークン種別(typ:JWT)を格納。 - Payload (ペイロード): ユーザーIDや権限などのクレーム(Claims)情報。※暗号化されていないため平文と同等です。
- Signature (署名): 改ざん検知用の検証コード(秘密鍵または公開鍵で照合)。
3. 主要な標準クレーム(Registered Claims)一覧
| クレーム名 | 名称 | 形式 | 説明 |
|---|---|---|---|
exp | Expiration Time | Unixタイムスタンプ(秒) | トークンの有効期限。現在時刻がこの値を越えると無効 |
iat | Issued At | Unixタイムスタンプ(秒) | トークンの発行日時 |
nbf | Not Before | Unixタイムスタンプ(秒) | 処理開始可能日時(この時刻以前は無効) |
iss | Issuer | 文字列 (URL等) | トークンの発行者 (例: https://auth.example.com) |
aud | Audience | 文字列 / 配列 | トークンの利用対象者 (例: https://api.example.com) |
sub | Subject | 文字列 | トークンの主体 (ユーザーID等) |
4. JavaScript でライブラリなしで JWT をデコードするコード
function parseJwt(token) {
try {
const base64Url = token.split('.')[1];
const base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');
const jsonPayload = decodeURIComponent(
atob(base64)
.split('')
.map(c => '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2))
.join('')
);
return JSON.parse(jsonPayload);
} catch (e) {
console.error("JWT デコード失敗:", e);
return null;
}
}
5. 注意点(ハマりどころ)
alg: "none"攻撃(トークン検証バイパス)- ヘッダーの
algをnoneに書き換えて署名を削除する古い脆弱性攻撃が存在します。サーバー側では特定の検証済みアルゴリズム(HS256,RS256)のみを明示許可してください。
- ヘッダーの
localStorageへの JWT 保存による XSS リスク- JWT を
localStorageに保存すると XSS 攻撃で奪取されるリスクがあります。HttpOnlyかつSameSite属性を付与した Cookie に保存するのが安全です。
- JWT を