Base64とは?Encodingをわかりやすく解説
Base64はwebで最も広く使われるencoding方式のひとつです。URL、email、CSS fileなどで長い英数字のstringを見たことがあるなら、それはBase64かもしれません。仕組みと重要性を解説します。
目次
Base64とは?
Base64は、binary dataを64個の印字可能なASCII charactersで表すbinary-to-text encoding方式です。画像、files、raw bytesを、text-based systemsで安全に運べるtext stringへ変換します。
名前はBase64が64 charactersを使うことに由来します。2^6 = 64なので、各characterは正確に6 bitsの情報を表します。
Base64はRFC 4648で定義されており、email、data URIs、APIs、JWT tokens、certificatesなど、多くのweb formatsで使われています。
なぜBase64が必要なのか?
多くのsystemsは、raw binary dataではなくtextだけを扱う前提で設計されていました。たとえば次のようなものです。
- Email (SMTP) - もともと7-bit ASCII textを想定していたため、binary attachmentsにはencodingが必要です。
- JSON - native binary typeがないため、bytesは通常stringsとして保存されます。
- URLs - 安全に使えるcharacter setが限られています。
- HTML/CSS - text formatsなので、埋め込みassetsにはtext表現が必要です。
Base64はbinary dataを安全なtext表現へ変換し、こうしたsystemsで壊れずに運べるようにします。
Base64 Encodingの仕組み
encoding processは次の4 stepsです。
- inputをbytesのstreamとして読みます。各byteは8 bitsです。
- bitsを6 bitsずつのchunksに分けます。
- 各6-bit groupをBase64 alphabetのcharacterにmapします。
- input lengthが3で割り切れない場合、
=でpaddingします。
重要な考え方は、input 3 bytesがBase64 characters 4つになることです。そのためBase64はsizeを約33%増やします。
Base64 Alphabet
standard Base64 alphabetは64 charactersで構成されます。
| Range | Characters | Values |
|---|---|---|
| Uppercase | A-Z | 0-25 |
| Lowercase | a-z | 26-51 |
| Digits | 0-9 | 52-61 |
| Special | + and / | 62-63 |
| Padding | = | alignmentに使用 |
さらにURL-safe variantもあり、+を-に、/を_に置き換えます。
Step-by-Step Encoding Example
string Hi! をBase64へencodeしてみましょう。
Step 1: Convert to ASCII values
H = 72, i = 105, ! = 33
Step 2: Convert to binary (8 bits each)
01001000 01101001 00100001
Step 3: Regroup into 6-bit chunks
010010 000110 100100 100001
Step 4: Convert to decimal
18 6 36 33
Step 5: Map to Base64 alphabet
S G k h
Result: "Hi!" -> "SGkh"Hi!はちょうど3 bytesなので、paddingなしで4つのBase64 charactersにきれいにmapされます。
Padding (=) を理解する
Base64は3 bytesを4 charactersにするgroupで動作します。inputが3で割り切れない場合はpaddingを追加します。
| Input bytes | Remainder | Padding | Example |
|---|---|---|---|
| 3で割り切れる | 0 | なし | "Hi!" -> "SGkh" |
| 1 byte残る | 1 | == | "H" -> "SA==" |
| 2 bytes残る | 2 | = | "Hi" -> "SGk=" |
= paddingにより、encoded outputは4 charactersの倍数になり、decodingが予測しやすくなります。
Base64の一般的な用途
Base64はmodern software developmentのあちこちで使われています。
- Data URIs - 小さな画像をHTMLやCSSへ直接埋め込みます。
- Email attachments (MIME) - binary filesをemailに添付する前にencodeします。
- JWT tokens - headerとpayloadにBase64URL encodingを使います。
- API authentication - HTTP Basic authはcredentialsをBase64 textとして送信します。
- JSON/XML内のbinary保存 - certificates、keys、binary blobsをtextとして表現できます。
- Source maps - JavaScript source mapsはBase64-style VLQ mappingsを使います。
CodeでのBase64
多くのlanguagesにはBase64 supportが組み込まれています。いくつか例を見てみましょう。
JavaScript
// Encode
const encoded = btoa("Hello, World!");
console.log(encoded); // "SGVsbG8sIFdvcmxkIQ=="
// Decode
const decoded = atob("SGVsbG8sIFdvcmxkIQ==");
console.log(decoded); // "Hello, World!"Python
import base64
# Encode
encoded = base64.b64encode(b"Hello, World!")
print(encoded) # b'SGVsbG8sIFdvcmxkIQ=='
# Decode
decoded = base64.b64decode(encoded)
print(decoded) # b'Hello, World!'Command Line
# Encode (Linux/macOS)
echo -n "Hello, World!" | base64
# SGVsbG8sIFdvcmxkIQ==
# Decode
echo "SGVsbG8sIFdvcmxkIQ==" | base64 --decode
# Hello, World!よくある誤解
Base64について、よく誤解される点があります。
✕ "Base64はencryption"
Base64はencryptionではありません。誰でもすぐdecodeできるため、sensitive dataを隠す目的で使ってはいけません。
✕ "Base64はdataをcompressする"
Base64は実際にはdata sizeを約33%増やします。これはencodingであり、compressionではありません。
✕ "Base64はimages専用"
image data URIsは一般的ですが、Base64はfiles、certificates、tokensなど、あらゆるbinary dataを表現できます。
Base64を使うべきでない場面
Base64は便利ですが、常に正しい選択とは限りません。
- Large files - 33%のsize increaseはすぐ大きな負担になります。
- Security - sensitive dataにはBase64ではなく本物のencryptionを使いましょう。
- Performance-critical paths - encodingとdecodingにはCPU costがあります。
- Web pages内のlarge images - separate image filesの方が、browserが個別にcacheできるため通常は適しています。
目安としては、text-only channelを通してbinary dataを送る必要がある場合にBase64を使います。binary transportが使えるなら、そちらを優先しましょう。
Base64をすぐにEncode & Decode
無料のBase64 Encoder/Decoder toolで、textをBase64へencodeしたり、Base64 stringsをbrowser内ですぐdecodeできます。
Base64 Encoder/Decoderを試す参考資料
- Josefsson, S. (2006). The Base16, Base32, and Base64 Data Encodings. RFC 4648, IETF. https://datatracker.ietf.org/doc/html/rfc4648
- Freed, N. & Borenstein, N. (1996). Multipurpose Internet Mail Extensions (MIME) Part One: Format of Internet Message Bodies. RFC 2045, IETF. https://datatracker.ietf.org/doc/html/rfc2045
- Mozilla Developer Network. btoa() global function. https://developer.mozilla.org/en-US/docs/Web/API/btoa
- Mozilla Developer Network. Data URLs. https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/Data_URLs
- Python Software Foundation. base64 - Base16, Base32, Base64, Base85 Data Encodings. https://docs.python.org/3/library/base64.html