JWT トークンをデコードして検査する方法
JSON Web Token(JWT)は、最新の Web アプリケーションで認証を扱うもっとも一般的な方法です。認証関連で問題が起きたとき — ユーザーが理由なくログアウトされたり、権限が間違っていたり、API が 401 を返したり — JWT のデコードはたいてい最初のデバッグステップになります。
JWT に含まれるもの
JWT はピリオドで区切られた 3 つの部分から成ります:
eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NTY3ODkwIn0.dozjgNryP4J3jVmNHl0w5N_XgL0n3I9PlFUP0THsR8U
ヘッダー — アルゴリズム(HS256、RS256 など)とトークンの種類が含まれます。
{"alg": "HS256", "typ": "JWT"}
ペイロード — ユーザーやトークンに関するクレーム(主張)が含まれます。
{"sub": "1234567890", "name": "Alice", "exp": 1700000000}
署名 — トークンが改ざんされていないことを保証する暗号学的フィンガープリントです。署名鍵がなければ読み取れません。
よくある JWT クレーム
| クレーム | 正式名称 | 内容 |
|---|---|---|
sub |
Subject | ユーザー ID または識別子 |
exp |
Expiration | 有効期限の Unix タイムスタンプ |
iat |
Issued At | 作成日時の Unix タイムスタンプ |
iss |
Issuer | 誰がトークンを作成したか(認証サーバー) |
aud |
Audience | トークンの宛先 |
nbf |
Not Before | この日時より前にはトークンは有効ではない |
jti |
JWT ID | トークン固有の識別子 |
JWT をデコードする方法
- トークンを貼り付ける — 完全な JWT(header.payload.signature 形式)をデコーダーに入力します。
- デコードされたセクションを確認 — ツールはヘッダー(アルゴリズム)、ペイロード(クレーム)、署名を整形済み JSON として表示します。
- クレームを検証 — 有効期限、発行者、サブジェクト、その他のカスタムクレームを確認します。
JWT を使ったデバッグ
トークンが期限切れ? exp クレームをチェックします。Unix タイムスタンプを読める日付に変換してみてください。すでに過ぎていれば、トークンは期限切れで再発行が必要です。
権限がおかしい? ペイロード内のロールやスコープのクレームを探します。実装によって異なりますが、"role": "admin" や "scope": "read write" のようなものが多いです。
ユーザー ID の問題? sub クレームがユーザーを識別します。期待される ID と一致するか確認してください。
トークンが拒否された? aud(audience)クレームをチェックします。API が特定の audience を期待していて、トークンに別の値が入っていれば拒否されます。
重要なセキュリティ上の注意
- JWT は暗号化されていません — 誰でもペイロードをデコードできます。パスワード、API キー、その他の機密情報を JWT に入れてはいけません。
- 署名は必ずサーバー側で検証する — デコーダーはトークンが何を主張しているかを示しますが、改ざんされていないことを証明できるのは署名検証だけです。
- 有効期限をチェック — 期限切れのトークンは常に拒否すべきです。アプリが期限切れのトークンを受け入れているなら、それはセキュリティ上の欠陥です。
よくある質問
デコーダーで JWT の署名を検証できますか?
いいえ。署名検証にはサーバーに保管されている署名シークレットまたは公開鍵が必要です。デコーダーはトークンの中身を表示しますが、暗号学的検証はバックエンドで行わなければなりません。本番環境では検証されていない JWT を信頼してはいけません。
JWT をオンラインツールに貼り付けても安全ですか?
ツールがブラウザ内で動作する場合は安全です。ブラウザベースのデコーダーはトークンをローカルで処理し、サーバーには何も送信しません。トークンをネットワーク経由で送信するツールは避けてください。
exp クレームとは何ですか?
exp(expiration)クレームはトークンが期限切れになる時刻を示す Unix タイムスタンプです。この時刻を過ぎたトークンは拒否すべきです。認証問題のデバッグでは必ずこのクレームを確認してください。
JWT を暗号化することはできますか?
標準的な JWT(JWS)は署名されますが暗号化されません — 誰でもペイロードをデコードできます。JWE(JSON Web Encryption)トークンは暗号化されていますが、あまり一般的ではありません。標準の JWT ペイロードに機密データ(パスワードやシークレット)を入れることは絶対に避けてください。