JWTデコーダー

JWT(JSON Web Token)のヘッダーとペイロードをすぐにデコードし、有効期限や発行日時を読みやすい日時で表示します。トークンがブラウザの外に出ることはありません。

ヘッダー
ペイロード

署名は検証されません。デコードはトークンの中身を表示するだけです。本物かどうかを確かめるには、サーバー側で管理する秘密鍵または公開鍵が必要です。

JWTをデコードする方法

  1. トークンを入力欄に貼り付けます。Authorizationヘッダーの値ごとコピーした場合も、先頭の Bearer は自動的に取り除かれます。サンプルトークンを押すと見本が入るので、先に表示のしかたを確認できます。
  2. ヘッダーとペイロードが、インデントされたJSONとして左右に並び、それぞれにコピーボタンがあります。
  3. 下の表には、署名アルゴリズムと、見つかった標準クレームがまとめられます。時刻はお使いのタイムゾーンの読みやすい日時に変換され、「期限切れ(2時間前)」「有効(5日後に期限切れ)」「まだ有効ではありません」といった注記が付きます。

問題があれば、ステータス行が原因を示します。ドットで区切られた部分がない、ある部分が有効なBase64urlではない、有効なJSONではない、署名部分がない、のいずれかです。

トークンの構造

JSON Web Token(RFC 7519)は、3つのBase64url文字列をドットでつないだものです:header.payload.signature。Base64urlは通常のBase64の + と / を - と _ に置き換え、= のパディングを省いたもので、トークンをURLやHTTPヘッダーにそのまま入れられます。以下は、HS256と秘密鍵 demo-secret で署名した完全なトークンです。

ヘッダーeyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 → {"alg":"HS256","typ":"JWT"}
ペイロードeyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkphbmUgRG9lIiwicm9sZSI6ImVkaXRvciIsImlhdCI6MTc2NzIyNTYwMCwiZXhwIjoxNzY3MjI5MjAwfQ → {"sub":"1234567890","name":"Jane Doe","role":"editor","iat":1767225600,"exp":1767229200}
署名smanCrPMMlkaAxySO1Bj1syvqeAu5q5RozvQDT8YfHs

3つをドットでつないで上の欄に貼り付けてみてください。2026年1月1日00:00 UTC(日本時間の午前9時)に発行され、1時間後に期限切れになったと表示されます。JWTのほとんどが eyJ で始まるのは、{" の後に英字が続くとBase64でこの形になるためです。ログの中からJWTを見分ける手がかりになります。

よく見かけるクレーム

  • iss(発行者)– トークンを作った者。多くは認証サーバーのURLです。
  • sub(サブジェクト)– トークンの対象。通常はユーザーIDです。
  • aud(受信者)– トークンを受け入れるべきサービス。文字列の場合も配列の場合もあります。
  • exp、nbf、iat – 有効期限、有効開始日時、発行日時で、1970年からの秒数です。Unixタイムスタンプ変換なら任意の単位で確認できます。
  • jti – トークンごとの一意なID。リプレイ攻撃の防止や、特定のトークンだけの失効に使います。

name、email、role、scope などそれ以外の値はアプリケーション独自のもので、ペイロードの表示にだけ現れます。ヘッダーの kid は署名に使った鍵の名前で、サーバーが複数の公開鍵から正しいものを選ぶのに役立ちます。

デコードは検証ではありません

このページはトークンを読むだけで、本物かどうかは確かめません。ヘッダーとペイロードはエンコードされているだけなので、誰でも "role":"admin" と書かれたトークンを作れます。それを防ぐのは署名だけで、署名の確認にはHMACの秘密鍵か発行者の公開鍵が必要です。これらはトークンを受け取るサーバーに置くべきものです。サーバーは次のことを行う必要があります。

  1. ヘッダーに書かれたアルゴリズムではなく、サーバー側で決めたアルゴリズムで署名を検証し、「署名なし」を意味する "alg":"none" は拒否する。
  2. exp と nbf をサーバー自身の時計と比べる。その際、時計のずれを考慮して少し余裕を持たせる。
  3. iss と aud が信頼する値であることを確認する。

これは自作のコードではなく、継続的にメンテナンスされているJWTライブラリに任せてください。このようなデコーダーはデバッグ用であり、誰を通すかを決めるためのものではありません。

署名アルゴリズム

  • HS256 / HS384 / HS512 – 共有の秘密鍵を使うHMAC。検証できる側はトークンを作ることもできるため、秘密鍵は信頼できるサーバーだけに置く必要があります。
  • RS256、PS256 – RSA署名。発行者が秘密鍵で署名し、誰でも公開鍵で検証できます。
  • ES256 – P-256曲線のECDSA。RSAより鍵も署名も小さくなります。
  • EdDSA – Ed25519署名。新しいシステムで採用が増えています。

デバッグのヒント

  • 急に「使えなくなった」トークンは、たいてい単に期限切れです。まず exp を現在時刻と比べましょう。
  • ログイン直後なのに「まだ有効ではありません」となるなら、発行側と受信側のサーバーの時計がずれていることが多いです。
  • 発行されたばかりのトークンで401エラーになるなら、受信者の指定違いがよくある原因です。aud を呼び出し先のAPIと照らし合わせてください。
  • ある部分の生のバイトを見たいときは、URLセーフモードにしたBase64デコーダーでも確認できます。

よくある質問

本物のトークンを貼り付けても安全ですか?

デコードはすべてこのページのJavaScript内で行われ、トークンはアップロードされません。それでも、有効なトークンは期限が切れるまで使える認証情報です。できれば期限切れのトークンやテスト用のトークンを使い、本物のトークンをチケットやチャットに貼らないでください。

ペイロードに機密データを入れてもよいですか?

いけません。このページでわかるとおり、トークンを持っている人なら誰でも読めます。内容そのものを秘密にする必要があるなら、暗号化されたトークン(JWE)を使ってください。JWEは3つではなく5つの部分からなり、鍵がなければデコードできません。

「トークンに署名部分がありません」と表示されるのはなぜですか?

入力が2つの部分しかないためです。コピーの途中でトークンが切れたときや、署名のないトークンのときにこうなります。署名のないトークンはサーバーが拒否すべきものです。

期限前にトークンを無効にするには?

署名済みのJWTは、発行後に変更できません。途中でログアウトさせる必要があるシステムでは、トークンの有効期間を短くし、サーバー側で jti の拒否リストを管理するか、署名鍵を入れ替えます。