JWTをデコードする方法
- トークンを入力欄に貼り付けます。Authorizationヘッダーの値ごとコピーした場合も、先頭の
Bearerは自動的に取り除かれます。サンプルトークンを押すと見本が入るので、先に表示のしかたを確認できます。 - ヘッダーとペイロードが、インデントされたJSONとして左右に並び、それぞれにコピーボタンがあります。
- 下の表には、署名アルゴリズムと、見つかった標準クレームがまとめられます。時刻はお使いのタイムゾーンの読みやすい日時に変換され、「期限切れ(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の秘密鍵か発行者の公開鍵が必要です。これらはトークンを受け取るサーバーに置くべきものです。サーバーは次のことを行う必要があります。
- ヘッダーに書かれたアルゴリズムではなく、サーバー側で決めたアルゴリズムで署名を検証し、「署名なし」を意味する
"alg":"none"は拒否する。 expとnbfをサーバー自身の時計と比べる。その際、時計のずれを考慮して少し余裕を持たせる。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 の拒否リストを管理するか、署名鍵を入れ替えます。