コンテンツにスキップ

🪪 JWT 生成・署名ツール

ヘッダー・ペイロード・シークレットを入力すると、ブラウザ内で署名済み JWT を生成します。HS256 / HS384 / HS512 対応。Web Crypto API 使用。

完全無料 登録不要 ブラウザ完結 5 言語対応 ダークモード
Header (Base64URL)
Payload (Base64URL)
Signature (Base64URL)

⚠️ セキュリティに関する注意

• シークレットは Web Crypto API でブラウザ内のみ使用され、サーバーには一切送信されません。

• 本番環境のシークレットを Web ツールに入力するのは推奨されません。テスト・学習・デバッグ用途にお使いください。

• HS256 のシークレットは最低でも 256 ビット (32 バイト)、HS512 は 512 ビット (64 バイト) 以上を推奨します。

📖 つまずきやすいポイント

ヘッダー・ペイロード・シークレットを入力すると、Web Crypto API を使ってブラウザ内で署名済み JWT を生成します (HS256 / HS384 / HS512)。iatexp はボタンで追加できます。シークレットがサーバーに送られることはありません。ただし JWT について最初に理解しておくべきことがありますJWT は暗号化ではありませんペイロードは Base64URL で「符号化」されているだけで、鍵を持たない誰でも中身を読めます。署名が保証するのは「改ざんされていないこと」だけで、「見られていないこと」は一切保証しません

ケース 何が起きるか どうする
本番のシークレットをブラウザツールに入れてしまう このページは値をサーバーに送りませんが、「送信されない」と「痕跡が残らない」は別です。入力した文字列は DOM の中に存在しブラウザの入力履歴やオートフィルに残る可能性がありスクリーンショットや画面共有に写りインストールしている拡張機能からはページの内容が読めますクリップボードにコピーすれば、クリップボード履歴ツールにも残ります。そして最も見落とされがちなのが生成したトークンそのもので、デバッグのために Slack やチケットに貼った JWT は、シークレットが漏れていなくても、そのトークンが有効な間ずっと使えますJWT は Bearer トークンなので、持っている人が本人として扱われます このページには使い捨てのシークレットだけを入れてください。 「ランダム生成」ボタンで作った値で十分です — 署名の仕組みを確かめるのが目的なら、本物である必要はありませんすでに本番のシークレットを貼ってしまったなら、対処は 1 つだけです: 直ちにローテーションしてください「たぶん大丈夫」で放置すると、漏洩したかどうかを後から判定する手段がありませんHMAC のシークレットは、1 つのトークンを捕まえれば手元で総当たりできるので、辞書に載っている語や短い文字列は特に危険です。そして本番のシークレットは、そもそも人間が目にしない設計にしてください環境変数やシークレット管理サービスから直接読み込ませ、コピー&ペーストの経路を作らないことが最も効果的です
exp は検証側でしか効かない expただのフィールドで、時間が来ればトークンが自動的に無効になる仕組みではありません検証する側がその値を読んで拒否して、はじめて期限として機能します。ここから 4 つの定番の不具合が出ます。(1) exp を入れ忘れると、そのトークンは永久に有効です。(2) 値の単位を間違えるJWT の時刻は「エポックからの秒数」で、JavaScript の Date.now() はミリ秒なので、そのまま入れると5 万年後を指します。(3) サーバー間の時計のずれで、発行直後のトークンが nbf にかかって拒否されます。(4) 発行済みトークンは取り消せませんログアウトしても、パスワードを変えても、exp まで有効です。 アクセストークンの exp は短くしてください15 分から 1 時間が一般的な目安です。長期のログイン状態はリフレッシュトークンで維持し、そちらはサーバー側に保存して個別に無効化できるようにします「取り消せない」問題を正面から解くには、これしかありません即時の失効が要件なら、jti (トークン ID) を入れて拒否リストを持ちますただしその時点で「サーバーに状態を持たない」という JWT の利点は失われるので、本当にその要件があるのかを先に確かめてください。検証側の実装では、expnbf の比較に数十秒の許容差 (leeway) を入れます。そして時刻の単位は必ず秒 — JavaScript なら Math.floor(Date.now() / 1000) です。
検証側がトークンの alg を信じてしまう ヘッダーの alg は、攻撃者が書き換えられる場所にありますそれを読んで検証方法を決めるライブラリは、攻撃者に検証方法を選ばせていることになります。有名な破り方が 2 つあります。(1) alg: none「署名なし」という値を書き込み、署名部分を空にすると、素直に実装されたライブラリはこれを受け入れてしまいます。(2) RS256 と HS256 の取り違え本来 RSA 公開鍵で検証するはずのトークンを、algHS256 に書き換えて「公開鍵を HMAC のシークレットとして」署名する手口です。公開鍵は公開されているので、攻撃者は自由に有効なトークンを作れますどちらも実装のバグであって、JWT 自体の欠陥ではありません。 検証側では、使うアルゴリズムを固定値として渡してください。 ほとんどのライブラリは algorithms: ['HS256'] のような引数を受け取ります — これを省略できる API なら、省略しないでくださいトークンから読んだ alg は、検証の入力ではなく検証の対象です。鍵も同様に固定し、複数の鍵をローテーションするなら kid で選ぶ形にして、必ず自分の鍵集合の中から選ばせてください。シークレットの強度も忘れずに: HS256 なら 256 ビット (32 バイト) 以上のランダム値を使い、覚えられるパスワードは使わないでくださいHMAC は 1 つのトークンさえあればオフラインで検証し放題なので、辞書攻撃が現実的な脅威になりますそして最後に、ライブラリを自作しないことです。

