本文へスキップ
ecdsa.com

Base64url

RFC 4648 §5 で定められた、URL とファイル名に安全な base64 のアルファベットで、+ と / を - と _ に置き換え、JOSE では = のパディングを省略します。JWT の各部分はすべて base64url でエンコードされます。
別表記base64urlBase64URLURL-safe base64RFC 4648 section 5

Base64 は 3 バイトごとに 4 文字に対応付けるため、エンコード後のサイズは入力の約 4/3 になります。64 バイトの ES256 署名は 86 文字に、256 バイトの RS256 署名は 342 文字になります。JWS、JWE、JWK はパディングなしの base64url を使い(RFC 7515 §2)、JSON 内の WebAuthn の id と rawId、DPoP プルーフ、SD-JWT のディスクロージャーも同様です。PEM ファイルと MIME は、パディングと改行を含む標準のアルファベットを使います。

よくあるバグは、base64url を標準の base64 デコーダーでデコードする(- や _ で失敗するか、何の警告もなく誤った値に変換される)、= パディングを付ける、または必須にする、PEM と JWK の間で鍵を移すときに 2 つのアルファベットを混同する、デコードしたバイト列ではなくエンコード済みの文字列を比較する、といったものです。厳格な JOSE パーサーは、コンパクト形式のトークン内のパディングや空白を拒否します。

API:Node.js では Buffer.from(s, "base64url") と buf.toString("base64url")、Python では base64.urlsafe_b64encode(パディングが残るため、自分で取り除く必要があります)、Go では base64.RawURLEncoding、Java では Base64.getUrlEncoder().withoutPadding() を使います。

規格と参考文献

すべての用語