JWT デコーダー
header・payload・期限を確認。検証なし・送信なし。

JWT の有効期限と payload を確認する方法 (2026)

401 が出たとき、トークンの期限切れか権限不足か。JWT の payload と exp を安全に読む方法を整理します。

緑色の背景に『JWT デコード』の大きな文字と header・payload・signature の3つの断片、期限切れバッジが並ぶ開発者向けの表紙画像。

サーバーが 401 Unauthorized を返します。トークンの期限切れでしょうか、それとも権限が足りないのでしょうか。答えはトークンの中に書かれているのに、長くて意味のない文字列に見えるため、つい再ログインで済ませてしまいがちです。まずはその文字列を開いて読む方法から整理します。

JWT は暗号化ではなくエンコードである

JSON Web Token はドット(.)で繋いだ3つの断片です。header.payload.signature の順で、それぞれが base64url でエンコードされています。

よくある誤解がここで生まれます。base64url は暗号化ではなく単なるエンコードなので、秘密鍵がなくても誰でも元に戻して読めます。つまり payload に入ったユーザー ID や権限は、トークンを持つ人全員に見えます。パスワードや機微な情報を payload に入れてはいけない理由です。

payload に入るクレームを読む

payload の中の各項目をクレーム(claim)と呼びます。RFC 7519 が標準クレームを定義しているので、名前さえ分かれば意味がすぐ読めます。

クレーム意味
iss発行者 (issuer)
subトークンの主体 (subject、通常ユーザー ID)
aud対象 (audience)
exp有効期限 (expiration)
iat発行時刻 (issued at)
nbf有効開始時刻 (not before)
jtiトークン固有 ID

expiatnbf の3つが時刻クレームで、デバッグで最もよく目にします。

有効期限の確認: exp は Unix エポックなので読みにくい

exp が有効期限なのですが、値は 1700003600 のような数値です。人が読むためではなく Unix エポック、つまり1970年からの経過秒数です。

そこでツールが変換を代行します。PiPi Worlds の JWT デコーダーにトークンを入れると、payload と一緒に時刻クレームが ISO 形式に展開されます。たとえば iat: 17000000002023-11-14T22:13:20Zexp: 17000036002023-11-14T23:13:20Z に変換され、両者の差からこのトークンの有効期間が1時間だと分かります。有効期限が現在より過去なら期限切れバッジが付きます。401 が出たとき、このバッジひとつで「期限切れで更新が必要か」がすぐ判別できます。

デコードは検証ではない

最も大切な区別です。トークンをデコードして中身を読むことと、そのトークンが本物か検証することは別物です。

3つ目の断片である署名(signature)は、発行者が秘密鍵で作った値です。改ざんされていないか確認するには、同じ秘密鍵か公開鍵で署名を再計算して照合する必要があります(RFC 7515)。デコーダーは鍵を受け取らず保持もしないため、検証は行いません。したがってデコードして見える payload は「サーバーが署名を検証するまでは信頼できない値」として扱うべきです。payload の roleadmin と書いてあっても、検証なしにその言葉を信じてはいけません。

その本番トークン、どこに貼っていますか

ここでセキュリティ事故がよく起きます。401 をデバッグしようと、本番環境のアクセストークンを適当なオンラインデコーダーに貼り付けるケースです。トークンそのものが認証手段なのに、入力をサーバーへ送信するサイトなら、その瞬間トークンが第三者に渡ります。

PiPi Worlds の JWT デコーダーは、デコードがすべてブラウザ内で完結します。トークンは送信・記録・保存されないため、本番トークンも安心して確認できます。payload が JSON なので構造をもっと見やすく展開したいなら JSON 整形ツールを、トークンを構成する base64url エンコード自体が気になるなら Base64 ツールを併せて使えます。

よくある質問

JWT デコーダーはトークンが有効かどうかも確認しますか?
いいえ。デコーダーは `exp` クレームから期限切れかどうかを表示するだけで、暗号署名の検証は行いません。トークンが改ざんされていないか確認するには、バックエンドの秘密鍵か公開鍵で署名を検証する必要があります。デコードと検証は別の段階です。
トークンの有効期限はどう読みますか?
payload の `exp` クレームが有効期限ですが、値は人が読みにくい Unix エポック(秒)です。JWT デコーダーがこれを ISO 形式に変換します。`exp` から `iat`(発行時刻)を引けば、トークンの有効期間が分かります。
payload は暗号化されていますか?
いいえ。JWT の header と payload は base64url でエンコードされた JSON にすぎず、誰でもデコードして読めます。暗号化ではないため、パスワードのような機微な情報を payload に入れてはいけません。
401 エラーがトークン期限切れによるものか、どう判断しますか?
トークンをデコードして `exp` を現在時刻と比べます。期限を過ぎていれば更新(refresh)が必要な状況で、期限内なのに拒否されるなら、権限(scope)や署名検証側の問題の可能性が高いです。
本番のアクセストークンをデコーダーに貼っても大丈夫ですか?
デコードがブラウザ内だけで実行されるツールなら、入力がサーバーへ送られないため安全です。PiPi Worlds の JWT デコーダーはそうです。ただし、トークンを他所で共有したことがあるなら失効(revoke)させる方が安全です。

Sources

PiFl Labs コンテンツチームが公開された出典に基づいて作成し、公開前に社内で検証しています。

最終確認:

ツールに戻る →