JWT(JSON Web Token)の仕組みを解説する記事です。筆者は個人開発で採用しているNext.js+Go API+Auth0構成をもとに、署名のみ行うJWS(header.payload.signatureの3要素をドット2個で連結した構造)と、暗号化も行うJWE(ドット4個で区切られる構造)の違いを説明しています。Base64URLは暗号化処理ではなく、URLで使える文字列形式への変換処理にすぎない点も指摘されています。
RS256(RSASSA-PKCS1-v1_5 using SHA-256)方式では署名は秘密鍵でのみ可能で、検証は公開鍵があれば誰でも実行できます。JWT Claims Setには仕様で定義された7つの登録済みクレーム(iss、sub、aud、exp、nbf、iat、jti)があり、Auth0のデフォルトのアクセストークン有効期限は86400秒(24時間)です。セッションCookie(名前は__session)はJWE形式で暗号化されているとのことです。
実装上の注意点として、IDトークンとアクセストークンを見分ける確実な方法はaudクレームの確認であること、JWTの検証に使う鍵の取得先は設定値から決定すべきで、トークン内のissから動的に決定してはいけないことが挙げられています。「署名が言えるのは『誰が作ったか』と『途中で変わっていないこと』まで。『自分宛か』は、受け取る側がaudを照合して初めて分かる」という指摘は、認証実装の基本を押さえるうえで参考になります。
出典が伝えている要点
- JWT Claims Setには仕様で定義された7つの登録済みクレーム(iss、sub、aud、exp、nbf、iat、jti)がある
- JWS(署名型)はheader.payload.signatureの3要素をドット2個で連結した構造を持つ
- JWE(暗号化型)はドット4個で区切られる構造を持つ
- Base64URLは暗号化処理ではなく、URLで使える文字列形式への変換処理である
- RS256(RSASSA-PKCS1-v1_5 using SHA-256)では署名は秘密鍵でのみ可能で、検証は公開鍵を使えば誰でも実行できる
- Auth0のデフォルトのアクセストークン有効期限は86400秒(24時間)である
- セッションCookie(名前は
__session)はJWE形式で暗号化されている - IDトークンとアクセストークンを見分ける確実な方法は
audクレームを確認することである - JWTの検証に使う鍵の取得先は設定値から決定すべきで、トークン内の
issから動的に決定してはいけない
原文より
署名が言えるのは『誰が作ったか』と『途中で変わっていないこと』まで。『自分宛か』は、受け取る側が `aud` を照合して初めて分かる。
出典: zenn.dev