Base64(ベースろくじゅうし)は、バイナリデータをテキスト形式に変換するエンコード方式です。画像・ファイル・バイナリデータを、テキストしか扱えない場所で安全に送受信するために使われます。

Base64とは

コンピュータのデータはすべて0と1のバイナリです。メール・JSON・URLなどテキストベースのプロトコルは、バイナリデータをそのまま扱えないことがあります。

Base64は、あらゆるバイナリデータを A–Za–z0–9+/ の64文字と、パディング用の = だけで表現します。どんなデータでもこの文字セットに変換することで、テキスト環境で安全に扱えるようになります。

元データ: Hello
Base64:   SGVsbG8=
## 主な使い道

メール添付ファイル

MIME形式のメールでは、添付ファイルをBase64でエンコードしてテキストとして送信します。メールプロトコルが元々テキスト専用だったことが理由です。現在も内部的にBase64が使われています。

Data URI(CSSやHTMLに画像を埋め込む)

小さな画像をHTMLやCSSに直接埋め込む際に使います。HTTPリクエストを削減できます。

<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9awAAAABJRU5ErkJggg==">
.icon {
  background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz...");
}
### JWT(JSON Web Token)

認証で使われるJWTはヘッダー・ペイロード・署名の3パーツをBase64URL(URL-safe版)でエンコードして . でつないだ形式です。

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0In0.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
### APIレスポンスのバイナリデータ

JSONはバイナリを直接格納できないため、画像や証明書をAPIで返す際にBase64でエンコードする設計がよく使われます。

Basic認証

HTTPのBasic認証では、ユーザー名とパスワードを : でつないでBase64エンコードして送信します。

Authorization: Basic dXNlcjpwYXNzd29yZA==
注意: Base64は暗号化ではありません。デコードすれば元の値が取り出せます。Basic認証は必ずHTTPS通信上で使ってください。

エンコードの仕組み

Base64は3バイト(24ビット)を6ビットずつ4文字に変換します。

元データ: M  a  n
バイナリ: 01001101 01100001 01101110
6bit分割: 010011 010110 000101 101110
変換後:   T      W      F      u
結果:     TWFu
3バイトが4文字になるため、データサイズは元の約33%増になります。

Base64とBase64URLの違い

標準のBase64は +/ を使いますが、URLに含めると %2B%2F とエンコードされてしまいます。Base64URLはこれを -_ に置き換えた URL-safe なバリアントです。JWTやOAuthではBase64URLが使われます。

種類文字セット用途
Base64A–Z a–z 0–9 + /メール・ファイル
Base64URLA–Z a–z 0–9 - _JWT・URL・クッキー

Base64エンコード・デコードツールでは、テキストのBase64エンコード・デコードとファイルのData URI変換をブラウザ内で処理できます。URL-safeモードの切り替えも対応しています。