JWTデコーダー
JSON Webトークンのデコードと検査
JWTトークン
JWT(JSON Web Token)とは?
JSON Web Token(JWT)は、RFC 7519 で定義されたコンパクトでURL安全なトークン形式です。クレームのセットをJSONオブジェクトとしてエンコードし、署名——オプションで暗号化——することで、受信者がデータが改ざんされていないことを検証できます。JWTは、REST API・シングルサインオンシステム・マイクロサービス認可におけるステートレス認証の事実上の標準です。
JWTの構造:Header · Payload · Signature
すべてのJWTは、ドットで区切られた3つのbase64urlエンコードセグメントで構成されています。HeaderとPayloadは通常のJSON——誰でも読めます——で、Signatureは正しいキーでのみ検証できる暗号値です。
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJ1c2VyMTIzIiwibmFtZSI6IkFsaWNlIiwicm9sZSI6ImFkbWluIiwiaWF0IjoxNzE3MjAwMDAwLCJleHAiOjE3MTcyMDM2MDB9.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
{
"alg": "HS256",
"typ": "JWT"
}{
"sub": "user123",
"name": "Alice",
"role": "admin",
"iat": 1717200000,
"exp": 1717203600
}JWTデコーダーを使う理由
生のJWTはランダムなテキストに見えます。このツールはHeaderとPayloadを即座にフォーマット済みJSONとして表示し、コードを1行も書かずにクレームを確認し、有効期限をチェックし、アルゴリズムの選択を監査できます。
標準JWTクレーム参照
RFC 7519は7つの登録済みクレーム名を定義しています。必須ではありませんが、相互運用性のために使用が強く推奨されます。Payloadには任意のカスタムクレームを追加できます。
| クレーム | 説明 | 型 |
|---|---|---|
| iss | 発行者 — トークンを発行したエンティティを識別します——例:認証サーバーのURLまたはアプリケーション名。 | string |
| sub | サブジェクト — JWTの対象となるプリンシパルを識別します——通常はユーザーIDまたはサービスアカウント。 | string |
| aud | 対象受信者 — 想定される受信者を識別します。受信側は自身の識別子と一致することを検証する必要があります。 | string | string[] |
| exp | 有効期限 — この時刻以降はトークンを受け入れてはならないUnixタイムスタンプ。盗まれたトークンの被害を最小限にするため、必ず設定してください。 | number |
| nbf | 有効開始時刻 — この時刻より前はトークンを受け入れてはならないUnixタイムスタンプ。将来の日付のトークンをスケジュールするのに便利です。 | number |
| iat | 発行時刻 — トークンが発行されたUnixタイムスタンプ。トークンの経過時間の計算に使用されます。 | number |
| jti | JWT ID — トークンの一意識別子。使用済みJTI値をサーバー側に保存・確認することでトークンの失効を実現します。 | string |
JWT署名アルゴリズム
Headerクレームのalgは、トークンに署名したアルゴリズムを宣言します。選択はセキュリティ・パフォーマンス・サードパーティサービスが秘密鍵なしでトークンを検証できるかどうかに影響します。
| アルゴリズム | ファミリー | キータイプ | 備考 |
|---|---|---|---|
| HS256 | HMAC | Symmetric | 最も一般的。共有シークレット——シークレットを持つ者は誰でも署名・検証が可能。 |
| HS384 | HMAC | Symmetric | より強力なHMACバリアント;中程度のパフォーマンスコスト。 |
| HS512 | HMAC | Symmetric | 最も強力なHMACバリアント。 |
| RS256 | RSA | Asymmetric | 最も広く使われる非対称アルゴリズム(Google、Auth0、Okta)。秘密鍵なしで公開鍵により検証可能。 |
| RS384 | RSA | Asymmetric | より高セキュリティのRSバリアント。 |
| RS512 | RSA | Asymmetric | 最も強力なRSバリアント。 |
| ES256 | ECDSA | Asymmetric | 楕円曲線——RSAより署名が短く、モバイルとIoTで人気。 |
| PS256 | RSA-PSS | Asymmetric | RSA-PSS:PKCS1v1.5ベースのRS256より現代的で安全。 |
| none | — | — | 署名なし——致命的に危険。本番環境ではalg: noneのトークンを絶対に受け入れないこと。 |
セキュリティ上の注意事項
JWTのデコード自体は常に安全です。適切な署名検証なしにJWTを信頼することは安全ではありません。アプリケーションでトークンを使用する際は、常にこれらのルールを念頭に置いてください。
- –開発者ツールまたはこのツールでJWTをデコードして検査する
- –exp、iat、nbfを使用してトークンの有効期間を理解する
- –デバッグのためにPayloadクレームをログに記録する(機密PII は除外する)
- –algヘッダーを読んでトークンの署名方法を理解する
- –サーバー側で署名を検証せずにPayloadのクレームを信頼する
- –alg: noneのトークンを受け入れる——これは署名が全くないことを意味する
- –高セキュリティアプリケーションでアクセストークンをlocalStorageに保存する(httpOnlyクッキーを推奨)
- –機密権限を持つトークンのexpを遠い将来に設定する
一般的なユースケース
コードでのJWTデコード
HeaderとPayloadはbase64urlエンコードされています——エンコードを逆にするだけです。base64urlは+を-に、/を_に置き換え、=のパディングを省略します。Signatureだけが秘密鍵を必要とします。
function decodeJWT(token) {
const [, payload] = token.split('.')
const json = atob(payload.replace(/-/g, '+').replace(/_/g, '/'))
return JSON.parse(json)
}const [, payload] = token.split('.')
const decoded = JSON.parse(
Buffer.from(payload, 'base64url').toString()
)import base64, json
def decode_jwt(token):
payload = token.split('.')[1]
padding = '=' * (-len(payload) % 4)
return json.loads(base64.urlsafe_b64decode(payload + padding))TOKEN="eyJhbGc..." echo $TOKEN | cut -d. -f2 | base64 -d 2>/dev/null | jq .