PASETO v4.publicの基本
PASETO v4.publicトークンの仕組み(Ed25519署名、JSONペイロード、任意のフッター)と、v4.localやJWTではなくこれを選ぶべき場面を理解しましょう。
詳細な説明
v4.public は、署名された非対称トークンのための、現代的に推奨されるPASETO形式です。暗号化方式はバージョンで固定されており、すべての v4.public トークンはJSONペイロードに対するEd25519署名と、認証されるが暗号化はされない任意のフッターを使用します。
ワイヤー形式:
v4.publicトークンは次の形を取ります:
v4.public.<base64url(payload || signature)>[.<base64url(footer)>]
中央のセグメントをBase64urlデコードすると、UTF-8 JSONペイロードに64バイトのEd25519署名を連結したものになります。署名関数はペイロード、バージョン+用途ヘッダー(v4.public)、任意のフッターを**事前認証エンコーディング(PAE)**入力として受け取るため、ヘッダー・ペイロード・フッター間でバイトを移動させて別の有効なトークンを作る攻撃が成立しません。
ペイロードに入れる内容:
ペイロードはプレーンなJSONで、JWTと同じ予約クレーム(iss、sub、aud、exp、iat、nbf、jti)が使えます。ただし重大な違いとして、PASETOはタイムスタンプにUnix秒ではなくISO 8601を使います("exp": "2026-01-01T00:00:00Z")。これによりペイロードが人間に読みやすく、タイムゾーンも明示的になります。
localではなくpublicを選ぶ理由:
publicモードは、発行者と検証者が異なる主体である場合(例:認証サービスが発行したトークンを下流のマイクロサービスが独立に検証する)に正しい選択です。検証者は公開鍵だけを必要とし、秘密鍵は不要です。1つのプロセスがトークンを発行も消費もするサービス間トークンには、非対称暗号を実行する必要のない v4.local(対称)の方が効率的です。
JWT RS256/EdDSAとの比較:
v4.publicトークンは、EdDSA(Ed25519)で署名されたJWTとほぼ同等です。主な違い:PASETOにはアルゴリズム取り違え攻撃面がなく(algがバージョンで固定)、タイムスタンプ形式は数値ではなくISO 8601、構造もよりシンプル(ネストしたヘッダーJSONがない)です。v4のライブラリサポートはRust、Go、Node、Python、PHPで充実しています。
ユースケース
アイデンティティプロバイダがユーザーセッションにv4.publicトークンを発行し、下流のAPIサービスが発行者の公開Ed25519鍵で検証 — 漏洩する共有シークレットがありません。