「公開鍵、どこに置いたっけ?」

JWTの署名検証にRSAなどの公開鍵方式を使うとき、必ずぶち当たる壁があります。「公開鍵はどうやって配布するのが一番安全?」「鍵を更新したとき、全サーバーの設定を書き換えるの?」

その悩みを解決する仕組みが**JWKS(JSON Web Key Set)**です。JWKS生成ツール では、ブラウザ内でRSA鍵ペアを生成し、JWKS形式(公開鍵)とPEM形式(秘密鍵)の両方をその場で確認できます。

JWKSとは?JWT署名検証で使う公開鍵セットの仕組み

JWKS:公開鍵の「ショーケース」

JWKSは「JSON形式で書かれた鍵のセット」です。認証サーバー(Auth0やCognitoなど)が特定のURL(/.well-known/jwks.json が一般的)でこのJSONを公開し、検証側のAPIサーバーがそれを読み取りに行きます。

なぜJWKSが便利なのか

  1. 自動ローテーション: 鍵を新しくしても、エンドポイントの中身を入れ替えるだけ。APIサーバーはURLを見に行くだけで最新の鍵を手に入れられる
  2. 複数鍵の並行管理: 「古い鍵」と「新しい鍵」を同時に置いておけるので、移行期間もスムーズ
  3. 世界標準: OAuth 2.0やOIDCで広く採用されているため、多くのライブラリが標準対応している

JWKSの中身:フィールドの意味

{
  "keys": [
    {
      "kty": "RSA",
      "n": "0vx7agoebGcQ...",
      "e": "AQAB",
      "kid": "f47ac10b-...",
      "use": "sig",
      "alg": "RS256",
      "key_ops": ["verify"]
    }
  ]
}
フィールド役割
kty鍵の種類(RSAなど)
n / eRSA公開鍵の本体(モジュラスと公開指数)
kid鍵の識別子。JWTのヘッダーと照合し、どの鍵で検証するか選ぶための鍵ローテーションの要
use用途。署名検証用なら sig(暗号化用は enc
alg / key_opsアルゴリズムと許可操作の宣言。検証側の誤用防止

keys は配列なので、ローテーション中は新旧2つの鍵が並び、JWTヘッダーの kid で選別されます。

ブラウザで鍵ペアを生成する

JWKS生成ツールjose ライブラリとWeb Crypto APIを組み合わせ、RSA 2048bit(RS256署名用)の鍵ペアをその場で生成します。

  • 公開鍵(JWKS形式): /.well-known/jwks.json のモックとして使える
  • 秘密鍵(PEM形式): JWTの署名生成に使える
  • kid は指定しなければランダムなIDが自動採番される

生成はブラウザ内で完結するため、秘密鍵がインターネットに流れる心配はありません。ローカル開発で自作の認証サーバー(モック)を立てる際や、JWT検証ロジックの単体テストに向いています。

JWT署名検証でJWKSが使われる流れ

  1. 認証サーバーがJWTを発行する
  2. JWTヘッダーには、署名に使った鍵を示す kid が入る
  3. APIサーバーはJWKSエンドポイントから公開鍵一覧を取得する
  4. kid が一致する公開鍵を選ぶ
  5. その公開鍵でJWTの署名を検証する

この仕組みによって、APIサーバーは秘密鍵を持つ必要がありません。秘密鍵は認証サーバー側だけに置き、検証側は公開鍵だけを使うことで役割を分けて安全に運用できます。JWTのペイロード自体はBase64URLエンコードされているだけで暗号化はされていない、という前提は JWTデコードツール で実際のトークンを確認すると分かりやすいです。

JWKSを扱うときの注意点

  • JWTヘッダーの kid とJWKS内の kid が一致しているか
  • alg が想定している署名アルゴリズムか
  • JWKSの取得結果を適切にキャッシュしているか
  • 鍵ローテーション時に新旧の鍵を一時的に並べているか
  • 失効した鍵をいつ削除するか決めているか

とくに鍵ローテーションでは、新しい鍵で発行されたJWTと、古い鍵で発行済みのJWTが同時に存在する期間があります。その間はJWKSに複数の公開鍵を載せ、どちらのJWTも検証できる状態にしておくのが一般的です。

よくある質問

JWKSに秘密鍵を入れてもいいですか?

入れてはいけません。JWKSとして外部に公開するのは、署名検証に使う公開鍵です。秘密鍵はJWTを発行する側だけが保持し、ブラウザやAPI利用者から見える場所には置かないでください。

kid は必須ですか?

複数の鍵を扱う運用では非常に重要です。JWTヘッダーの kid とJWKS内の kid を照合することで、検証側はどの公開鍵を使えばよいか判断できます。鍵ローテーションを考えるなら、最初から kid を付けておくのがおすすめです。

ローカル開発用のJWKSはどう作ればいいですか?

JWKS生成ツール でテスト用の鍵ペアを生成し、公開鍵側をJWKSとして使えます。本番の秘密鍵を貼り付けたり共有したりせず、開発用と本番用の鍵を分けて管理してください。

生成した鍵をそのまま本番で使えますか?

推奨しません。このツールの用途は開発・テスト・学習です。生成自体はブラウザ内で完結し鍵が外部に送信されることはありませんが、本番の署名鍵はHSMやKMSなど、管理された環境で生成・保管すべきものです。

まとめ

  • JWKSは公開鍵をJSON形式で配布する仕組み。kid が鍵ローテーションの要
  • use / alg / key_ops は誤用防止の宣言
  • 検証側は秘密鍵を持たず、JWKSエンドポイントから取得した公開鍵だけで署名検証できる
  • ローテーション中は新旧の鍵をJWKSに並存させる

OpenSSLのオプションを思い出す時間を節約したいときに、ぜひどうぞ。