Base64란?
Base64는 바이너리 데이터를
ASCII 문자열
로 인코딩하는 방식입니다. 텍스트 기반 시스템에서 이진 데이터를 안전하게 전송하기 위해 사용됩니다.왜 필요한가?
일부 시스템(예: 이메일, JSON)은 바이너리 데이터를 처리하지 못하기 때문에, 이를 텍스트로 변환하는 인코딩 방식이 필요합니다.
Base64의 탄생 배경
1. 바이너리 데이터를 전송하기 어려운 환경
1980~90년대의 전자통신 시스템(특히 이메일과 초기 네트워크 프로토콜)은 다음과 같은 제한사항이 있었습니다.- 7비트 ASCII 문자만 안정적으로 처리 가능
- 바이너리 파일(예: 이미지, 실행파일, PDF 등)을 전송하면 깨지거나 손실 발생
- 인코딩되지 않은 바이너리 데이터는 전송 도중 오류가 생길 수 있음
2. MIME 표준의 등장 (RFC 2045~2049)
1990년대 초반, 이메일을 통해 텍스트 외의 콘텐츠(이미지, 첨부파일 등)를 안전하게 전송하기 위한 표준인 MIME (Multipurpose Internet Mail Extensions)이 등장했습니다.- MIME은 텍스트 기반의 이메일에서 바이너리 파일을 전송할 수 있게 만들기 위해 Base64 인코딩을 채택
- RFC 2045에서 Base64가 정식 정의됨 (1996년)
3. 전송 안정성과 호환성
Base64는 다음과 같은 장점 덕분에 널리 사용되었습니다.- 바이너리 전송 불안정 - ASCII 문자로 안전하게 변환
- 이메일에서 첨부파일 깨짐 - Base64로 인코딩하여 안정적인 전송 가능
- 네트워크에서 제어 문자 오작동 - 제어 문자를 포함하지 않는 안전한 문자셋 사용
- 프로그래밍 언어 간 호환성 - 언어에 무관한 문자열 기반 처리
🧮 인코딩 원리
1단계 | 원본 데이터를 3바이트(24비트)씩 읽음 |
---|---|
2단계 | 6비트씩 나누어 총 4개의 숫자로 분리 (2⁶ = 64 → Base64) |
3단계 | 아래 64개의 문자로 매핑하여 출력 |
Index | Character |
---|---|
0 | A |
1 | B |
2 | C |
3 | D |
4 | E |
5 | F |
6 | G |
7 | H |
8 | I |
9 | J |
10 | K |
11 | L |
12 | M |
13 | N |
14 | O |
15 | P |
16 | Q |
17 | R |
18 | S |
19 | T |
20 | U |
21 | V |
22 | W |
23 | X |
24 | Y |
25 | Z |
26 | a |
27 | b |
28 | c |
29 | d |
30 | e |
31 | f |
32 | g |
33 | h |
34 | i |
35 | j |
36 | k |
37 | l |
38 | m |
39 | n |
40 | o |
41 | p |
42 | q |
43 | r |
44 | s |
45 | t |
46 | u |
47 | v |
48 | w |
49 | x |
50 | y |
51 | z |
52 | 0 |
53 | 1 |
54 | 2 |
55 | 3 |
56 | 4 |
57 | 5 |
58 | 6 |
59 | 7 |
60 | 8 |
61 | 9 |
62 | + |
63 | / |
✅ 인코딩 예제
- 입력 문자열: Hello
- ASCII 값: H(72) e(101) l(108) l(108) o(111)
- Base64 인코딩 결과: SGVsbG8=
- ASCII 값: H(72) e(101) l(108) l(108) o(111)
- Base64 인코딩 결과: SGVsbG8=
✅ 디코딩 예제
- Base64 문자열: SGVsbG8=
- 디코딩 결과: Hello
- 디코딩 결과: Hello
📌 활용 예시
- MIME 이메일 첨부파일
- HTML/CSS 인라인 이미지
- JWT Payload
- HTTP Basic Auth
⚠️ 주의사항
- 보안 목적의 암호화가 아님 (디코딩 가능)
- 약 33% 데이터 크기 증가
🛠️ JavaScript 예제
const encoded = btoa('Hello');
const decoded = atob(encoded);