DEV Community

楊東霖
楊東霖

Posted on • Originally published at devplaybook.cc

Base64 Encoding Explained: When to Use It and When to Avoid It

Base64 Encoding Explained: When to Use It and When to Avoid It

What Base64 Actually Does

Base64 converts binary data into ASCII text. It's an encoding, not encryption.

// Encoding: binary → text
const encoded = btoa('hello');        // "aGVsbG8="
const decoded = atob('aGVsbG8=');    // "hello"

// In Node.js
Buffer.from('hello').toString('base64');  // "aGVsbG8="
Buffer.from('aGVsbG8=', 'base64').toString('utf8');  // "hello"
Enter fullscreen mode Exit fullscreen mode

Why Base64 Exists

Email was designed for 7-bit ASCII text. When email needed to send images, attachments, or non-text data, Base64 provided a way to convert binary into printable characters.

Today, the same principle applies to:

  • Embedding images directly in CSS/HTML (data:image/png;base64,...)
  • Transmitting binary over JSON APIs
  • Storing binary in environments that only support text

Real-World Example: Data URI Images

<!-- ❌ External image (extra HTTP request) -->
<img src="https://example.com/icon.png">

<!-- ✅ Inline data URI (no extra request, increases HTML size) -->
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9awAAAABJRU5ErkJggg==">
Enter fullscreen mode Exit fullscreen mode

Size Overhead

Base64 increases size by ~33%:

Original Base64 Encoded
100 bytes ~133 bytes
10 KB ~13.3 KB
100 KB ~133 KB

Rule: Only inline images smaller than 2-4 KB. Larger images should be external files.

When to Use Base64

Good use cases:

  • Embedding small icons in CSS/HTML
  • Transmitting binary API tokens over JSON
  • Storing small binary configs in text-based formats
  • Email attachment encoding (MIME)

Bad use cases:

  • Embedding large images in HTML (bloats page size)
  • Storing passwords (use bcrypt instead)
  • "Encrypting" data (it's not encryption)
  • URL encoding (use encodeURIComponent instead)

Detecting Base64

function isBase64(str) {
    try {
        return btoa(atob(str)) === str;
    } catch {
        return false;
    }
}

isBase64('aGVsbG8=');  // true
isBase64('hello');       // false (needs padding)
Enter fullscreen mode Exit fullscreen mode

Level Up Your Dev Workflow

Found this useful? Explore DevPlaybook — cheat sheets, tool comparisons, and hands-on guides for modern developers.

🛒 Get the DevToolkit Starter Kit on Gumroad — 40+ browser-based dev tools, source code + deployment guide included.

Top comments (0)