Base64 완벽 가이드 — 인코딩 원리, 사용처, 크기 증가와 보안 오해 정리

"Base64는 암호화인가요?"
아닙니다. Base64는 인코딩(encoding)이지 암호화가 아닙니다. 이 오해 하나 때문에 보안사고가 종종 발생합니다. Base64는 이진 데이터를 텍스트로 표현하는 방식으로, 이메일·JSON·URL·JWT에서 바이너리를 안전하게 전송하기 위해 사용됩니다. 이번 글에서는 Base64의 원리와 실무 활용, 흔한 오해를 정리합니다.
Base64가 필요한 이유
이메일·JSON·URL 등은 텍스트 기반 프로토콜입니다. 이미지·PDF 같은 이진 파일을 그대로 넣으면 깨지거나 잘립니다. Base64는 6비트 단위로 끊어 64개 ASCII 문자로 매핑해 이진 데이터를 텍스트로 변환합니다.
- 사용 문자: A~Z(26) + a~z(26) + 0~9(10) + + + / = 64개
- 패딩: 끝에 = 기호로 길이 맞춤 (4의 배수)
- URL 안전 변형: + → -, / → _ (Base64URL)
인코딩 원리 — 예제
원문: "Man" 1. ASCII: M=77, a=97, n=110 2. 2진수 (8비트×3=24비트): 01001101 01100001 01101110 3. 6비트씩 자르기: 010011 010110 000101 101110 4. 10진수: 19, 22, 5, 46 5. Base64 테이블 매핑: 19=T, 22=W, 5=F, 46=u 6. 결과: "TWFu"
크기 33% 증가 — 왜?
3바이트(24비트)를 4글자로 표현하기 때문. 따라서 크기가 4/3 ≈ 1.33배로 증가합니다. 100KB 이미지는 Base64로 약 133KB가 됩니다.
| 원본 크기 | Base64 크기 | 증가율 |
|---|---|---|
| 1 KB | 1.37 KB | +37% |
| 100 KB | 133 KB | +33% |
| 1 MB | 1.33 MB | +33% |
| 10 MB | 13.3 MB | +33% |
Base64 실무 활용 6가지
① Data URL (이미지를 HTML에 직접 포함)
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUg...">
아이콘·썸네일 등 작은 이미지를 HTTP 요청 없이 표시. 단, 큰 이미지는 캐시 불가로 비추.
② JSON에 이진 데이터 포함
{ "profileImage": "iVBORw0KGgo...", "signature": "MEUCIQCc..." }
③ JWT 토큰 (3부분 모두 Base64URL)
Header.Payload.Signature 각각 Base64URL 인코딩. eyJhbGci...으로 시작하는 건 JSON의 {"alg":"... 헤더가 인코딩된 것.
④ 이메일 첨부파일 (MIME)
SMTP는 7비트 ASCII만 전송. 첨부파일은 Base64로 변환 후 전송. 받는 쪽이 디코딩.
⑤ CSS background-image
.icon { background: url(data:image/svg+xml;base64,PHN2Zy...) }
⑥ Basic Authentication
// user:pass → dXNlcjpwYXNz Authorization: Basic dXNlcjpwYXNz
Base64 vs 암호화 — 절대 헷갈리지 말 것
중요 — Base64는 누구나 디코딩 가능합니다. 비밀번호·신용카드·개인정보를 Base64만으로 "숨기지" 마세요. 실제 보안이 필요하면 AES·RSA 등 암호화를 사용해야 합니다.
Base64 vs Base64URL — 차이점
| 항목 | Base64 | Base64URL |
|---|---|---|
| 62번 문자 | + | - |
| 63번 문자 | / | _ |
| 패딩(=) | 필수 | 생략 가능 |
| 용도 | 이메일·일반 | URL·JWT |
언어별 사용법
// JavaScript
btoa("Hello") // "SGVsbG8="
atob("SGVsbG8=") // "Hello"
# Python
import base64
base64.b64encode(b"Hello") # b'SGVsbG8='
base64.b64decode("SGVsbG8=") # b'Hello'
// Node.js
Buffer.from("Hello").toString("base64") // "SGVsbG8="
Buffer.from("SGVsbG8=", "base64").toString() // "Hello"
# Shell
echo -n "Hello" | base64 # SGVsbG8=
echo "SGVsbG8=" | base64 -d # Hello
언제 Base64를 쓰지 말아야 하나?
- 대용량 파일(1MB+) — 33% 증가로 네트워크·메모리 낭비. 바이너리 업로드 + URL 참조 방식이 나음
- 이미지 CDN 캐시 목적 — Data URL은 브라우저가 파일로 캐시 못함
- DB 저장 — BLOB 또는 파일 경로가 효율적
- 보안 목적 — Base64는 암호화 아님
Base64 인코더·디코더 무료
참고
• RFC 4648 — The Base16, Base32, and Base64 Data Encodings.
• MDN: Base64 encoding and decoding.
• IETF RFC 7515 — JSON Web Signature (JWS).