PASETO v4.publicの基本

PASETO v4.publicトークンの仕組み(Ed25519署名、JSONペイロード、任意のフッター)と、v4.localやJWTではなくこれを選ぶべき場面を理解しましょう。

Version

詳細な説明

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と同じ予約クレーム(isssubaudexpiatnbfjti)が使えます。ただし重大な違いとして、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鍵で検証 — 漏洩する共有シークレットがありません。

試してみる — PASETO Decoder

フルツールを開く