Tutorial 22 Feb 2026 10分で読めます

Base64エンコーディング解説:その仕組み、使い方、活用すべきタイミング

Base64エンコーディングの包括的ガイド:アルゴリズムの理解、データURI、メール添付ファイル、APIトークンなどの一般的なユースケース、そしてBase64が適切な選択となるタイミングを学びましょう。

Base64 Encoding Explained - Visual Guide

Base64エンコーディングとは?

Base64は、バイナリデータを印刷可能なASCII文字の列に変換するバイナリからテキストへのエンコーディング方式です。「Base64」という名前は、データを表現するために64種類の文字セットを使用することに由来します。この64文字は、大文字(A-Z)、小文字(a-z)、数字(0-9)、および2つの追加文字(通常は+/)で構成され、=がパディング文字として使用されます。

Base64は元々、テキストコンテンツのみを確実にサポートするチャネルを通じてバイナリデータを送信できるように設計されました。これを万能翻訳機と考えてください:画像であれ、文書であれ、暗号化されたデータであれ、あらゆるバイト列を受け取り、メール(SMTP)、HTML、CSS、JSON、XMLなどのテキストベースのプロトコルを通じて安全に転送できる文字列に変換します。

このエンコーディングはRFC 4648で定義されており、複数のBaseエンコーディングアルファベットを標準化しています。Webで最も一般的に使用されるのは標準Base64アルファベットですが、URLの予約文字との競合を避けるために+-に、/_に置き換えたURL安全バリアントもあります。

Base64アルゴリズムの仕組み

Base64の背後にあるアルゴリズムを理解することで、「魔法」のような変換の謎が解けます。以下がステップごとのプロセスです:

ステップ1:入力をバイナリに変換

入力データの各バイトは8ビットのバイナリ数として表現されます。例えば、ASCIIテキストManは次のように表されます:

  • M = 10進数で77 = バイナリで01001101
  • a = 10進数で97 = バイナリで01100001
  • n = 10進数で110 = バイナリで01101110

連結すると、24ビットのストリームが得られます:010011010110000101101110

ステップ2:6ビットグループに分割

通常の8ビットバイト境界の代わりに、Base64はバイナリストリームを6ビットのグループに分割します。なぜ6ビットなのか?それは26 = 64であり、これはBase64アルファベットの文字数と正確に一致するからです。24ビットのストリームは4つの6ビットグループになります:

  • 010011 = 19
  • 010110 = 22
  • 000101 = 5
  • 101110 = 46

ステップ3:Base64文字テーブルへのマッピング

各6ビット値(0-63)はBase64アルファベットの特定の文字にマッピングされます:

値の範囲文字
0-25A-Z
26-51a-z
52-610-9
62+
63/

これを値に適用すると:19 = T、22 = W、5 = F、46 = u。つまりManTWFuにエンコードされます。

ステップ4:パディングの処理

入力長が3バイトの倍数でない場合、バイナリストリームは6ビットグループに均等に分割されません。この場合、最後の6ビットグループを完成させるためにゼロビットが追加され、追加されたバイト数を示すために出力に=パディング文字が付加されます:

  • 1バイトの入力は2つのBase64文字 + ==パディングを生成
  • 2バイトの入力は3つのBase64文字 + =パディングを生成
  • 3バイトの入力は4つのBase64文字をパディングなしで生成

例えば、Ma(2バイト)のみをエンコードするとTWE=が得られ、M(1バイト)のみをエンコードするとTQ==が得られます。

Base64エンコーディングの一般的なユースケース

Base64エンコーディングは、現代のWeb開発やソフトウェアエンジニアリングの多くの分野で登場します。最も重要なものを紹介します:

1. HTMLとCSSのデータURI

データURIを使用すると、Base64エンコーディングを使用してファイルをHTMLやCSSに直接埋め込むことができます。小さな画像のために別途HTTPリクエストを行う代わりに、インラインで含めることができます:

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

これは特に小さなアイコンや装飾画像に有用で、HTTPリクエストを削減することでページ読み込みパフォーマンスが向上します。ただし、Base64はデータサイズを約33%増加させるため、この手法は2-3 KB以下のファイルに使用するのが最適です。画像からBase64へのコンバーターを使用して、任意の画像ファイルからデータURIを素早く生成できます。

2. メール添付ファイル(MIME)

Base64の元々の、そしておそらく歴史的に最も重要な用途はメールです。SMTPプロトコルは7ビットASCIIテキストの送信用に設計されたため、画像、PDF、文書などのバイナリファイルは直接送信できません。MIME(Multipurpose Internet Mail Extensions)はBase64を使用してこれらの添付ファイルをエンコードし、メールサーバーを通じて破損なく安全に送信できるようにします。

3. API認証トークン

HTTP Basic認証はユーザー名:パスワードのペアをBase64でエンコードし、Authorizationヘッダーで送信します:

Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=

これが提供するのはエンコーディングであり、暗号化ではないことを理解することが重要です。このヘッダーを傍受した人は誰でも簡単にデコードできるため、Basic認証は常にHTTPS上で使用する必要があります。

