KernelHost Tools JWT Decoder

JWT Decoder

JSON Web TokenをHeader、Payload、Signatureの3つのパートに分解し、Claimsを確認、Secretまたは公開鍵で署名を検証(任意)。すべてはブラウザでローカルに動作します。

トークンをフィールドに貼り付けると、3つのボックスがリアルタイムに更新されます(入力は約300 msデバウンスされます)。

100%ブラウザ内: 本ツールは純粋なHTML+JavaScriptです。あなたのJWT、Secret、公開鍵はすべてあなたの端末で処理され、サーバーには一切送信されません。
Header
入力待ち ...
Payload
入力待ち ...
Signature
入力待ち ...

署名を検証(任意)

HS256/HS384/HS512は共有Secretが必要です。RS*、PS*、ES*はPEM形式の公開鍵(SPKI / BEGIN PUBLIC KEY)を使います。Ed25519は現代のブラウザで動作します。

検証準備完了
ヒント: 本番の検証はブラウザではなくサーバーのAuthレイヤーで行ってください。本ツールはデバッグ、リバースエンジニアリング、学習用です。

JWTとは?

JSON Web Token(JWT、発音は "jot")はRFC 7519で定義されたコンパクトな署名済みJSONオブジェクトです。Claimsを2者間で運びます。典型的にはAuthサーバーとAPIの間です。サーバーは認証成功後にトークンを発行し、クライアントは各API呼び出しで`Authorization: Bearer ...`ヘッダーで添付します。

JWTはドットで結ばれた3つのbase64urlエンコード部から成ります。暗号化されていません。署名のみです。トークンを手にした者は誰でも内容を読めるため、パスワードや他の機密はpayloadに入れてはいけません。

サーバーサイドセッションに対する利点: JWTはself-containedです。APIサーバーはAuthサーバーに連絡したりセッションストアを問い合わせたりせずにトークンを検証してパーミッションを取り出せます。水平スケールに優れる代わりに、個別トークンの早期失効が困難になります。

Header、Payload、Signatureの解説

各JWTは単一のドットで結ばれた3つのパートから成ります:

  • Header: 小さなJSONオブジェクト。`alg`(アルゴリズム、例 HS256、RS256、ES256)と`typ`(通常 "JWT")を含みます。場合により`kid`(key ID)で署名鍵のヒントを付けます。
  • Payload: Claimsを保持するJSONオブジェクト。標準フィールドは`iss`(issuer)、`sub`(subject)、`aud`(audience)、`exp`(expiration)、`nbf`(not before)、`iat`(issued at)、`jti`(unique token ID)。カスタムフィールドも許可されます。
  • Signature: `base64url(header) + "." + base64url(payload)`に対し設定したアルゴリズムで計算します。完全性を保護し、鍵を知らなければ内容を気付かれずに変更できません。

重要: base64urlはエンコーディングであり、暗号化ではありません。HeaderとPayloadはどの観察者にも読めます。

JWT 対 セッションCookie

両者とも認証状態を保持しますが、やり方が異なります:

  • セッションCookie: 不透明なID。サーバーはセッションストアで完全な状態を引き当てます。即時失効可能ですが、リクエストごとに参照が必要です。
  • JWT: 状態自体を運び、署名のみで保護されます。参照不要、マイクロサービスに最適。代わりに早期失効はallow/denyリストが必要です。
  • サイズ: JWTは通常300から1500バイト。セッションIDは約32バイト。多数のAPI呼び出しでJWTサイズが帯域に積み上がります。
  • Storage: ブラウザではCookie(HttpOnly、Secure、SameSite)が安全な保存先です。localStorageはXSSに晒されます。

目安: 純サーバーアプリにはセッション、APIゲートウェイとモバイルバックエンドにはJWT。理想は短い寿命とリフレッシュトークンフローです。

JWTセキュリティ: `algorithm: none`への対応

