JWT デコーダー

JSON Web Token を貼り付けると、ヘッダーとペイロードを整形された JSON で、exp・iat・nbf の時刻を日時で表示し、期限切れかどうかもわかります。シークレットまたは公開鍵を使って、署名をローカルで検証することもできます。

ヘッダー

ペイロード

クレーム

署名

署名を検証

すべてブラウザ内で処理され、データはアップロードされません。

使い方

  1. トークン全体を貼り付けます。トークンは、ドットで区切られた 3 つの Base64URL 部分で構成されています。
  2. デコードされたヘッダーとペイロードを確認します。exp、iat、nbf の各クレームは日時で表示され、トークンが期限切れまたは有効期間前の場合は警告が表示されます。
  3. 署名を検証するには「署名を検証」を開き、HS256、HS384、HS512 の場合は共有シークレットを入力し、RS、PS、ES 系のアルゴリズムの場合は PEM 形式の公開鍵を貼り付けます。
  4. 発行者、対象者、主体の各クレームが、アプリケーションで想定している値と一致しているか確認します。

JWT の構造

JSON Web Token(RFC 7519)は、ドットで区切られた 3 つの部分 header.payload.signature で構成されます。ヘッダーとペイロードは、パディングなしの Base64URL でエンコードされた JSON オブジェクトです。そのため、トークンはほぼ必ず eyJ で始まります。これは先頭の {" をエンコードした形です。署名は、最初の 2 つの部分に対して、トークン内の文字列をそのまま使って計算されます。

  • ヘッダー:alg に署名アルゴリズムが入り、通常は "typ": "JWT" も含まれます。鍵を識別する kid が入っていることもよくあります。
  • ペイロード:ユーザーが誰か、誰がトークンを発行したか、いつ期限が切れるかといったクレームです。
  • 署名:ヘッダーとペイロードが改ざんされていないことを証明する、HMAC、RSA、または ECDSA の署名です。

5 つの部分からなるトークンは暗号化された JWE で、復号鍵がなければ内容を読むことはできません。

登録済みクレーム

クレーム名前意味
iss発行者(Issuer)トークンを作成し、署名した者
sub主体(Subject)トークンが対象とする主体(通常はユーザー ID)
aud対象者(Audience)トークンの利用先となるサービス
exp有効期限(Expiration Time)これ以降はトークンを拒否しなければならない時刻
nbf有効開始日時(Not Before)これより前はトークンを拒否しなければならない時刻
iat発行日時(Issued At)トークンが作成された時刻
jtiJWT IDリプレイの検出に使われる一意の識別子

時刻は NumericDate 値で、1970 年 1 月 1 日(UTC)からの経過秒数を表します。ミリ秒ではありません。このデコーダーは時刻を読みやすい日時で表示し、お使いのデバイスの時計と比較します。

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

ペイロードはエンコードされているだけで暗号化されていないため、JWT は誰でもデコードできます。パスワードなどの秘密情報は決して入れないでください。信頼性は、正しい鍵で署名を確認することによってのみ得られます。トークンを受け付けるサーバーは、さらに次の対策も行う必要があります。

  • 想定しているアルゴリズムだけを許可し、署名なしのトークンを示す "alg": "none" は拒否します。
  • HMAC と RSA のどちらを使うかをトークンのヘッダーに決めさせてはいけません。そうしないと、攻撃者がサーバーの公開鍵を HMAC のシークレットとして使い、偽造したトークンに署名できてしまいます。
  • リクエストのたびに exp、nbf、iss、aud を確認します。

このページの検証機能(任意)は、ブラウザに組み込まれた Web Crypto API を使用します。デコードも検証もお使いのデバイス上で行われ、何もアップロードされません。一般的な原則として、信頼できない Web サイトに本番環境の署名鍵や有効なトークンを貼り付けることは絶対に避けてください。

よくある質問

このデコーダーに JWT を貼り付けても安全ですか?

トークンはブラウザ内の JavaScript でデコード・検証され、サーバーに送信されることはありません。ただし、有効期限内のトークンは、それを持っている人にとってパスワードと同じように機能します。スクリーンショットやログを共有する際は、テスト用または期限切れのトークンを使うことをおすすめします。

シークレットキーがなくても JWT をデコードできますか?

はい。ヘッダーとペイロードは Base64URL でエンコードされた単なる JSON なので、鍵がなくても読めます。シークレットや公開鍵が必要なのは、署名を検証するときだけです。

トークンが期限切れと表示されるのはなぜですか?
exp クレームの時刻が、お使いのデバイスの現在時刻より前になっているためです。トークンがまだ有効なはずであれば、システムの時計と、発行者が設定したトークンの有効期間を確認してください。
どの署名アルゴリズムを検証できますか?

共有シークレットを使う HS256、HS384、HS512 と、PEM 形式の公開鍵を使う RS256、RS384、RS512、PS256、PS384、PS512、ES256、ES384、ES512 です。

"alg": "none" とはどういう意味ですか?

RFC 7518 で定義されている、署名が空の保護されていない JWT であることを示します。このようなトークンは誰でも作成・改変できるため、署名付きトークンを想定しているサーバーは必ず拒否しなければなりません。