4. JSON Web Tokens(JWT)

JWTは、現代のWeb開発におけるBase64の最も一般的な使用例の1つです。JWTはドットで区切られた3つのBase64URLエンコードされた部分で構成されます:ヘッダー、ペイロード、署名。例えば:

eyJhbGciOiJIUzI1NiJ9.eyJ1c2VyIjoiam9obiJ9.xyz123...

ヘッダーとペイロードは誰でもデコードできるBase64URLエンコードされたJSONオブジェクトです。署名が完全性の検証を提供します。JWTデコーダーツールでJWTを検査・デコードしたり、JWTジェネレーターでテストトークンを生成したりできます。

5. JSONとXMLでのバイナリデータの保存

JSONとXMLはバイナリデータをネイティブにサポートしないテキストベースのフォーマットです。暗号鍵、小さな画像、証明書などのバイナリコンテンツを含める必要がある場合、Base64エンコーディングが標準的なアプローチです。多くのAPIがJSON応答内でバイナリデータをBase64エンコードされた文字列として返します。

6. URLでのデータエンコーディング

標準Base64はURLで予約された文字(+/=)を使用しますが、URL安全バリアント(Base64URL)はこれらを-_に置き換え、オプションでパディングを削除します。これはOAuthトークン、署名付きURL、ステートパラメータで広く使用されています。その他のURLエンコーディングの必要性については、URLエンコーダー/デコーダーツールをご確認ください。

Base64は暗号化ではありません

これは理解すべき最も重要なポイントの1つであり、経験豊富な開発者でさえ時々犯す間違いです:Base64エンコーディングはセキュリティメカニズムではありません。機密性はまったく提供しません。

この区別が重要な理由は以下の通りです:

  • エンコーディングは互換性のためにデータをある形式から別の形式に変換します。鍵や秘密を必要とせず、誰でも完全に元に戻すことができます。
  • 暗号化は不正アクセスを防ぐためにデータを変換します。元に戻すには鍵が必要であり、その鍵なしでは計算上解読不可能なように設計されています。

誰かがBase64文字列を渡してきた場合、即座にデコードできます。鍵もパスワードも秘密もありません。Base64エンコーダー/デコーダーで自分で試してみてください:任意のBase64文字列を貼り付けると、元のデータがすぐに表示されます。

パスワード、APIキー、機密データをBase64エンコーディングだけで保存しないでください。実際の暗号化が必要な場合は、AES-256などのアルゴリズムを使用してください。AES暗号化ツールでエンコーディングと暗号化の違いを体験できます。パスワードハッシュには、bcrypt、scrypt、Argon2などの専用アルゴリズムの使用を検討してください。

サイズオーバーヘッド:33%増加の理解

Base64エンコーディングは常にデータサイズを増加させます。理由は数学的です:入力の3バイト(24ビット)ごとに出力の4文字(32ビット)になります。つまり、エンコードされたデータは元のデータより約33%大きくなります。

サイズオーバーヘッドのクイックリファレンス:

元のサイズBase64サイズオーバーヘッド
1 KB約1.37 KB+37%
10 KB約13.3 KB+33%
100 KB約133 KB+33%
1 MB約1.33 MB+33%

このオーバーヘッドは、画像をデータURIとして埋め込む際に考慮すべき重要な点です。50 KBの画像はBase64エンコードすると約67 KBになり、そのBase64文字列はHTMLやCSSに直接インラインされるため、ドキュメント自体が大きくなり、パースが遅くなる可能性があります。

Base64を使うべきでないケース

Base64を避けるべきタイミングを知ることは、使うべきタイミングを知ることと同じくらい重要です。Base64が誤った選択となる一般的なシナリオを紹介します:

  • 大きなファイル:500 KBの画像をBase64データURIとして埋め込むと、HTMLドキュメントのサイズが約667 KB増加し、キャッシュの可能性を失い、ページレンダリングが遅くなります。大きなファイルは別のリソースとして配信してください。
  • セキュリティ:上述の通り、Base64をセキュリティ対策として使用しないでください。簡単に元に戻すことができます。
  • データベースストレージ:大きなバイナリデータをデータベースカラムにBase64として保存すると、33%多くのストレージスペースを浪費します。代わりにネイティブのBLOB/BYTEAカラムを使用してください。
  • ストリーミングデータ:Base64はエンコード前に入力全体が利用可能である必要があります(3バイトグループ化のため)。ストリーミングシナリオでは、チャンク転送エンコーディングやバイナリプロトコルがより適切です。
  • パフォーマンスクリティカルなパス:Base64のエンコードとデコードにはCPUサイクルが必要です。毎秒数百万のオペレーションを処理する高スループットシステムでは、オーバーヘッドが重大になる可能性があります。

コードによる実践例

一般的なプログラミング言語でのBase64エンコードとデコードの簡単な例を紹介します:

JavaScript(ブラウザとNode.js)

// Encoding
const encoded = btoa("Hello, World!");
console.log(encoded); // "SGVsbG8sIFdvcmxkIQ=="