近年JWTライブラリには大きなバグがいくつかありました。最大の落とし穴:

  • `alg: none`: ヘッダーがそう主張すると未署名トークンを受け入れたライブラリがありました。修正: `none`を絶対許可せず、許可アルゴリズムをサーバー側で固定します。
  • HS256/RS256混同: 攻撃者がRSA公開鍵をHMAC Secretとして使ってトークンを署名し、サーバーがRS256ではなくHS256として検証して騙されます。防御: 許可`alg`をサーバーで固定。
  • `kid`インジェクション: `kid`フィールドは鍵を指しますが、サニタイズしないとパストラバーサルやSQLインジェクションになり得ます。値を信頼できない入力として扱ってください。
  • 弱いSecret: 鍵に "secret" や "password" を使ったHS256トークンは数秒でブルートフォース可能です。最低256ランダムビット、できれば`crypto.getRandomValues()`または`/dev/urandom`から取ってください。
  • 長い寿命: 発行されたJWTは満了まで有効で、ユーザーがログアウトしても変わりません。短寿命(15分)+ リフレッシュトークン、機微なエンドポイントには deny リストを使ってください。

OWASPチートシートとRFC 8725(JWT Best Current Practices)は必読です。

JWTの検証手順

完全な検証は署名だけではありません。サーバーコードでの順序:

  • ヘッダーをパースし、`alg`をホワイトリストに照合(例 RS256のみ許可)。
  • Issuer設定に対応する鍵で署名を検証。JWKSではlookupに`kid`を使うが、値を先にホワイトリスト化します。
  • 標準Claimsを検証: `iss`が想定発行者と一致、`aud`が自身のAudienceを含む、`exp`が未来、`nbf`と`iat`が過去(時計のずれを少し許容)。
  • カスタムClaims(ロール、テナントID、Scopes)をビジネスモデルに対して検証。
  • 早期失効が必要なら、deny / logoutリストをチェック。

確立されたライブラリ(jose、jjwt、jsonwebtokenなど)に頼り、自作コードに頼らないでください。暗号は趣味プロジェクトではありません。

AuthバックエンドをKernelHostでホスト

JWT Issuerとリソースサーバーには信頼できる低遅延のバックエンドが必要です。KernelHostはFrankfurt FRA01で自社のVPSとDedicatedサーバーを運用し、DDoS対策、IPv4 + IPv6、1 Gbit/sアップリンクを備えます。欧州エンドユーザーへの低RTT、フェアな価格、ベンダーロックインなし。本社はWien(AT)、データセンターはFrankfurt(DE)です。

JWTのよくある質問

本番のJWTを本ツールに貼り付けても安全ですか?

安全です。本ページはサーバーロジックなしの静的HTMLとJavaScriptです。内容はブラウザを離れず、localStorageにも保存されません("記憶"オプションを有効にした場合のみHMAC Secretまたは公開鍵が保存されます)。

署名検証で対応するアルゴリズムは?

Secretを伴うHMAC HS256、HS384、HS512。公開鍵(PEM、SPKI)を伴うRSA RS256/384/512、PS256/384/512、ECDSA ES256/384/512。EdDSA / Ed25519は現代のブラウザで動作します。

なぜ "アルゴリズム未対応" と表示されるのですか?

一部のアルゴリズム(例 Ed25519)は新しいブラウザでのみ提供されます。ブラウザを更新するか、サーバー側で署名を検証してください。

ツールでトークンを署名 / 生成できますか?

いいえ、本ツールは検証とデコードのみです。トークン生成にはjose、jjwt、jsonwebtokenなどを使ったサーバー側コードを利用してください。

base64urlは通常のBase64と同じですか?

ほぼ同じです。base64urlは`+`と`/`を`-`と`_`に置き換え、padding(`=`)を任意にして、URL安全になります。

`exp`が過去だとどうなる?

トークンはそれでもデコードされます(調査用)が、橙色の "期限切れ" バッジが付きます。サーバーコードは常に期限切れトークンを拒否すべきです。

Secretや公開鍵はどこかに保存されますか?

"記憶"オプションを有効にしたときだけ、Secretと公開鍵がブラウザの`localStorage`に保存されます。サーバーには絶対に保存されません。チェックを外せば削除されます。

ツールに上限はありますか?

固定上限はありません。実務では約4 KiB以下のJWTは確実に動きます。非常に大きなトークンではハイライト時にブラウザが目に見えて遅くなることがあります。

KernelHost 全製品

ツール以上のものが必要ですか?商用ホスティングのラインナップをご覧ください。