Akata Works

東京エンジニア。主にRuby,Go,たまにAWSとiOS。ゲーム音楽が好きです。連絡はTwitterかakata.onen@gmail.comまで

Base64エンコードとBase64URLエンコードについて

GoogleさんのProtocol Buffersでエンコードしたデータをクエリパラメータで含めようと思ったので改めてBase64エンコードとBase64URLエンコードについて調べてみました

Base64エンコーディングについては以下の記事でも軽く触っていますが、データを印字可能な64種類のデータで表現するエンコード方式です
よくマルチバイト文字やバイナリデータをポストするのに使っているイメージがします

ただ、URLの一部として利用する場合は62 indexの+と63 indexの/,パディングの=がURLセーフではない(RFC3986とapplication/x-www-form-urlencoded)ため、
URLセーフにエンコードするべきです
パーセントエンコーディングはデカいしキモいのでなるべく避けたいっすね

Base64URL Encoding

+-に、/_に変更するのが仕様みたいです。パディングは省略されます

RFC 4648 - The Base16, Base32, and Base64 Data Encodings

このようにBase64の中でもこのようにURLセーフなものをBase64URLと区別します

Ruby

RubyではBase64.#urlsafe_encode64にて提供されますが、内部的にはRFC4648で変換した後、後から+/を置換します

https://apidock.com/ruby/Base64/urlsafe_encode64

def urlsafe_encode64(bin)
  strict_encode64(bin).tr("+/", "-_")
end

Go

Goではbase64.RawURLEncodingにて提供されます。Paddingを含むbase64.URLEncodingもあります
Rubyとは違って置換ではなくはcharsetが予めURLセーフになっている点が無駄がないですね

const encodeURL = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"

// ...

var RawURLEncoding = URLEncoding.WithPadding(NoPadding)