Data URLの使い所と落とし穴
Base64の出力先として一番よく使われる Data URL(data:スキーム)について、本来効くシーンと、よくある落とし穴を実用ベースで整理しました。
Data URLの仕様(RFC 2397)
Data URLは1998年制定のRFC 2397「The 'data' URL scheme」で定義された仕組みで、書式はdata:[<mediatype>][;base64],<data>
です。<mediatype> はMIMEタイプ(例:image/png)、;base64 は中身がBase64でエンコードされていることを示すフラグ、<data> が実データです。;base64 を省略するとパーセントエンコーディングのURL文字列として解釈されます。
本当に効く5シーン
- 1〜2KBの装飾アイコン:HTTPリクエスト1回のオーバーヘッドより小さい。
- HTMLメールのインライン画像:外部URLは「画像の表示」クリック必須でブロックされる。
- 動的生成した画像をすぐ表示:Canvas.toDataURL()でその場でプレビュー。
- JSON APIで画像を1フィールドに収める:multipart/form-dataが使えない環境向け。
- Service Worker未対応環境でのオフライン表示:CSSにアイコンを焼き込む。
落とし穴1:HTTPキャッシュが効かない
通常のhttps URL参照の画像はCache-Controlヘッダで長期キャッシュでき、2回目以降は通信ゼロで表示されます。Data URLは「URLそのものが画像」なので、HTTPキャッシュの対象になりません。同じ画像を100ページで使うと100回分の転送量が発生します(CSSに埋め込めばCSSのキャッシュには乗りますが、画像専用キャッシュより効率は落ちます)。
落とし穴2:+33%サイズ膨張
RFC 4648のBase64は3バイト→4文字に変換するため、出力は元バイナリの4/3倍。1MBの写真は1.33MBのBase64になります。改行ありなら数バイト上乗せ。「Base64にすれば軽くなる」は誤解で、必ず大きくなります。
落とし穴3:Content Security Policy(CSP)でブロック
CSPヘッダでimg-src 'self'だけを許可していると、Data URLは「セルフホスト由来ではない」と判定されてブロックされます。
/* NG: Data URLが弾かれる */ Content-Security-Policy: img-src 'self'; /* OK: data:を明示的に許可 */ Content-Security-Policy: img-src 'self' data:;
ローカル開発では映っていたのに本番のCSPで弾かれる、というのが典型的な事故パターン。本番投入前に本番と同じCSP設定で確認する習慣を。
落とし穴4:SVGはBase64より「非Base64」が短い
SVGはテキスト形式なので、Base64化するとサイズが+33%増えるだけで何の得もありません。RFC 2397は ;base64 省略時のパーセントエンコード形式も認めているので、SVGはエスケープしてそのまま埋め込む方が短くなります。
/* Base64版(長い) */ data:image/svg+xml;base64,PHN2ZyB4bWxucz0i... /* 非Base64版(短い・推奨) */ data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg'...
ただし、#は%23に、"は%22にエスケープが必要。URLエンコードを使うと自動でやってくれます。
落とし穴5:ブラウザのURL長制限
現行のChrome/Firefox/Safari/Edgeは数MB〜数十MBのData URLを処理できますが、HTML属性内で書く場合、HTMLパーサの行長制限やソースマップでの取り回しの面から、数百KB以下に収めるのが現実的です。大きい画像はBase64ではなく通常のhttps URL参照に戻す方が、HTTPキャッシュも効いて高速です。
用途別の判断フロー
- 1KB以下のアイコン → Data URL(Base64またはSVG非Base64)
- 1〜30KBのロゴ・装飾 → Data URLでもOK(ただしCSP確認)
- 30〜100KBの画像 → 通常URL参照の方が無難
- 100KB以上の写真 → 必ず通常URL参照(CDN経由推奨)
本ツールの使い方
- 画像圧縮で対象画像を最小化(Base64化で+33%膨張前提)。
- 画像⇔Base64変換で「Data URI付き」を選択。
- 「コピー」を押してクリップボードへ。
- HTML/CSS/JSONに1行で貼り付け。
関連ツール
- 画像⇔Base64変換(本体)
- 画像圧縮
- URLエンコード(SVG非Base64記法に必要)
- JSON整形(APIレスポンスのBase64確認)