API のレスポンスや HTTP ヘッダーに eyJhbGciOiJIUzI1NiJ9... のような文字列が現れることがあります。これは Base64 エンコードされた文字列です。
この記事では、Base64 エンコードとは何か・なぜ使われるのか・どうデコードするのかをわかりやすく解説します。
Base64 エンコードとは
Base64 は、バイナリデータを 64 種類の ASCII 文字(英数字と + / =)だけで表現するエンコード方式です。
使用する 64 文字は次のとおりです。
- 大文字アルファベット:
A〜Z(26文字) - 小文字アルファベット:
a〜z(26文字) - 数字:
0〜9(10文字) - 記号:
+と/(2文字) - パディング:
=(長さ調整用)
これらは人間が読みやすく、HTTP ヘッダーや JSON・XML・メールなどのテキストベースのフォーマットに安全に埋め込める文字です。
なぜ Base64 が必要なのか
コンピュータが扱うデータは本来すべて 0 と 1 のバイナリ(2進数)です。テキストファイルはそのまま転送できますが、画像・音声・バイナリファイルはテキストのみを想定したシステムでは正しく転送できないことがあります。
代表的な問題は以下のとおりです。
- メールの SMTP プロトコルは元々 7 ビット ASCII のみを想定していた
- HTTP ヘッダーには特定のバイト値(改行など)を含められない
- JSON・XML はテキスト形式のため、バイナリをそのまま埋め込めない
Base64 を使うことで、あらゆるバイナリデータをテキストに変換し、これらの制約を回避できます。
仕組み:どうやって変換するか
Base64 の変換は以下の手順で行われます。
- 元のデータを 8 ビット単位に分割する
- 3バイト(24ビット)を 1 グループとしてまとめる
- 24 ビットを 6 ビットずつ 4 つに分割する
- 各 6 ビットの値(0〜63)を Base64 文字テーブルに従って変換する
- データが 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 エンコード・デコード
| 言語 | エンコード | デコード |
|---|---|---|
| JavaScript | btoa(str) | atob(str) |
| Python | base64.b64encode(b) | base64.b64decode(s) |
| Go | base64.StdEncoding.EncodeToString(b) | base64.StdEncoding.DecodeString(s) |
| PHP | base64_encode($str) | base64_decode($str) |
| Ruby | Base64.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 は バイナリデータを 64 種類の ASCII 文字で表現するエンコード方式
- テキストのみを扱うシステム(HTTP ヘッダー・メール・JSON など)にバイナリを埋め込むために使う
- JWT のペイロード・Basic 認証・Data URI・メール添付など、Web 開発で頻繁に登場する
- URL で使う場合は
+→-、/→_に置き換えた Base64URL を使う - 暗号化ではない。誰でもデコードできるため、秘密情報の隠蔽には使えない