API のレスポンスや HTTP ヘッダーに eyJhbGciOiJIUzI1NiJ9... のような文字列が現れることがあります。これは Base64 エンコードされた文字列です。

この記事では、Base64 エンコードとは何か・なぜ使われるのか・どうデコードするのかをわかりやすく解説します。

Base64 エンコードとは

Base64 は、バイナリデータを 64 種類の ASCII 文字(英数字と + / =)だけで表現するエンコード方式です。

使用する 64 文字は次のとおりです。

これらは人間が読みやすく、HTTP ヘッダーや JSON・XML・メールなどのテキストベースのフォーマットに安全に埋め込める文字です。

なぜ Base64 が必要なのか

コンピュータが扱うデータは本来すべて 0 と 1 のバイナリ(2進数)です。テキストファイルはそのまま転送できますが、画像・音声・バイナリファイルはテキストのみを想定したシステムでは正しく転送できないことがあります。

代表的な問題は以下のとおりです。

Base64 を使うことで、あらゆるバイナリデータをテキストに変換し、これらの制約を回避できます。

仕組み:どうやって変換するか

Base64 の変換は以下の手順で行われます。

  1. 元のデータを 8 ビット単位に分割する
  2. 3バイト(24ビット)を 1 グループとしてまとめる
  3. 24 ビットを 6 ビットずつ 4 つに分割する
  4. 各 6 ビットの値(0〜63)を Base64 文字テーブルに従って変換する
  5. データが 3 の倍数でない場合は = でパディングする

この変換により、データ量は約 33% 増加します(3バイト → 4文字)。

具体例

元のテキスト: "Hi"
バイナリ:     01001000 01101001
6ビット分割:  010010 000110 1001xx  (不足分を0で埋める)
Base64文字:   S      G      k      = (パディング)
結果: "SGk="

主な使いどころ

JWT(JSON Web Token)

JWT は ヘッダー.ペイロード.署名 の3パーツをドットで連結した文字列です。各パーツは Base64URL エンコード(後述)されています。

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJ1c2VyLTEyMyIsImV4cCI6MTcwMDAwMDAwMH0.xxx

この文字列のペイロード部分(2番目のパーツ)を Base64 デコードすると、JSON 形式のクレーム(ユーザー情報や有効期限など)が確認できます。

デコード結果:
{
  "sub": "user-123",
  "exp": 1700000000
}

HTTP Basic 認証

Basic 認証では、ユーザー名とパスワードを username:password の形式で連結し、Base64 エンコードしたものを Authorization ヘッダーに付けて送ります。

// "admin:password123" を Base64 エンコード
Authorization: Basic YWRtaW46cGFzc3dvcmQxMjM=

ヘッダーを見かけたらデコードすれば元の認証情報が確認できます(重要: HTTPS でなければ盗聴リスクあり)。

Data URI(画像の埋め込み)

画像ファイルを Base64 エンコードして HTML や CSS に直接埋め込むことができます。

<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA...">

外部ファイルへの HTTP リクエストが不要になるため、アイコンやロゴなどの小さい画像をインライン化する際に使われます。

メールの添付ファイル(MIME)

電子メールで PDF や画像を添付するとき、MIME 形式で Base64 エンコードされたデータがメール本文に埋め込まれています。メールクライアントが自動的にデコードして表示します。

Base64URL との違い

通常の Base64 では +/ が使われますが、これらは URL の中で特別な意味を持つ文字です。そのため、URL やファイル名で安全に使うために Base64URL という変形版があります。

種別62文字目63文字目パディング用途
標準 Base64+/= ありメール・HTTP ボディなど
Base64URL-_= なしJWT・URL パラメータなど

よくある誤解:Base64 は暗号化ではない

Base64 は「エンコード」であり、「暗号化」ではありません。誰でも簡単にデコードできます。

Basic 認証のパスワードが Base64 エンコードされていても、それは「隠されている」わけではなく、誰でもすぐにデコードできます。必ず HTTPS と組み合わせて使うことが必要です。

各言語での Base64 エンコード・デコード

言語エンコードデコード
JavaScriptbtoa(str)atob(str)
Pythonbase64.b64encode(b)base64.b64decode(s)
Gobase64.StdEncoding.EncodeToString(b)base64.StdEncoding.DecodeString(s)
PHPbase64_encode($str)base64_decode($str)
RubyBase64.encode64(str)Base64.decode64(str)

JavaScript の btoa() は ASCII 文字列のみ対応しているため、日本語などのマルチバイト文字を含む場合は UTF-8 に変換してからエンコードする必要があります。

// 日本語を Base64 エンコードする(JavaScript)
function encodeUTF8Base64(str) {
  const bytes = new TextEncoder().encode(str);
  let binary = '';
  bytes.forEach(b => binary += String.fromCharCode(b));
  return btoa(binary);
}

encodeUTF8Base64("こんにちは");
// → "44GT44KT44Gr44Gh44Gv"
Base64 エンコード / デコードツール 日本語(UTF-8)対応。ブラウザ完結で入力データは外部に送信しません。
ツールを使う →

まとめ

関連記事