Base64URL エンコードのガイド:リンクと JWT に収まる Base64
標準 Base64 のプラスとスラッシュは URL で意味を持つため、リンクに貼ると壊れます。Base64URL はその置き換えであり、アルゴリズム自体は同じです。
これでなければならない場面
バイナリや JSON をクエリパラメータ、パス、ファイル名、OAuth の state や PKCE の検証値に入れるなら、URL 安全な文字表が必要です。そうしないとプラスは空白として届き、スラッシュはパス区切りとして扱われ、サーバに届く前に壊れます。
代表例が JWT です。ヘッダとペイロードは Base64URL の JSON で、ドットで連結します。署名も同じ文字表なので、Authorization ヘッダにも URL にもそのまま置けます。
- JWT のヘッダ、ペイロード、署名
- OAuth の state、PKCE の検証値
- URL パラメータ、パス、ファイル名のバイナリ
- Webhook コールバックの短いデータ
3つの置換を省かない
UTF-8 のバイト列を Base64 にし、プラスをマイナス、スラッシュをアンダースコアに変え、末尾の等号をすべて削除します。順序を変えたり一部だけ置換すると、戻せない文字列になります。等号を消すのは URL でもエスケープが必要なためです。
サイズは約4/3に増えます。これは Base64 の固定のオーバーヘッドで、ツールが余計なことをしているわけではありません。出力は英数字とマイナス、アンダースコアだけなので、URL に入れても再エンコードは不要です。
- 文字表は英数字と - と _
- 末尾の等号は削除、復号時に補う
- サイズは約1.33倍
境界:可逆で、完全に公開
Base64URL は暗号ではありません。鍵がなく、誰でも戻せます。JWT のペイロードは「暗号化」ではなく「エンコード」なので、ロールや内部 ID、メールアドレスを入れるのは公開に近い行為です。
署名が保証するのは完全性で、改ざんは検出できますが内容は隠せません。機密性が必要なら JWE やペイロードの暗号化、改ざん検出が必要なら署名です。両者は併用できますが、代替にはなりません。
- 鍵なし、誰でも可逆
- JWT のペイロードは読める。秘密を入れない
- 署名は完全性、暗号化は機密性
よくある質問
通常の Base64 との違いは何ですか
プラスをマイナス、スラッシュをアンダースコアにし、末尾の等号を削除する3点だけです。復号時は逆置換してパディングを戻します。中身は同じで、URL に入れるかどうかで選びます。
なぜ等号を削除するのですか
等号はデータを持たないパディングですが、URL ではエスケープが必要で、コピーや連結のときに壊れやすいからです。長さから補う数を推測できるため、往復は無損失です。
JWT の中身は安全ですか
安全ではありません。Base64URL でエンコードされているだけで、トークンを持つ人は全項目を読めます。署名は改ざんされていないことの証明で、秘匿性はありません。
関連ツール:Base64URLエンコーダー