Introduction
Base64 converts binary data (images, files) into plain text using only letters, numbers, and two symbols (+ and /). You’ve probably seen strings like aGVsbG8gd29ybGQ= in source code or network requests.
Why does it matter? Many systems and protocols were designed for text-only transmission. Base64 lets you embed binary data in these text-based systems, but it comes with tradeoffs you need to understand.
How It Works
Base64 encoding converts binary data into text by mapping every 3 bytes (24 bits) into 4 ASCII characters. Each character represents 6 bits of data.
The encoding uses 64 characters: A-Z, a-z, 0-9, +, /
Here’s what happens:
1. Take 3 bytes of binary data (24 bits)
2. Split into 4 groups of 6 bits each
3. Map each 6-bit group to a Base64 character
4. Add = padding if the input isn’t divisible by 3
Example: “hello” in Base64
h e l l o
01101000 01100101 01101100 01101100 01101111 (binary)
011010 000110 010101 101100 011011 000110 1111 (6-bit groups)
a G V s b G 8 = (Base64)
→ aGVsbG8=
This is why Base64 increases size by 33%. You’re using 4 characters to represent 3 bytes of data.
The tradeoff: 100KB of binary becomes 133KB as Base64. That’s 33KB of overhead for text compatibility.
Best Practices
1. Embed Small Resources Inline
Why: Reduces HTTP requests for tiny assets like icons and favicons.
How to implement:
<!-- Good: Small icon (< 1KB) -->
<img src="data:image/png;base64,iVBORw0KGgoAAAANS..." alt="Icon" />
<!-- Bad: Large image (> 10KB) -->
<img src="data:image/jpeg;base64,/9j/4AAQSkZJRg..." alt="Photo" />
Rule of thumb: Only embed resources under 1KB. Larger files hurt page load times and aren’t cacheable.
2. Use for Binary Data in JSON APIs
Why: JSON only supports text. Base64 lets you include binary data without breaking the format.
How to implement:
// API response with file data
{
"filename": "document.pdf",
"content": "JVBERi0xLjQKJeLjz9MK...",
"encoding": "base64"
}
Key point: Always include an encoding field so consumers know to decode it.
3. Encode Credentials in HTTP Headers
Why: HTTP Basic Auth requires Base64-encoded credentials.
How to implement:
// JavaScript example
const credentials = btoa('username:password');
fetch('/api', {
headers: {
'Authorization': `Basic ${credentials}`
}
});
Critical: Base64 isn’t encryption. Always use HTTPS or credentials are sent in plain text.
4. Store Binary Data in Text-Only Databases
Why: Some legacy systems or NoSQL databases don’t handle binary types well.
When to use: SQLite TEXT fields, Redis strings, configuration files.
Better alternative: If your database supports BLOB/BYTEA types, use those instead.
Common Pitfalls
Using Base64 for Security
The problem:
// This is NOT secure
const token = btoa('secret_api_key_12345');
Why it’s bad: Base64 is encoding, not encryption. Anyone can decode it instantly with atob() or any online decoder.
The fix: Use real encryption (AES, RSA) for sensitive data. Use Base64 only for transport encoding.
Encoding Large Files
The problem:
// Bad: 10MB image
const largeImage = base64Encode(tenMegabyteBuffer);
// Result: 13.3MB string that can't be cached
Why it’s bad:
- Data grows by 33% (10MB becomes 13.3MB)
- Can’t be cached by browsers
- Slows page load times
- Increases memory usage
The fix: Use direct file uploads with multipart/form-data or store files on a CDN with URLs.
Double-Encoding Data
The problem:
// Accidentally encoding twice
const once = btoa('hello'); // "aGVsbG8="
const twice = btoa(once); // "YUdWc2JHOD0="
Why it’s bad: Recipients decode once and get gibberish. Hard to debug.
The fix: Check if data is already encoded before encoding again. Add metadata flags.
Quick Reference Checklist
Use Base64 when:
- Embedding small images/icons (< 1KB) in HTML/CSS
- Sending binary data in JSON APIs
- Storing binary in text-only systems (legacy databases, config files)
- HTTP Basic Authentication headers
- Email attachments (MIME)
Don’t use Base64 for:
- Encryption or security (use AES, RSA, or bcrypt instead)
- Large files (> 10KB) - use file uploads or CDN URLs
- Data that needs to be cached by browsers
- When binary storage is available (use BLOB/BYTEA)
Summary
Base64 converts binary to text at the cost of 33% size increase. Essential for embedding binary in text-only systems. Don’t use it for security or large files.
Key points:
- Base64 is encoding, not encryption. Anyone can reverse it.
- Only embed resources under 1KB inline
- Always use HTTPS when transmitting Base64-encoded credentials
- Prefer binary storage (BLOB) over Base64 in databases when possible