CodeKitHub
日本語
エンコードツール

JWT デコーダー

任意のJWT(JSON Web Token)を貼り付けると、そのヘッダーとペイロードが即座にデコードされ、整形された状態で表示されます。有効期限が切れているかどうかも確認できます。すべての処理はブラウザ内で行われます。トークンが外部に送信されることはなく、署名の検証も行われません(このツールはデコードのみを行い、トークンの真正性を確認するものではありません)。

ヘッダー

ペイロード

すべてブラウザ内で復号されます。署名の検証は行われず、トークンが外部に送信されることも一切ありません。

このツールとは?

JWT(JSON Web Token)は、2つの当事者間でクレームを伝達するために使用される、コンパクトでURLセーフな文字列であり、最も一般的な用途はログイン後の認証トークンとしての利用です。 JWTは、ドットで区切られた3つの部分で構成されています。ヘッダー(アルゴリズムとトークンタイプ)、ペイロード(実際のクレーム――ユーザーID、ロール、有効期限など)、そして署名(サーバーがトークンが改ざんされていないことを検証するために使用される)です。

ヘッダーとペイロードは、単にBase64URLエンコードされたJSONであり、暗号化されているわけではありません。そのため、秘密鍵がなくても誰でもデコードして読み取ることができます。検証に秘密鍵が必要なのは署名のみです。このツールはまさにその機能、つまり、署名の検証は行わず、読み取り可能な部分をデコードして、フォーマットされたJSONとして表示するものです。

なぜこれを使うのか?

  • JSON形式でフォーマットされたヘッダーとペイロードは、一目で読み取れます。文字列を手作業で分割したり、Base64デコードしたりする手間はもう必要ありません。
  • 有効期限の自動チェック:ペイロードに「exp」クレームが含まれている場合、それを読み取り可能な日付に変換し、有効期限切れか有効かとしてフラグを立てます。
  • ヘッダーまたはペイロードを個別にワンクリックでコピーできます。
  • 100% クライアントサイド — トークンはローカルでデコードされ、送信されることは一切ないため、本番システムのトークンを使用しても安全です。
  • 署名の検証は行われておらず、また行われたと主張もされていません。これはデバッグ/検査ツールであり、バリデータではありません。

使い方

  1. JWTをボックスに貼り付けてください(ドットで区切られた3つの部分すべてを含む、文字列全体)。
  2. 入力すると、ヘッダーとペイロードが自動的にデコードされます。
  3. トークンに「exp」クレームがある場合は、有効期限の行を確認してください。そこには正確な日付と、トークンが有効期限切れかどうかが表示されます。
  4. いずれかのボックスの下にある「コピー」をクリックすると、そのセクションがJSON形式でコピーされます。

入力

eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0IiwibmFtZSI6IkpvaG4gRG9lIiwiZXhwIjoxNzAwMDAwMDAwfQ.dQw4w9WgXcQ

出力

Header: {"alg": "HS256"}
Payload: {"sub": "1234", "name": "John Doe", "exp": 1700000000}

署名(第3部)は、決して復号化されたり検証されたりすることはありません。これは、サーバー側で真正性を確認するために使用される不透明なハッシュです。

実用的なヒント

  • 「無効なトークン」エラーのデバッグ:「exp」クレームを確認するには、まずペイロードをデコードしてください。有効期限が切れたトークンが最も一般的な原因ですが、エラーメッセージだけでは必ずしもそのことが明らかではない場合があります。
  • サードパーティのAPIのトークンに実際に何が含まれているかを確認する:多くのAPIは、一見すると意味不明に見えるJWTをアクセストークンとして返します。ここでそれをデコードして、統合が実際に受け取っているスコープ、ユーザーID、有効期限を確認してください。
  • JWTが暗号化されていると決して思い込まないでください。開発中に復号されたペイロードに機密データ(メールアドレス、内部IDなど)が含まれているのを見つけた場合、それはクライアントがそのデータを読み取らないと信頼するのではなく、そのデータをサーバー側に移すべきだという合図です。

ペイロードによく見られる主張

主張意味
sub件名 — 通常、トークンが表すユーザーID
exp有効期限(Unix タイムスタンプ) — この時刻を過ぎるとトークンは無効になります
iat発行日時 — トークンが作成された時点
iss発行元 — どのサービス/サーバーがトークンを発行したか
aud対象 — トークンがどのサービス向けに設計されているか
role / roles / scopeカスタムクレーム — ユーザーに付与された権限またはロール(JWT標準の一部ではありませんが、非常に一般的です)

よくある質問

このツールはJWTの署名を検証しますか?

いいえ。署名の検証には、トークンの署名に使用された秘密鍵または公開鍵が必要ですが、これらは発行サーバーのみが保有しています。このツールは、ヘッダーとペイロード(人間が読み取れる部分)のみを復号するため、鍵を一切使用せずにクレームや有効期限を確認することができます。

実際に本番環境で使用しているJWTをここに貼り付けても安全ですか?

復号処理はすべてブラウザ内でJavaScriptによって行われます。トークンは、当社のサーバーを含め、いかなるサーバーにも送信されることはありません。とはいえ、トークンはパスワードと同様に扱ってください。信頼できないツールにトークンを貼り付けたり、機密性の高いクレームを含む復号済みトークンのスクリーンショットを共有したりすることは避けてください。

なぜパスワードなしで、誰でも私のJWTのペイロードを読み取ることができるのですか?

仕様上、JWTのヘッダーとペイロードはBase64URLでエンコードされており、暗号化されているわけではありません。エンコードはセキュリティ対策ではなく、単にJSONをURL経由で安全に送信できるようにするためのものです。JWTのペイロードに機密情報(パスワード、クレジットカード番号など)を直接含めないでください。トークンを所持する者は誰でもその内容を読み取れるものと想定してください。

「exp」という表示は何を意味し、なぜ重要なのでしょうか?

「exp」はトークンの有効期限で、Unixタイムスタンプ(1970年からの経過秒数)で表されます。 この時間が経過すると、サーバーはJWTを拒否し、クライアントに再認証を強制します。このツールは、それを読みやすい日付形式に変換し、すでに有効期限が切れているかどうかをフラグで示します。これは、「なぜセッションがログアウトしてしまったのか」といった問題のデバッグに役立ちます。

トークンにJSONの解析エラーが表示されています。なぜでしょうか?

その文字列が有効なJWTではない(ドットで区切られた3つの部分で構成されている必要があります)か、あるいは切り詰められたり改変されたりしている可能性があります。よくある原因としては、トークンが誤って複数行に分割されてしまったり、コピーする際に末尾の文字が欠落してしまったりすることが挙げられます。

関連ツール