JWT トークンをデコードして検査する方法

· 4 分で読めます

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 をデコードする方法

  1. トークンを貼り付ける — 完全な JWT(header.payload.signature 形式)をデコーダーに入力します。
  2. デコードされたセクションを確認 — ツールはヘッダー(アルゴリズム)、ペイロード(クレーム)、署名を整形済み JSON として表示します。
  3. クレームを検証 — 有効期限、発行者、サブジェクト、その他のカスタムクレームを確認します。

JWT を使ったデバッグ

トークンが期限切れ? exp クレームをチェックします。Unix タイムスタンプを読める日付に変換してみてください。すでに過ぎていれば、トークンは期限切れで再発行が必要です。

権限がおかしい? ペイロード内のロールやスコープのクレームを探します。実装によって異なりますが、"role": "admin""scope": "read write" のようなものが多いです。

ユーザー ID の問題? sub クレームがユーザーを識別します。期待される ID と一致するか確認してください。

トークンが拒否された? aud(audience)クレームをチェックします。API が特定の audience を期待していて、トークンに別の値が入っていれば拒否されます。

重要なセキュリティ上の注意

よくある質問

デコーダーで JWT の署名を検証できますか?

いいえ。署名検証にはサーバーに保管されている署名シークレットまたは公開鍵が必要です。デコーダーはトークンの中身を表示しますが、暗号学的検証はバックエンドで行わなければなりません。本番環境では検証されていない JWT を信頼してはいけません。

JWT をオンラインツールに貼り付けても安全ですか?

ツールがブラウザ内で動作する場合は安全です。ブラウザベースのデコーダーはトークンをローカルで処理し、サーバーには何も送信しません。トークンをネットワーク経由で送信するツールは避けてください。

exp クレームとは何ですか?

exp(expiration)クレームはトークンが期限切れになる時刻を示す Unix タイムスタンプです。この時刻を過ぎたトークンは拒否すべきです。認証問題のデバッグでは必ずこのクレームを確認してください。

JWT を暗号化することはできますか?

標準的な JWT(JWS)は署名されますが暗号化されません — 誰でもペイロードをデコードできます。JWE(JSON Web Encryption)トークンは暗号化されていますが、あまり一般的ではありません。標準の JWT ペイロードに機密データ(パスワードやシークレット)を入れることは絶対に避けてください。