JWTデコード

JWT(JSON Web Token)を貼り付けると、ヘッダーとペイロードを読みやすいJSONに戻し、exp(有効期限)を日本時間に直して期限切れかどうかを判定します。署名の検証はしません。トークンはブラウザの中だけで処理し、外部に送りません。

トークンを貼り付ける

このツールでできること

JWT(JSON Web Token、「ジョット」とも読みます)は、ログインした利用者の情報や権限を、改ざんを検出できる形で受け渡すための文字列です。OAuth 2.0のアクセストークンやOpenID ConnectのIDトークン、APIのAuthorization: Bearerヘッダーなどでよく使われます。中身は暗号化されておらず、Base64URLで書き換えたJSONなので、デコードすれば誰でも読めます。

このツールは、貼り付けたJWTをヘッダー・ペイロード・署名の3つに分けて色分けし、ヘッダーとペイロードを整形したJSONで表示します。exp・iat・nbfなどの時刻をUnix時刻から日本時間に直し、「あと何分で切れるか」「何日前に切れたか」を1秒ごとに更新します。「APIが401を返すのはトークンの期限切れのせいか」「audやscopeは想定どおりか」を確かめたいときに使えます。

使い方

  1. 確かめたいJWTを上の欄に貼り付けます。先頭のBearer やAuthorization:、前後の空白・改行・引用符は自動で取り除きます。
  2. 「有効期限の判定」で、いま有効か、期限切れか、まだ使えない(nbfより前)かを確かめます。サーバーが時計のずれを許容している場合は、「時計のずれの許容」に秒数を入れると同じ条件で判定できます。
  3. 「デコード結果」でヘッダーとペイロードのJSONを確かめ、必要ならコピーします。
  4. 「クレームの一覧と意味」で、iss・sub・audなどの各項目が何を表すかを確かめます。時刻のクレームは日本時間と相対時間も並べて表示します。
  5. 「ヘッダーと署名」で、署名の方式(alg)と署名の長さが合っているかを確かめます。

知っておくと便利なこと

JWTは「読める」もの。ペイロードは暗号化ではなくエンコードされているだけなので、パスワードや個人情報など、見られて困るものを入れてはいけません。暗号化したいときはJWE(5つの部分に分かれる形式)を使います。このツールにJWEを入れると、ヘッダーだけを表示し、中身は暗号化されていると知らせます。

時刻は秒単位のUnix時刻。RFC 7519ではexpなどを1970年1月1日(UTC)からの秒数で書くと決めています。JavaScriptのDate.now()はミリ秒なので、ミリ秒の値を入れてしまう実装ミスがときどきあります。このツールは、値が大きすぎてミリ秒と思われるときに注意を出します。また、RFCではexpの時刻ちょうどを過ぎたら受け付けないとしているので、expと同じ秒になった時点で「期限切れ」と表示します。

署名の長さで方式の見当がつく。HS256の署名は32バイト(Base64URLで43文字)、ES256は64バイト(86文字)、RS256とPS256は鍵の長さと同じで、2048ビットの鍵なら256バイト(342文字)です。algと長さが合わないときは、トークンが途中で切れているか、別の方式で署名されている可能性があります。

algがnoneのトークンに注意。署名なしのJWTで、受け付けてしまうサーバーは誰でも偽のトークンを作れてしまいます。サーバー側では、受け付けるalgを決め打ちにするのが定石です。

よくある質問

署名が正しいかどうかは分かりますか。
分かりません。このツールは中身を読むだけで、署名の検証はしません。署名を確かめるには、発行元の秘密鍵(HS系)や公開鍵(RS・ES系、JWKSで公開されていることが多い)を使い、ライブラリやサーバー側で検証してください。表示が「有効」でも、それは期限の上で有効という意味にすぎません。
本番のトークンを貼っても大丈夫ですか。
このページはトークンをどこにも送らず、保存もしません。ただし、有効期限内のアクセストークンはそれだけでAPIを呼べる「鍵」なので、画面共有やスクリーンショット、チャットへの貼り付けには気をつけてください。確認が済んだら「クリア」で消すと安心です。
「期限切れ」なのにAPIが使える(またはその逆)のはなぜですか。
サーバーが数十秒〜数分の時計のずれを許容していたり、パソコンの時計がずれていたりするためです。「時計のずれの許容」に秒数を入れて判定を合わせられます。また、サーバー側でトークンを失効させる仕組みがあると、期限内でも使えなくなります。
「.」で区切られた部分が2つ・4つと出ます。
JWTは、署名つき(JWS)なら3つ、暗号化(JWE)なら5つに分かれます。それ以外の数のときは、コピーの途中で切れたか、別のトークン(不透明なアクセストークンなど)の可能性があります。