MiServe DevTools

あなたのステッカー

ツールをここにピン留めできます。このブラウザに保存されます。

JWT のデコード・検証・署名

JSON Web Token をデコードしてクレームと有効期限を確認し、シークレットや公開鍵で署名を検証します。HMAC でトークンに署名することもできます。

ブラウザ内で動作します。貼り付けた内容はアップロードされません。

このツールについて

JWT とは

署名付きの JSON Web Token(RFC 7519)は、ヘッダー、ペイロード、署名の 3 つの Base64URL 文字列をドットでつないだものです。ヘッダーはトークンの署名方式(alg)を示します。ペイロードはクレームを並べた JSON オブジェクトで、トークンの対象(sub)、発行者(iss)、有効期限(exp)などを記述します。署名は最初の 2 つの部分から計算されます。

デコードは検証ではありません。ヘッダーとペイロードはエンコードされているだけで、暗号化されていません。このページが鍵なしで読めるように、トークンを持っていれば誰でも中身を読めますし、誰でも好きなクレームでトークンを作れます。JWT のペイロードに秘密情報を入れたり、署名を検証する前にクレームを信頼したりしてはいけません。

署名の検証

HS256、HS384、HS512 は HMAC です。署名と検証に同じシークレットを使うため、検証できる人は誰でも偽造もできます。RS256、PS256、ES256 とその 384・512 版は非対称方式です。発行者は秘密鍵で署名し、受け取る側は公開鍵で検証します。公開鍵は、発行者の jwks_uri で JWK Set として公開されていることがよくあります。

シークレット、または公開鍵(PEM、X.509 証明書、JWK)を貼り付けてください。検証はブラウザの Web Crypto API が行います。結果は、署名が有効、無効、検証できない、のいずれかです。検証できない場合はその理由を表示します。鍵がない、鍵の種類や曲線が違う、アルゴリズムに対応していない、またはヘッダーが "alg": "none" でトークンにまったく署名されていない、のいずれかです。

署名が有効であることは必要条件ですが、十分条件ではありません。実際のサービスでは、有効期限、発行者、対象者も確認し、受け入れるアルゴリズムをトークンのヘッダーに頼らず自分で決める必要があります。

時刻、サンプルトークン、署名

exp、nbf、iat は秒単位の Unix タイムスタンプです。クレームの表ではお使いのタイムゾーンの日時で表示し、その上のバッジには、端末の時計を基準に、期限切れか、まだ有効でないか、あとどれだけ有効かを表示します。

ページを開くと、ブラウザ内で作成したサンプルトークンが表示されます。発行時刻は現在、有効期間は 1 時間です。HS256 とサンプルのシークレット devtools-sample-secret-not-for-production で署名しているので、検証に成功します。このシークレットは公開されているため、実際の用途には使わないでください。

署名モードでは、編集したヘッダーとペイロード、HMAC シークレットからトークンを作成します。テストやローカル開発に使ってください。入力したトークン、シークレット、鍵はこのタブの中だけで扱われ、送信、保存、記録されることはありません。

よくある質問

ここに JWT を貼り付けても安全ですか?

トークンはブラウザ内の JavaScript でデコード・検証され、サーバーには送信されません。とはいえ、期限切れでないトークンはそのまま使える認証情報です。トークンの入力を求めるツールには注意し、できれば期限切れのトークンやテスト用のトークンを使ってください。

JWT の中身は誰でも読めますか?

はい。ヘッダーとペイロードは Base64URL でエンコードされた JSON で、暗号化されていないため、トークンを持っていれば鍵なしで読めます。署名は何も隠しません。署名鍵を持つ者がトークンを作成し、その後改変されていないことを示すだけです。

HS256 と RS256 の違いは何ですか?

HS256 は署名と検証の両方に 1 つの共有シークレットを使うため、検証できる側なら誰でもトークンを作成できてしまいます。RS256 は秘密鍵で署名し、公開鍵で検証します。そのため、発行者だけが作成できるトークンを多数のサービスで検証できます。

トークンが期限切れと表示されるのはなぜですか?

端末の時計で見て、exp クレームの時刻が過去になっているためです。多少の時刻のずれを許容するサーバーもありますが、期限切れのトークンは、サインインし直すかリフレッシュトークンを使って取得し直す必要があります。

エンコードのほかのツール