Menu
日本語

JWT デコーダ

JSON Web Token を一つずつ解析・検証。

最終更新

アルゴリズム
エンコード済みJSON Web Tokenを貼り付け
デコード済み
ヘッダーとペイロードがここに表示されます — トークンはブラウザーから送信されません。

JWT デコーダーとは?

JWT デコーダーは、JSON Web Token をヘッダー・ペイロード・署名の 3 つに分解し、最初の 2 つを Base64URL デコードして JSON として読めるようにするツールです。ログインフロー、認可、セッションのクレーム、トークンの有効期限まわりをデバッグするとき、開発者は本当によくお世話になります。

JWT のデコードは、そのトークンを「信用する」ことと同じではありません。ヘッダーとペイロードはあくまで Base64URL エンコードされているだけで、暗号化されていません。誰でも読めるのが仕様です。発行元が署名したものか、改ざんされていないかを確認するのは「検証(verify)」のステップです。

JWT は header.payload.signature という形をしています。それぞれの部分が Base64URL でエンコードされ、ドット(.)で繋がれています。ヘッダーには使用している署名アルゴリズム、ペイロードにはクレーム(ユーザーは誰か、いつ期限切れか、何ができるか)、署名にはトークンが改ざんされていないことをサーバーが確認するための情報が入っています。

JWT をデコードしながら身につくこと

  • JWT は Base64URL エンコードされた 3 つのパートをドットで繋いだ構造: header.payload.signature
  • subroleiatnbfexp といった代表的なクレームは、ユーザー識別、権限、発行時刻、有効期限を表す。
  • デコードしたペイロードは誰でも書き換えられる — 改ざんを検知できるのは署名だけ。

JWT をデコードする手順

  1. トークン全体を貼り付ける

    入力欄に JWT をそのまま貼り付けます。xxxx.yyyy.zzzz のように、Base64URL エンコードされた 3 つのパートがドットで繋がった形になっているはずです。

  2. ヘッダーを読む

    ヘッダーには署名アルゴリズム(alg)とトークン種別が書かれています。要注意なのは "alg": "none" — これは無署名トークンで、信用してはいけません。

  3. ペイロードのクレームを読む

    ペイロードはクレームが詰まった JSON です。sub(ユーザー ID)、exp(有効期限)、iat(発行時刻)に加えて、アプリ独自の roletenant などのカスタムクレームも確認しましょう。

  4. 有効期限をチェック

    exp の Unix タイムスタンプを日時に変換します。すでに過去の時刻なら、そのトークンは期限切れ。きちんと作られた API なら拒否されるはずです。

  5. 署名を検証する(任意)

    シークレットや公開鍵が手元にあれば、ベリファイアに貼り付けて署名が正しいか確認できます。署名が通って初めて、ペイロードの中身を信頼できる状態になります。

JWT 標準クレーム一覧

ここに載せたのは、JWT 仕様(RFC 7519)で定義されている登録済みクレームです。アプリは独自のカスタムクレームを自由に追加できます。

クレーム正式名称意味
issIssuer(発行者)トークンを作成・署名したのは誰か
subSubject(主体)誰についてのトークンか — 通常はユーザー ID
audAudience(受信者)誰に向けて発行されたトークンか
expExpiration(有効期限)この時刻を過ぎると無効になる Unix タイムスタンプ
nbfNot Before(有効開始)この時刻以前は受け付けてはいけない
iatIssued At(発行時刻)トークンが作成された時刻
jtiJWT IDユニーク識別子 — 失効管理(revocation)に便利
algAlgorithm(ヘッダー)署名アルゴリズム: HS256, RS256, ES256

試してみたい JWT のサンプル

典型的な JWT を覗いてみる

トークン

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJ1c2VyXzEyMyIsInJvbGUiOiJzdHVkZW50IiwiZXhwIjoxNzEwMDAwMDAwfQ.Q3hH8yzqI2OsHJ1Lyj8jJfJPa5ZpIVlh1FhJpJbqMcs

ヘッダー
{  "alg": "HS256",  "typ": "JWT"}
ペイロード
{  "sub": "user_123",  "role": "student",  "exp": 1710000000}

ヘッダーは HS256(共通鍵方式のアルゴリズム)。ペイロードにはユーザー、ロール、有効期限が入っています。3 つ目のパートが署名です。(あくまでデモ用のサンプルなので、実在するシークレットでは検証は通りません。)

トークンが期限切れか確認する

ペイロード内のクレーム
{  "exp": 1710000000}

exp は秒単位の Unix タイムスタンプです。日時に変換して現在時刻と比べます。すでに過ぎていれば期限切れで、まともなバックエンドなら拒否します。

危険な "none" アルゴリズムを見抜く

ヘッダー
{  "alg": "none",  "typ": "JWT"}

サーバーが "alg": "none" を受け入れてしまうと、攻撃者は署名なしで好きなペイロードを偽造できます。本番環境では必ずこのヘッダーを拒否しましょう。

JWT でよくある落とし穴

  • パスワード、シークレット、機微な個人情報をペイロードに入れてしまう。JWT は読めるだけで、暗号化はされていません。
  • 署名を確認せずに、デコードしただけで「有効なトークン」と判断してしまう。
  • Base64URL で読めることと「暗号化されている」ことを混同する — JWT のペイロードは読めるのが仕様。

JWT のよくある質問

JWT とは何ですか?
JWT は JSON Web Token の略です。クレームを 2 者間でやり取りするための、コンパクトかつ署名済み・URL セーフなトークン形式で、サーバーとブラウザ間でログイン中ユーザーを表すのに最もよく使われます。
JWT はどうやってデコードしますか?
JWT デコーダーに貼り付けるか、ドットで分割して最初の 2 つを Base64URL デコードします。ヘッダーとペイロードは JSON として戻ってきて、3 つ目が署名です。
JWT が期限切れかどうかはどう判定する?
ペイロード内の exp クレームを見ます。これは秒単位の Unix タイムスタンプで、現在時刻が exp を過ぎていれば期限切れです。
JWT は誰でもデコードできるの?
はい、できます。ヘッダーとペイロードは Base64URL エンコードされているだけで、暗号化はされていません。署名はあくまで「改ざんされていないこと」を保証するもので、中身を隠すものではありません。
JWT の「検証(verify)」とは?
想定しているシークレットや公開鍵を使って署名を再計算し、トークンに付いている署名と一致するかを確認することです。一致すれば、ペイロードは改ざんされていないと信頼できます。
JWT にパスワードを入れていい?
ダメです。トークンを持っている人なら誰でもペイロードを読めます。入れてよいのは機微でない識別子やクレームだけ。セキュリティは短い有効期限とリフレッシュトークンの組み合わせで担保しましょう。

詳しく見る

その他の開発者ツール

Coddyでコードを学ぼう

始める