Base64 인코더/디코더
텍스트나 파일을 Base64로 인코딩하거나 디코딩합니다. UTF-8 한글도 완벽 지원합니다.
Base64 인코딩 · 디코딩 — RFC 4648 완전 해부
Base64는 임의의 바이너리 옥텟 시퀀스를 64개의 인쇄 가능한 ASCII 문자(A-Z, a-z,0-9, +, /)와 패딩 문자 =로 표현하는 인코딩 방식입니다.RFC 4648(2006, S. Josefsson)이 표준 알파벳과 변형(Base16, Base32 포함)을 정의하며, 이전의 RFC 2045 §6.8(MIME), RFC 3548을 폐기했습니다. 핵심 원리는 단순합니다. 입력 3바이트(24비트)를 6비트씩 4조각으로 나눠 각 조각을 알파벳 테이블의 인덱스로 매핑합니다. 따라서 출력은 항상 입력의 ⌈n/3⌉ × 4바이트, 즉 약 33.3% 크기 증가를 수반합니다. 이 도구는 브라우저의 btoa()/atob()를 래핑하되, 한글 등 비-Latin1 문자를 UTF-8로 선변환하여 InvalidCharacterError 없이 안전하게 처리합니다.
알파벳 테이블 — 표준 vs URL-safe
RFC 4648은 두 가지 알파벳을 정의합니다.
| 구분 | 62번 문자 | 63번 문자 | 패딩 | 사용처 |
|---|---|---|---|---|
| 표준 (§4) | + | / | = | MIME, PEM, SAML, S/MIME |
| URL-safe (§5) | - | _ | 생략 가능 | JWT, URL 쿼리, 파일명 |
URL-safe 변형이 필요한 이유는 명확합니다. 표준 Base64의 +는 application/x-www-form-urlencoded에서 공백으로 해석되고, /는 경로 구분자로 취급됩니다. JWT(RFC 7519)의 header·payload는 이 때문에 Base64URL로 인코딩하며, 패딩 =도 제거합니다.
변환 예시 — 바이트 단위로 따라가기
입력 문자열 UTF-8 바이트(hex) Base64 출력 ────────────────────────────────────────────────────── "Hello" 48 65 6C 6C 6F SGVsbG8= "AB" 41 42 QUI= "A" 41 QQ== "한" ED 95 9C 7ZWc "한글" ED 95 9C EA B8 80 7ZWc6riA "" (empty) (empty) 패딩 규칙: 입력 mod 3 = 0 → 패딩 없음 입력 mod 3 = 1 → == (2개) 입력 mod 3 = 2 → = (1개)
실전 시나리오 5가지
- Data URI —
<img src="data:image/png;base64,iVBOR...">로 작은 아이콘을 HTML에 인라인. HTTP 왕복을 제거하지만 캐싱 불가·CSS 번들 증가에 주의 - HTTP Basic Auth —
Authorization: Basic dXNlcjpwYXNz.user:pass를 Base64 인코딩한 것이며 HTTPS 없이는 평문 노출 - JWT 디버깅 —
eyJhbGciOiJIUzI1NiJ9를 디코딩하면{"alg":"HS256"}. header/payload 확인 후 JSON 포매터로 구조 파악 - PEM 인증서 —
-----BEGIN CERTIFICATE-----사이의 본문이 Base64.openssl x509 -text로 파싱하기 전에 인코딩 무결성 확인 - 이메일 첨부(MIME) — RFC 2045에 따라 76문자마다 CRLF 줄바꿈 삽입. 이 도구의 출력에는 줄바꿈이 없으므로 MIME 용도라면 후처리 필요
API 디버깅 — Base64 페이로드 추적
마이크로서비스 간 통신에서 바이너리 페이로드를 JSON 필드에 Base64로 담는 패턴은 흔합니다. gRPC-JSON transcoding에서 bytes 필드는 자동으로 Base64 문자열이 되며, AWS API Gateway의 isBase64Encoded: true 응답도 동일합니다. 디버깅 시 응답 본문을 이 도구에 붙여 넣어 디코딩하면 원본 바이너리의 시작 바이트(magic number)로 파일 타입을 식별할 수 있습니다. 예를 들어 iVBOR로 시작하면 PNG,/9j/로 시작하면 JPEG입니다.
보안 주의 — Base64는 암호화가 아니다
Base64는 가역적 인코딩이므로 비밀번호, API 키, 개인정보를 Base64로 "숨기는" 것은 보안이 아닙니다. 누구나 디코딩할 수 있습니다. Basic Auth 헤더가 HTTPS 위에서만 안전한 이유가 여기에 있습니다. 민감 데이터 전송에는 AES-256-GCM 같은 대칭 암호화나 TLS를 사용하세요. 또한 디코딩 결과를 eval()이나 innerHTML에 직접 넣으면 XSS(Cross-Site Scripting) 공격 벡터가 됩니다. 디코딩 후 반드시 DOMPurify 등으로 새니타이징하거나 textContent로만 렌더링해야 합니다.
브라우저 호환성 — btoa/atob의 한계
JavaScript의 btoa()는 Latin1(ISO 8859-1) 범위(U+0000~U+00FF)만 받습니다. 한글(U+AC00~U+D7A3)을 직접 넣으면 InvalidCharacterError가 발생합니다. 해결책은 encodeURIComponent → percent-encoded 바이트 → String.fromCharCode파이프라인이며, 이 도구가 내부적으로 이 변환을 수행합니다. Node.js 환경이라면Buffer.from(str, 'utf-8').toString('base64')가 더 직관적입니다.
관련 도구
JWT payload를 디코딩한 후 JSON 구조를 보기 좋게 정렬하려면JSON 포매터를 사용하세요. Base64URL과 퍼센트 인코딩의 차이가 헷갈릴 때는URL 인코더로 동일 문자열을 비교해 보면 명확해집니다. 인코딩 전 원본 텍스트의 UTF-8 바이트 수를 확인하려면글자수 세기가 유용합니다.
참고 자료
- IETF RFC 4648 — The Base16, Base32, and Base64 Data Encodings
- IETF RFC 2045 §6.8 — MIME Base64 Content-Transfer-Encoding
- IETF RFC 7519 — JSON Web Token (JWT), Base64URL 사용 명세
- MDN Web Docs — btoa() / atob() / WindowOrWorkerGlobalScope
- OWASP — Cryptographic Failures (A02:2021), Base64 오용 사례