100% ローカル — データがブラウザの外に出ることはありません

JWTをJSONに変換|中に入っているクレームを読み取れます

JWTのヘッダーとペイロードを復号します。署名の検証は行いません。exp、iss、スコープを読めるので、トークンが弾かれた理由は、たいていその場ですぐ分かります。

高速 プライベート Cookieゼロ
インデント

JWT 入力

JSON 出力

このツールの動作

トークンが入り、そのヘッダーとペイロードが JSON として出ます。

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIn0.SflKxwRJSMeKKF2QT4fwpM
{
  "header": {
    "alg": "HS256",
    "typ": "JWT"
  },
  "payload": {
    "sub": "1234567890"
  }
}

二つの区切りは Base64URL です。これは符号化であって暗号ではありません。トークンを持つ者は誰でも、ここでも、三行のコードでも読めます。署名はどこにも表示しません。読むものがそこには無いからです。署名は証明であり、証明には鍵が要ります。

復号は検証ではない

上のペイロードは、主体が 1234567890 だと言っています。そう言っていること自体は何の証明にもなりません。文字を書き換えて符号化し直せば、同じようにきれいに復号でき、検証には落ちるトークンができます。このページにその違いは分かりません。どの復号器にも分かりません。署名があるのは、まさにそのためです。

つまり、復号器はトークンが何を主張しているかを見るための道具であり、信じてよいかを決めるのはあなたのサーバーと鍵です。両者が食い違ったなら、正しいのは署名のほうです。

区切りは三つ、三つだけ

Not a JWT: expected header.payload.signature, found 2 segments

簡潔形式の JWT の区切りはちょうど三つです。二つでも四つでも復号されていたので、貼り付けで切れたトークンが、どこも悪くなさそうな顔で返っていました。このページを書く過程で見つけ、直した欠陥です。五つある場合は別の形式、JWE です。ペイロードは符号化ではなく暗号化されており、復号に失敗する代わりに、そのことを知らせます。

ペイロードを読む

  • 長い数値の識別子は保たれます。 二十桁の sub も桁のまま通ります。JavaScript の数値で隣の値に丸められることはありません。
  • exp、iat、nbf は Unix 時刻です。 仕様どおり、ミリ秒ではなく秒です。この場所のタイムスタンプの道具が日付に変えてくれます。
  • クレームは発行者が入れたものです。 alg、typ、sub、iss、aud は標準で、そのほかはあなたの両端どうしの取り決めです。

プライバシー

すべての処理はブラウザ内のJavaScriptだけで完結します。データがアップロードされることはないため、機密情報でも安心して利用でき、オフラインでも動作します。

よくある質問

署名は検証されますか。
いいえ。ブラウザーの道具にはできません。検証には秘密鍵か公開鍵が要りますが、それこそどこにも貼ってはいけないものです。復号はトークンが何を主張しているかを教え、検証はそれを信じてよいかを教えます。ここに見えるペイロードは誰にでも書けます。Base64URL は符号化であって保護ではありません。検証は自分の鍵でサーバー側に。
トークンはどこかへ送られますか。
いいえ。復号はブラウザーの中で行われ、何もこのページから出ません。本番のトークンをオンラインの復号器に貼ることは、資格情報を見知らぬ相手に渡すことなので、これは知っておく価値があります。それでも、できるときは期限切れのものか試験用のものを使ってください。あなたが打ち込んでいる機械については、このページは何も約束できません。
トークンが断られるのはなぜですか。
区切りが三つでないからです。簡潔形式の JWT は `header.payload.signature` です。二つや四つでも復号されていたので、貼り付けで切れたトークンが問題なさそうな顔で返っていました。五つある場合は JWE です。ペイロードは符号化ではなく暗号化されており、鍵が無ければ誰にも読めません。いまはどちらの場合かを知らせます。

関連ツール