tigtools

JWT ジェネレーター

テスト用に JSON Web Token を作成して署名するか、トークンの HMAC 署名がシークレットと一致するかを確認します。署名にはブラウザの Web Crypto API を使用します。

ブラウザー内で動作 登録不要

モード
シークレットはこのブラウザタブ内にのみ保持され、外部へ送信されることはありません。それでも本番用の署名シークレットをウェブサイトに貼り付けないでください。シークレットを知る人は誰でも、あなたのシステムで有効なトークンを作成できます。ここではテスト用のシークレットを使用してください。

alg はアルゴリズムメニューから設定されます。typ はデフォルトで JWT です。

sub、iat、exp などのクレーム。時刻は 1970 年 (UTC) からの秒数です。

トークンに署名するにはシークレットを入力してください。

使い方

  1. HS256、HS384、HS512 のいずれかを選択します。
  2. ペイロードのクレームを編集し、「iat と exp を設定」をクリックして現在時刻と有効期限を追加します。
  3. テスト用シークレットを入力するか、ランダムな 256 ビットのシークレットを生成します。
  4. 署名済みトークンをコピーします。トークンを確認するには、「署名を検証」に切り替え、トークンを貼り付けてシークレットを入力します。

仕組み

JSON Web Token(RFC 7519)は、ヘッダー、クレームのペイロード、署名という3つのBase64URLエンコード部分から構成されます。HMACアルゴリズムのHS256、HS384、HS512では、署名は共有シークレットを鍵として「header.payload」に対してSHA-256、SHA-384、SHA-512によるHMACを適用したものです。シークレットを持つ人だけがトークンを作成・検証できます。

このツールはヘッダーとペイロードをコンパクトなJSONとしてシリアライズし、エンコードして、ブラウザに組み込まれたWeb Crypto APIであるcrypto.subtleで署名します。ヘッダーのalgフィールドは選択したアルゴリズムと常に一致し、typはデフォルトでJWT、kidなどその他のヘッダーフィールドは保持されます。「iatとexpを設定」は現在時刻をiat(発行時刻)として書き込み、選択した有効期間をexpとして追加します。どちらも1970年1月1日UTCからの秒数です。結果は他のJWTライブラリと一致し、たとえばよく知られたjwt.ioのサンプルトークンも正確に再現されます。

シークレットはプレーンテキスト(UTF-8バイトが鍵になります)またはBase64/Base64URLエンコードされたバイト列を使用できます。後者は多くのフレームワークで使われています。ランダムシークレットボタンはcrypto.getRandomValuesで32バイトの乱数を生成します。HS256では少なくとも32バイトの乱数を使用してください。人間が選んだ短いシークレットは、どのトークンからでもオフラインで推測される可能性があります。

検証ではトークンをデコードし、HMACアルゴリズムが使われていることを確認し、crypto.subtle.verifyで署名を再計算します。また、expまたはnbfによりトークンが期限切れまたはまだ有効でない場合も表示します。RS256、ES256などの公開鍵アルゴリズムには対応しておらず、ここでの検証は発行者、オーディエンス、その他アプリケーションが必要とするクレームをチェックしません。

使用例

ローカルでAPIをテストする

開発サーバーが「dev-secret-change-me」で署名されたHS256トークンを要求しているとします。subにテストユーザーIDを設定し、有効期間1時間で「iatとexpを設定」をクリックし、シークレットを入力して、Authorization: Bearerヘッダーでトークンを送信します。

どのシークレットで署名されたかを確認する

ステージング用トークンが拒否されます。それを「署名を検証」に貼り付け、ステージング用シークレットを試します。「署名が有効ではありません」と表示されたら、トークンが別のシークレットで署名されたか、シークレットの形式が異なる(テキストとBase64)ことを示します。

jwt.io のサンプルを再現する

ヘッダー {"alg":"HS256","typ":"JWT"}、ペイロード {"sub":"1234567890","name":"John Doe","iat":1516239022}、シークレット “your-256-bit-secret” を使うと、トークンの末尾は SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c になり、jwt.io と同じになります。

よくある質問

シークレットはサーバーに送信されますか?

いいえ。署名と検証はブラウザ内で Web Crypto API によって実行され、シークレットが保存されたり送信されたりすることはありません。それでも、実際の署名用シークレットをウェブサイトに入力すべきではないため、テスト用シークレットのみを使用することをおすすめします。

シークレットが正しいのに署名が無効になるのはなぜですか?

シークレットの形式を確認してください。システムによってはシークレットのテキストをそのまま使うものもあれば、先に Base64 からデコードするものもあり、鍵のバイト列が異なります。また、トークンが変更されていないことと、同じアルゴリズムが使われていることも確認してください。

RS256 や ES256 のトークンを作成できますか?

このツールではできません。共有シークレットを使う HMAC アルゴリズム HS256、HS384、HS512 のみ対応しています。

ペイロードは暗号化されますか?

いいえ。署名付き JWT はエンコードされているだけで、誰でもペイロードをデコードして読むことができます。署名は改ざんされていないことを証明するだけです。パスワードやその他の秘密情報をペイロードに入れないでください。

プライバシー

トークンは、Web Crypto API を使用してブラウザ内でのみ作成・検証されます。ヘッダー、ペイロード、トークン、シークレットがアップロード、保存、または分析に含まれることはありません。