JWT デコーダー — オンライン解析ツール
JWTトークンを無料のJWTデコーダーでオンラインデコード。ヘッダー、ペイロード、署名、有効期限、アルゴリズム、クレームを即座に検査できます。100%ブラウザ動作 — トークンはデバイスから外に出ません。登録不要、追跡なし。
JWTとは?
JSON Web Token(JWT、「jot」と読みます)は、2者間でクレームをやり取りするためのコンパクトでURLセーフなトークン形式です。RFC 7519で定義されており、OAuth 2.0のアクセストークン、OpenID ConnectのIDトークン、最新の認証プロバイダー(Auth0、Okta、Clerk、Supabase、Firebase)のAPIキー、マイクロサービス間のトークンなどで主流の認証情報形式として使われています。
「JSON Web Token (JWT) は、HTTP Authorization ヘッダーや URI クエリパラメータなど、スペースに制約のある環境を対象としたコンパクトなクレーム表現形式である。」— RFC 7519, Section 1
JWTは、ドットで連結された3つのBase64URLエンコード済みJSONオブジェクト、header.payload.signatureで構成されます。ヘッダーはトークンがどのように署名されているかを記述します(algクレームはHS256やRS256など、typクレームは通常「JWT」です)。ペイロードはクレームを運びます。iss、sub、aud、exp、iatなどの登録済みクレームに加え、発行者が必要とする任意のカスタムクレーム(role、scope、email、テナントIDなど)が入ります。署名は、発行者のシークレットまたは秘密鍵を使ってヘッダーとペイロードから計算される暗号学的な証明で、受信者が改ざんを検出できるようにします。
重要なのは、JWTはエンコードされたものであり、暗号化されたものではないということです。トークンを持っている人は誰でもペイロードを読むことができます。デコードはBase64URLとJSONのパースにすぎません。セキュリティの保証は署名によって得られます。攻撃者はJWTを読むことはできますが、署名鍵なしでは、署名検証を通過する別のJWTを生成することはできません。これが、JWTがネットワーク経由で渡しても安全である一方、秘密を詰め込むには不適切な理由です。
JWTデコーダーは、署名には触れずに、アルゴリズム、クレーム、有効期限などトークンに含まれる内容を正確に表示します。「このトークンは期限切れか?」「このユーザーにはどんなロールがあるか?」「このトークンを発行した発行者は誰か?」「これは拒否すべきalg:noneトークンか?」といった疑問に最も速く答える方法です。本ツールのデコードはすべてブラウザ内でローカルに実行されるため、本番環境のトークンを貼り付けても安全です。
JWTを扱う作業は、他の開発者ツールと組み合わせて行うことがよくあります。不正なトークンをデバッグする際にBase64URLで包まれたセグメントをデコードしたり、プロキシから取得したAuthorizationヘッダーをURLデコードしたり、expクレームを手動で人間の日付に変換したりすることがあります。JWTが本番環境でどのように署名・検証・ローテーションされるかをより深く理解したい方は、Base64の基礎ガイドをご覧ください。Base64URLはすべてのJWTの土台となっています。
// Decode a JWT in the browser — header & payload only
function decodeJwt(token) {
const [h, p, s] = token.split('.');
const pad = (seg) => seg + '==='.slice((seg.length + 3) % 4);
const decode = (seg) => JSON.parse(
atob(pad(seg).replace(/-/g, '+').replace(/_/g, '/'))
);
return { header: decode(h), payload: decode(p), signature: s };
}
const { header, payload } = decodeJwt(token);
console.log(header); // → { alg: 'HS256', typ: 'JWT' }
console.log(payload); // → { sub: 'user_123', exp: 1999999999, ... }
// Expiration check
const expired = payload.exp * 1000 < Date.now(); 主な機能
JWTを即座にデコード
貼り付けるだけで、JWTがリアルタイムでデコードされます — ヘッダー、ペイロード、署名がその場で解析されます。デコードボタンもサーバーへのラウンドトリップもありません。
有効期限の検出
expクレームを自動的に読み取り、トークンが期限切れの場合は赤いバッジと、ローカルタイムゾーンでの正確な有効期限日時を表示します。
アルゴリズム非依存
HS256/384/512、RS256/384/512、PS256/384/512、ES256/384/512、EdDSA、alg:noneなど、すべてのJWSアルゴリズムをデコードします。
100%ローカル
デコードはブラウザ内のネイティブatobとJSON.parseで実行されます。トークンがアップロードされることは一切ないため、本番環境の認証情報でも安全です。
クレームを意識した表示
RFC 7519の登録済みクレーム(iat、exp、nbf、iss、aud、sub、jti)を強調表示するため、認証の問題を一目で見つけられます。
ワンクリックコピー
ヘッダーJSON、ペイロードJSON、または生の署名をワンクリックでクリップボードにコピーできます。バグレポートやテストに最適です。
使用例
HS256トークン(有効)
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJ1c2VyXzEyMyIsIm5hbWUiOiJBbGljZSIsInJvbGUiOiJhZG1pbiIsImlhdCI6MTcxNTAwMDAwMCwiZXhwIjoxOTk5OTk5OTk5fQ.4NhxPjwoZxPNuxG-2C5ugGxaUsUJ0QyskAz7Ymz5Sg0
{
"alg": "HS256",
"typ": "JWT"
}
{
"sub": "user_123",
"name": "Alice",
"role": "admin",
"iat": 1715000000,
"exp": 1999999999
} HMAC-SHA256で署名されたトークン。サブジェクト、ロール、将来の有効期限を含む、セッション認証で最もよく使われるJWTの構成です。
RS256トークン(期限切れ)
eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6ImtleS0yMDI1LTAxIn0.eyJpc3MiOiJodHRwczovL2F1dGguZXhhbXBsZS5jb20iLCJhdWQiOiJhcGkuZXhhbXBsZS5jb20iLCJzdWIiOiI5MDA4NzE2NSIsImlhdCI6MTYwMDAwMDAwMCwiZXhwIjoxNjAwMDAzNjAwLCJzY29wZSI6InJlYWQ6dXNlciB3cml0ZTpwb3N0In0.signature_placeholder
{
"alg": "RS256",
"typ": "JWT",
"kid": "key-2025-01"
}
{
"iss": "https://auth.example.com",
"aud": "api.example.com",
"sub": "90087165",
"iat": 1600000000,
"exp": 1600003600,
"scope": "read:user write:post"
} RSAで署名されたOAuthスタイルのアクセストークン。ヘッダーにkid(キーID)があり、expクレームはこのトークンがすでに期限切れであることを示しています。
OIDC IDトークン
eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJodHRwczovL2FjY291bnRzLmdvb2dsZS5jb20iLCJzdWIiOiIxMTA1MDIyNTExNTU4OTkwNzY2Mzk1IiwiYXpwIjoiY2xpZW50LWlkIiwiYXVkIjoiY2xpZW50LWlkIiwiZW1haWwiOiJhbGljZUBleGFtcGxlLmNvbSIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJpYXQiOjE3MTUwMDAwMDAsImV4cCI6MTk5OTk5OTk5OSwibm9uY2UiOiJhYmMxMjMifQ.signature
{
"alg": "ES256",
"typ": "JWT"
}
{
"iss": "https://accounts.google.com",
"sub": "110502251155899076639",
"azp": "client-id",
"aud": "client-id",
"email": "alice@example.com",
"email_verified": true,
"iat": 1715000000,
"exp": 1999999999,
"nonce": "abc123"
} ECDSAで署名されたOpenID Connect IDトークン。メール関連のクレームと、リプレイ攻撃対策のnonceを含みます。
alg:noneトークン(署名なし)
eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0.eyJzdWIiOiJkZWJ1Zy11c2VyIiwiaWF0IjoxNzE1MDAwMDAwfQ.
{
"alg": "none",
"typ": "JWT"
}
{
"sub": "debug-user",
"iat": 1715000000
} alg:noneを使う署名なしトークンです。本番環境でこれを受け入れることは古典的なJWTの脆弱性となります。サーバー側でalg:noneは必ず拒否してください。
使い方
- 1
JWTを貼り付けてデコード
ドットで区切られた3つのセグメントを含む完全なトークンを入力ボックスに貼り付けてデコードします。デコーダーはブラウザ内で即座に実行されるため、ボタンをクリックする必要はありません。
- 2
デコードされたヘッダー、ペイロード、ステータスを読む
デコードされたヘッダーでアルゴリズムとトークンタイプを、デコードされたペイロードでクレームを、上部の有効期限/発行時刻チップで状態を読み取れます。期限切れのトークンは赤でフラグ付けされます。
- 3
デコード結果をコピー
各パネルのコピーボタンを使って、デコードされたヘッダーJSON、デコードされたペイロードJSON、または生の署名をコピーします。トークンはどこにも送信されていません。デコードはブラウザ内でローカルに行われました。
Common Errors
alg:noneを受け入れる
署名なしのJWTは誰でも偽造できます。本番環境ではalg:noneを絶対に許可せず、verify呼び出しには常に明示的なアルゴリズムリストを渡してください。
jwt.verify(token, secret) // library default may allow 'none'
jwt.verify(token, secret, { algorithms: ['RS256'] }) expクレームが欠落している
expのないJWTは永遠に生き続けます。トークンが漏洩した場合、自然な失効ポイントがありません。トークンの種類に応じた有効期限を必ず設定してください。
{ "sub": "user_123", "role": "admin" } // no exp { "sub": "user_123", "role": "admin", "exp": 1715003600 } ペイロードにシークレットを入れる
JWTのペイロードは暗号化されていません。トークンを持っている人は誰でも読めます。パスワード、APIキー、伏字にしていないPIIをJWTペイロードに絶対に入れないでください。
{ "sub": "user_123", "password": "hunter2" } { "sub": "user_123", "role": "admin" } // payload stays minimal 一般的なユースケース
- Authorization Bearerトークンをデコード
- Authorization: BearerヘッダーのJWTトークンをデコードして、バックエンドが受け取っているクレーム、audience、有効期限を検証します。
- OAuth 2.0・OIDCトークンをデコード
- OAuth 2.0およびOpenID Connect統合中に、認可サーバー(Auth0、Okta、Google、Keycloak)から返されたアクセストークンやIDトークンをデコードします。
- 期限切れセッションの診断
- 拒否されたトークンが期限切れなのか、audienceが間違っているのか、時刻ずれの問題なのかを1秒で確認できます。
- キーローテーションの確認
- ヘッダーのkid(キーID)を読み取り、JWKSのローテーションが期待どおりの鍵で署名されたトークンを発行しているかを検証します。
- セキュリティレビュー
- コードレビューやペンテスト中に、alg:noneで署名されたトークン、expが欠落しているトークン、ペイロードからPIIが漏洩しているトークンを発見します。
- マイクロサービスのトークン検査
- メッシュ内のサービス間トークンをデコードし、ダウンストリーム呼び出しが認可しているスコープとサブジェクトを確認します。
技術的な詳細
- RFC 7519準拠
- RFC 7519(JWT)、RFC 7515(JWS)、RFC 7518(JWA)に準拠したJWSトークンを処理します。登録済みのすべてのアルゴリズムがデコード対象です。
- Base64URLデコード
- RFC 4648で定義されたURLセーフなBase64アルファベット(+と/の代わりに-と_)を使用し、パディングに寛容なパースを行います。
- ブラウザネイティブ・依存ゼロ
- ブラウザのatob、TextDecoder、JSON.parseを基盤としており、外部ライブラリもネットワーク呼び出しもテレメトリもありません。
ベストプラクティス
- 検証せずに信頼しない
- デコーダーはクレームを表示するだけで、それを証明するものではありません。クレームを信頼する前に、発行者の鍵を使って必ずサーバー側で署名を検証してください。
- 本番環境ではalg:noneを拒否する
- JWTライブラリには許可するアルゴリズムの明示的なリストを設定してください。alg:noneは決して受け入れず、キーローテーション時のalg不一致にも注意してください。
- ペイロードを軽量に保つ
- 識別子と短命のクレームをJWTに入れ、大きなデータは不透明なセッションIDの背後に保持してください。大きなトークンはリクエストごとに帯域を消費します。
よくある質問
JWTトークンをオンラインでデコードするにはどうすればよいですか?
header.payload.signature)すべて — を上のデコーダーに貼り付けてください。デコードはブラウザ内で即座に行われます。ヘッダーとペイロードはBase64URLでデコードされて読み取り可能なJSONとなり、署名は生の文字列として表示されます。ステータス行には署名アルゴリズム、発行時刻、有効期限が表示されるため、期限切れのトークンを一目で見つけられます。JWTを手動でデコードするには、トークンをドットで分割し、最初の2つのセグメントをBase64URLデコードしてJSONとしてパースします。ペイロードはエンコードされているだけで、暗号化されていないため、トークンを持っている人は誰でもそのクレームを読めます。このデコーダーは本番環境のトークンでも安心してお使いいただけます。何もデバイスの外に出ることはありません。ネットワークリクエストもロギングも追跡もありません。 JWT(JSON Web Token)とは何ですか?
このJWTデコーダーでトークンを扱っても安全ですか?
JWTデコーダーはどのように動作しますか?
このツールはJWTの署名を検証できますか?
iat、exp、nbf、iss、aud、sub、jtiとは何ですか?
JWTが期限切れなのにデコーダーがまだデコードするのはなぜですか?
JWT、JWS、JWEの違いは何ですか?
alg:noneはなぜ危険なのですか?
alg:noneのJWTには署名がないため、誰でも任意のユーザーを名乗るトークンを作成できます。初期のJWTライブラリはデフォルトでalg:noneを受け入れており、攻撃者が署名を削除してalgをnoneに設定し、管理者トークンを偽造する有名な認証バイパスの脆弱性につながりました。現在の成熟したJWTライブラリはすべて、明示的に許可しない限りalg:noneを拒否しており、認証リクエストでは絶対に受け入れてはいけません。デバッグ中にalg:noneトークンを調べるのは正当なことなので本デコーダーは表示しますが、本番環境で受け取ったそのようなトークンは敵対的なものとして扱ってください。 このJWTデコーダーはどのアルゴリズムに対応していますか?
JWTはlocalStorageとCookieのどちらに保存すべきですか?
Node.js、Python、GoでJWTをデコードするにはどうすればよいですか?
jsonwebtoken.decode(token)、検証付きならjsonwebtoken.verify(token, key)です。Python: 読み取りにはPyJWT.decode(token, options={'verify_signature': False})を使い、検証には鍵を渡します。Go: 読み取り専用ならjwt.ParseUnverified(token, claims)、検証付きならjwt.Parse(token, keyFunc)です。どの言語でも、本番コードでoptions={'verify_signature': False}で検証を無効にしてはいけません。これはこのWebツールが意図的にデバッグ目的で行っていることであり、認証ではなく検査をしている場合にのみ安全です。 JWTの最大サイズはどのくらいですか?
トークンを貼り付けたら「Invalid JWT format」と表示されました。何が問題ですか?
header.payload.signatureで構成されます。よくある原因は次のとおりです。(1) ペイロード部分だけをコピーしてしまった、(2) 途中に空白や改行が含まれている、(3) 転送中にトークンが切り詰められた(端末の折り返しでよく起こります)、(4) トークンがheader.encryptedKey.iv.ciphertext.tag形式(5つのセグメント)のJWEである、(5) トークンがURLエンコードされていて、まずURLデコードが必要、といったケースです。APIが返した生の値を確認してください。多くのエディタはホバー時に不可視文字を表示してくれます。 シークレット鍵なしでJWTをデコードできますか?
JWTはPostmanでは動作するのにバックエンドで拒否されます。どうデバッグすればよいですか?
RS256のみを受け入れるように設定されたライブラリではHS256トークンは失敗します。(4) kid — キーローテーションを使っている場合、ヘッダーのキーIDはJWKSに存在していますか?(5) 署名 — 正しいシークレット/公開鍵を貼り付けましたか?本デコーダーはヘッダーとペイロードのビューで(1)、(2)、(3)、(4)を明示するため、素早く原因を絞り込めます。 関連ツール
すべてのツールを見る →MD5ハッシュジェネレーター&ファイルチェックサムツール
セキュリティツール
無料オンラインMD5ハッシュ生成ツール。ブラウザ上でMD5・SHA-256・SHA-1・SHA-512のハッシュ値を即座に生成。テキストやファイルのチェックサム検証・比較、ワンクリックコピー対応。登録不要でデータはサーバーに送信されません。
ランダムパスワード生成 — カスタマイズ可能&安全
セキュリティツール
無料のオンラインランダムパスワード生成ツール。ブラウザ上で安全な強力パスワードを即座に自動生成できます。長さや文字種のカスタマイズ、最大50個の一括生成に対応。エントロピー分析付き強度メーター搭載。データはサーバーに送信されません。
UUID生成 & デコーダー — v1, v4, v5, v7 一括生成
セキュリティツール
無料のオンラインUUID生成ツール。v1/v4/v5/v7の全バージョンを即時生成。UUIDのデコード・検証、最大50件の一括生成に対応。登録不要、100%ブラウザ上で動作します。
進数変換ツール — 2進数・16進数・10進数・8進数
単位変換
無料オンライン進数変換ツール。2進数、8進数、10進数、16進数および任意の基数(2-36)間で数値を瞬時に変換。BigInt対応で桁数制限なし。登録不要・サーバー送信なし、すべての処理がブラウザ内で完結。コピーボタンやコードリテラル出力で開発作業を効率化。
Base64エンコーダー&デコーダー
エンコーディングとフォーマット
Base64のデコード・エンコードが無料でオンラインで行えます。リアルタイム変換、UTF-8・絵文字対応。100%ブラウザ上で動作しデータは外部に送信されません。登録不要。
JPEG・PNG・WebP をオンラインで圧縮 — 無料・一括対応
単位変換
無料オンライン画像圧縮ツール。JPEG、PNG、WebP 画像をブラウザ上で最大 80% 縮小。サーバーへのアップロード不要で完全プライベート。最大 20 枚の一括圧縮、品質調整、圧縮前後の比較機能を搭載。登録不要ですぐに使えます。