Base64 인코딩이란? 개발자를 위한 시각적 가이드
Source: Dev.to
Base64란?
Base64는 바이너리를 텍스트로 변환하는 인코딩 방식입니다. 이미지, 파일, 텍스트 등 모든 바이너리 데이터를 받아서 64개의 “안전한” ASCII 문자만을 사용해 표현합니다:
A‑Z (26) + a‑z (26) + 0‑9 (10) + '+' + '/' = 64 characters
패딩을 위해 = 를 사용합니다.
그게 전부입니다. 전체 알파벳은 텍스트만 안전하게 처리하는 시스템—이메일, URL, JSON, XML, HTML—을 통해 전송될 수 있도록 설계되었습니다.
Base64가 존재하는 이유는?
초기 인터넷 시절에는 많은 시스템이 7‑bit ASCII 텍스트만 처리할 수 있었습니다. 바이너리 데이터(이미지, 실행 파일, 비영어 문자)는 일반 텍스트용으로 설계된 이메일 서버, 게이트웨이 및 프로토콜을 통해 전송될 때 손상되었습니다.
트레이드‑오프? 인코딩된 출력은 원본 데이터보다 약 33 % 더 커집니다.
수학: 입력 3바이트마다 4개의 Base64 문자
3 × 8 = 24 bits → 4 × 6 = 24 bits
Source: …
Base64 인코딩 작동 방식 (단계별)
문자열 "Hi" 를 Base64 로 인코딩해 보겠습니다.
Step 1: 바이너리로 변환
H = 72 → 01001000
i = 105 → 01101001
Step 2: 모든 비트를 이어 붙이기
01001000 01101001
Step 3: 6비트 그룹으로 나누기
010010 | 000110 | 1001XX
(마지막 그룹을 6비트로 맞추기 위해 0으로 채웁니다: 100100)
Step 4: 각 6비트 그룹을 Base64 알파벳에 매핑
010010 = 18 → S
000110 = 6 → G
100100 = 36 → k
Step 5: 패딩 추가
입력이 2바이트(3으로 나누어 떨어지지 않음)였으므로 = 패딩을 하나 추가합니다.
결과: SGk=
직접 확인해 보세요 →
Source: …
Base64를 실제로 볼 수 있는 경우
-
Data URIs – 별도의 HTTP 요청 없이 작은 이미지를 HTML/CSS에 직접 삽입합니다.
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA..."> -
JWT 토큰 – 점(.)으로 구분된 세 개의 Base64url‑인코딩된 JSON 객체.
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIn0.dozjgNryP4J3jVmNHl0w5N_XgL0n3I9PlFUP0THsR8U -
이메일 첨부 파일 (MIME) – 모든 첨부 파일은 텍스트 기반 이메일에 바이너리 파일을 포함하기 위해 Base64‑인코딩됩니다.
-
API 응답 – 바이너리 데이터(예: PDF, 이미지, 인증서)가 JSON 내에서 Base64 문자열로 반환되는 경우가 많습니다.
{ "file": "UGFzc3dvcmQxMjM=", "encoding": "base64" } -
Basic HTTP 인증 –
username:password를 인코딩합니다.Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=
Base64는 암호화가 아닙니다
가장 흔한 오해는 Base64가 보안을 제공한다는 것입니다. 이것은 인코딩이며, 암호화가 아닙니다.
| 인코딩 | 암호화 |
|---|---|
| 데이터를 다른 형식으로 변환 (누구든지 되돌릴 수 있음) | 키를 사용해 데이터를 보호 (키가 있어야만 되돌릴 수 있음) |
Base64는 전혀 보안을 제공하지 않습니다. 누구든지 즉시 디코드할 수 있습니다. 민감한 데이터를 “숨기기” 위해 절대 사용하지 마세요.
# "Hiding" a password in Base64
echo -n 'MySecretPassword' | base64
# TXlTZWNyZXRQYXNzd29yZA==
# "Unhiding" it
echo 'TXlTZWNyZXRQYXNzd29yZA==' | base64 -d
# MySecretPassword
Base64 vs. Base64url
표준 Base64는 +와 /를 사용하지만, 이는 URL에서 문제가 될 수 있습니다. Base64url는 이를 대체합니다:
| 표준 | URL‑안전 |
|---|---|
+ | - |
/ | _ |
= (패딩) | 종종 생략됨 |
JWT 토큰은 Base64url을 사용하며, 인코딩된 데이터를 쿼리 매개변수에 넣는 많은 API도 마찬가지입니다.
일반적인 Base64 작업
JavaScript (Browser)
// Encode
const encoded = btoa('Hello, World!'); // SGVsbG8sIFdvcmxkIQ==
// Decode
const decoded = atob('SGVsbG8sIFdvcmxkIQ=='); // Hello, World!
⚠️
btoa()와atob()는 ASCII만 처리합니다. 유니코드의 경우:
// Encode Unicode
const encoded = btoa(unescape(encodeURIComponent('Hello 🌍')));
// Decode Unicode
const decoded = decodeURIComponent(escape(atob(encoded)));
Node.js
// Encode
const encoded = Buffer.from('Hello').toString('base64');
// Decode
const decoded = Buffer.from('SGVsbG8=', 'base64').toString('utf8');
Python
import base64
# Encode
b64 = base64.b64encode(b'Hello').decode()
# 'SGVsbG8='
# Decode
txt = base64.b64decode('SGVsbG8=').decode()
# 'Hello'
Command Line
# Encode a string
echo -n 'Hello' | base64
# Decode a string
echo 'SGVsbG8=' | base64 -d
# Encode a file
base64 image.png > image.b64
# Decode a file
base64 -d image.b64 > image.png
Base64를 언제 사용해야 할까
✅ 사용해야 할 경우:
- 텍스트 기반 포맷(JSON, XML, HTML)에 바이너리 데이터를 삽입할 때
- 텍스트 전용 프로토콜을 통해 파일을 전송할 때
- 작은 이미지(< 10 KB)의 데이터 URI를 만들 때
- Base64 입력을 기대하는 API와 작업할 때
❌ 사용하면 안 되는 경우:
- 보안을 제공한다고 생각할 때(실제는 그렇지 않음)
- 파일이 클 때(33 % 크기 증가가 누적됨)
- 원시 바이너리 데이터를 직접 보낼 수 있을 때(예: multipart/form‑data 사용)
- 데이터를 압축하려고 할 때(오히려 커짐)
직접 해보기
무료 Base64 인코더/디코더를 base64decode.co 에서 만들었습니다 — 텍스트를 붙여넣거나 파일을 업로드하면 즉시 결과를 얻을 수 있습니다. 회원가입 필요 없고, 추적도 없으며, 전적으로 브라우저에서 실행됩니다.
일상적인 개발 작업을 위해 만든 11개의 무료 개발자 도구 모음의 일부입니다.
Base64를 가장 많이 사용하는 경우는 무엇인가요? 댓글에 남겨 주세요 — JWT, 데이터 URI, 혹은 제가 생각하지 못한 다른 용도인지 궁금합니다.