ペイロードに機密を入れないでください。繰り返しになりますが誰でも読めますメールアドレス・電話番号・権限の内訳・内部の ID などを入れると、それはトークンを見た人全員に公開されますブラウザの DevTools を開けば自分のトークンの中身が読めることを、設計時に思い出してください。クレームは最小限にし、詳細は必要になったときにサーバーから引くのが安全です。そもそも JWT が最適でない場面も多くあります同一ドメインの一般的な Web アプリなら、サーバー側セッションのほうが単純で、しかも即座にログアウトできますJWT が本当に効くのは、複数のサービスをまたぐ認証や、検証側が発行元に問い合わせられない構成です。「モダンだから JWT」は理由になりません状態を持たない代わりに取り消せない、というトレードオフを引き受けられるかどうかで選んでください。

📖 使い方

  1. 1
    アルゴリズムとペイロードを設定
    HS256 / HS384 / HS512 からアルゴリズムを選択し、Payload フィールドに JSON クレームを入力します。+iat や +exp ボタンで標準クレームをワンクリックで追加できます。
  2. 2
    シークレットを入力または生成
    シークレット欄にキーを入力するか、「ランダム生成」ボタンで 256 bit の安全な鍵を自動生成します。UTF-8 / Base64 / Base64URL の入力形式を選択できます。
  3. 3
    生成された JWT をコピー
    右パネルに署名済み JWT が即座に表示されます。コピーボタンでクリップボードに取得し、JWT デコーダーや API テストに使用してください。

❓ よくある質問

HS256・HS384・HS512 の違いは何ですか?
いずれも HMAC 署名で、数字は使用する SHA ハッシュのビット長を示します。HS256 が最も広く使われており、HS512 は高セキュリティが求められる場合に適しています。
本番環境のシークレットを入力しても安全ですか?
シークレットはブラウザ内の Web Crypto API のみで使用され、サーバーには送信されません。ただし、本番シークレットを Web ツールに入力することは一般的に推奨されません。テスト・学習用途にのみお使いください。
RS256 や ES256 などの非対称アルゴリズムには対応していますか?
このツールは HMAC 系 (HS256 / HS384 / HS512) のみ対応しています。RS256・ES256 などの非対称アルゴリズムはサポートしていません。非対称署名には専用ライブラリを使用してください。
🐛 このツールで問題が発生しましたか?

完全無料・登録不要。再現手順だけでも結構です。届いたご報告は運営者に直接届き、修正の参考にします。

※ 不具合再現のため、ブラウザ情報 (UA / 画面サイズ / 言語 / URL) を自動で送信します