TL;DR
- Base64는 8비트 이진 데이터를 64개의 안전한 ASCII 인쇄 가능 문자로 변환하는 인코딩 방식이다.
- 3바이트(24비트)를 6비트씩 쪼개어 4개의 문자로 매핑하며, 원본 대비 데이터 크기가 약 33% 증가한다.
- 바이너리 데이터를 SMTP 같은 텍스트 중심 채널이나, JSON/HTML/URL처럼 텍스트 표현이 필요한 컨텍스트에서 안전하게 다루기 위해 사용된다.
Base64 인코딩
Base64는 8비트 이진 데이터(Binary Data)를 문자 코드 영향이 없는 ASCII 영역의 안전한 문자들(A-Z, a-z, 0-9, +, /)로만 이루어진 문자열로 변환하는 Binary-to-Text 인코딩 규격이다. 데이터 전송 시 제어 문자에 의한 전송 중단이나 데이터 변조를 방지하는 것이 핵심 목적이다.
1. 변환 메커니즘 (Encoding Process)
Base64 인코딩은 24비트(3바이트) 단위를 한 블록으로 처리한다.
- 입력: 원본 데이터를 3바이트씩 묶는다.
- 분할: 24비트 데이터를 6비트씩 4개의 그룹으로 나눈다 ().
- 매핑: 각 6비트 값을 10진수로 환산하여 Base64 색인표(Index Table)의 문자로 치환한다.
- 패딩 (Padding): 입력 데이터가 3바이트의 배수가 아닐 경우, 부족한 자리를 = 기호로 채워 4글자 단위를 강제한다.
예시: “Man” 인코딩 과정
| 단계 | 데이터 1 (‘M’) | 데이터 2 (‘a’) | 데이터 3 (‘n’) | |
|---|---|---|---|---|
| ASCII / 코드 포인트 | 77 (0x4D) | 97 (0x61) | 110 (0x6E) | |
| 8비트 이진수 | 01001101 | 01100001 | 01101110 | |
| 24비트 스트림 | 01001101 | 01100001 | 01101110 | |
| 6비트 분할 | 010011 | 010110 | 000101 | 101110 |
| 10진수 환산 | 19 | 22 | 5 | 46 |
| Base64 문자 | T | W | F | u |
2. 패딩 (Padding) 규칙
입력 데이터의 끝이 24비트 블록(3바이트)으로 나누어떨어지지 않을 때, 마지막 4글자 묶음을 완성하기 위해 패딩 기호인 =를 사용한다.
- 1바이트 남음 (예: “A”): 부족한 4비트를 0으로 패딩하여 2개 문자를 생성하고, 나머지 두 자리는 패딩 기호 ==를 추가하여 4글자를 완성한다. 결과: QQ==
- 2바이트 남음 (예: “BC”): 부족한 2비트를 0으로 패딩하여 3개 문자를 생성하고, 마지막 한 자리는 패딩 기호 =를 추가하여 4글자를 완성한다. 결과: QkM=
3. 기술적 배경 (Technical Rationale)
왜 64개() 문자인가?
표준 ASCII(128자) 중 제어 문자(0~31, 127)와 일부 특수문자는 시스템에 따라 다르게 해석되거나 전송 중 유실될 위험이 있다. Base64는 시스템 독립적으로 신뢰성(Reliability) 있게 처리될 수 있는 64개의 문자만을 사용하여 호환성을 극대화했다.
URL-Safe Base64 (base64url)
표준 Base64의 +와 /는 URL에서 예약어(Query string 등)로 사용되어 문제가 발생한다. 이를 위해 + → -, / → _로 치환하고 패딩 기호인 =를 생략하거나 퍼센트 인코딩하는 base64url(RFC 4648 §5) 변형이 사용된다.
Connections
- ASCII (American Standard Code for Information Interchange) — 색인표 구성을 위한 기반 문자 집합
- UTF-8 — 텍스트 데이터를 바이너리 스트림으로 간주하여 인코딩하는 대상
- [[Hexadecimal (16진수)]] — 바이너리 데이터의 비트 구성을 직관적으로 확인하기 위한 도구
- NDJSON (Newline Delimited JSON) — JSON 내 바이너리 필드를 포함할 때 Base64 인코딩을 주로 활용


Discussion
Comments
댓글은 승인 후 공개됩니다.