// Decoding
const decoded = atob("SGVsbG8sIFdvcmxkIQ==");
console.log(decoded); // "Hello, World!"

// For Unicode strings, use TextEncoder
const encoder = new TextEncoder();
const bytes = encoder.encode("Hello");
const base64 = btoa(String.fromCharCode(...bytes));

Python

import base64

# Encoding
encoded = base64.b64encode(b"Hello, World!")
print(encoded)  # b'SGVsbG8sIFdvcmxkIQ=='

# Decoding
decoded = base64.b64decode(encoded)
print(decoded)  # b'Hello, World!'

# URL-safe variant
url_safe = base64.urlsafe_b64encode(b"Hello, World!")

PHP

// Encoding
$encoded = base64_encode("Hello, World!");
echo $encoded; // "SGVsbG8sIFdvcmxkIQ=="

// Decoding
$decoded = base64_decode($encoded);
echo $decoded; // "Hello, World!"

もちろん、Base64のエンコードやデコードが必要なたびにコードを書く必要はありません。オンラインBase64ツールがブラウザで即座に処理します。ソフトウェアのインストールは不要です。

画像からBase64への変換:メリットとデメリット

画像をBase64文字列に変換することは、このエンコーディングの最も議論される用途の1つです。両面をバランスよく見てみましょう:

メリット

  • HTTPリクエストの削減:データURIとして埋め込まれた各画像は、1回のネットワークラウンドトリップを排除します。小さなアイコンが多いページでは、読み込み時間を測定可能なほど改善できます。
  • 自己完結型ドキュメント:Base64画像を含むHTMLファイルは完全に独立しています。メールテンプレート、オフラインドキュメント、単一ファイルエクスポートに便利です。
  • CORSの問題なし:インライン画像はクロスオリジン制限を完全に回避します。
  • デプロイの簡素化:小さなグラフィックスのために別の画像ファイル、CDNパス、アセットパイプラインを管理する必要がありません。

デメリット

  • 33%のサイズ増加:エンコードされた文字列は常に元のバイナリファイルより大きくなります。
  • ブラウザキャッシュなし:インラインBase64画像は独立してキャッシュできません。ページ読み込みのたびに完全なエンコード文字列が再転送されます。
  • レンダリングのブロック:CSSのBase64画像は、ページがレンダリングされる前にスタイルシートの一部としてダウンロードおよびパースされる必要があります。
  • メンテナンスの困難さ:インラインBase64画像の更新には、エンコード文字列全体の再生成と置換が必要です。

一般的なルール:2 KB未満の画像(小さなアイコン、シンプルなSVG、1x1トラッキングピクセル)にはBase64データURIを使用してください。それより大きなものには、画像を別ファイルとして配信し、ブラウザにキャッシュさせてください。画像からBase64Base64から画像の変換ツールで試すことができます。

知っておくべきBase64のバリアント

すべてのBase64エンコーディングが同じではありません。主要なバリアントを紹介します:

  • 標準Base64(RFC 4648):A-Za-z0-9+/を使用し、=パディングを使用します。最も一般的なバリアントです。
  • Base64URL(RFC 4648 セクション5):+/の代わりにA-Za-z0-9-_を使用します。URL、ファイル名、トークンに不可欠です。JWTで使用されます。
  • MIME Base64(RFC 2045):標準と同じアルファベットですが、76文字ごとに改行を挿入します。メール添付ファイルで使用されます。
  • Base32:32文字のアルファベットを使用します。スペース効率は低いですが大文字小文字を区別せず、大文字小文字の区別が問題となるコンテキスト(TOTPシークレットキーなど)で有用です。

まとめと重要ポイント

Base64エンコーディングはすべての開発者のツールキットに欠かせない基本ツールです。覚えておくべき重要なポイントは以下の通りです:

  • Base64は64文字のアルファベットを使用してバイナリデータをテキストに変換し、入力より33%大きな出力を生成します。
  • バイナリデータを6ビットグループに分割し、各グループを印刷可能な文字にマッピングすることで機能します。
  • 一般的な用途には、データURI、メール添付ファイル、JWTトークン、API認証、JSON/XMLへのバイナリデータの埋め込みがあります。
  • Base64はエンコーディングであり、暗号化ではありません。セキュリティ対策として使用しないでください。
  • 小さなファイルやデータ転送にはBase64を使用してください。大きなファイル、セキュリティ、パフォーマンスクリティカルなパスでは避けてください。
  • URL安全バリアント(Base64URL)は、URLやトークンでの使用のために問題のある文字を置換します。
ヒント:素早いエンコードとデコード作業のために、Base64エンコーダー/デコーダーをブックマークしてください。完全にブラウザ内で動作するため、データがデバイスから外部に送信されることはありません。
セキュリティに関する注意:機密データを保護する必要がある場合は、Base64エンコーディングではなく、AES暗号化ツールなどの適切な暗号化ツールを使用してください。安全なパスワード生成には、パスワードジェネレーターをお試しください。
無料のBase64エンコーダーをお試しください

ブラウザでテキストやファイルを即座にBase64にエンコード・デコードできます。データはサーバーに送信されません。