지식 · 텍스트, 데이터, 보안
Base64 인코딩이란 무엇인가요?
핵심 답변
Base64는 출력 가능한 문자 64개(A–Z, a–z, 0–9, +, /)와 패딩용 =만으로 바이너리 데이터를 표현하는 방식입니다. 3바이트마다 6비트 묶음 네 개로 나누고 각 묶음을 문자 하나에 대응시키므로 "Man"은 "TWFu"가 됩니다. 이메일, JSON, URL처럼 텍스트만 다루는 경로에서 바이너리 데이터를 안전하게 보낼 수 있지만 크기는 약 33% 커집니다. Base64는 인코딩이지 암호화가 아닙니다.
Base64 열기Base64 동작 원리, 단계별로 보기
Base64는 RFC 4648에 정의되어 있습니다. 64 = 2⁶이므로 출력 문자 하나는 정확히 6비트를 담고, 3바이트(24비트)는 문자 4개에 딱 맞게 대응됩니다.
| 단계 | M | a | n |
|---|---|---|---|
| ASCII 코드 | 77 | 97 | 110 |
| 2진수(각 8비트) | 01001101 | 01100001 | 01101110 |
- 24비트를 이어 붙입니다:
010011010110000101101110. - 6비트씩 네 묶음으로 나눕니다:
010011010110000101101110. - 숫자로 바꿉니다: 19, 22, 5, 46.
- 각 숫자를 문자표에서 찾습니다(0 = A, 25 = Z, 26 = a, 51 = z, 52 = 0, 61 = 9, 62 = +, 63 = /): T, W, F, u.
- 결과:
TWFu.
= 패딩
입력 길이가 3의 배수가 아니면 마지막 묶음을 0비트로 채우고 =로 부족한 바이트를 표시하므로, 출력 길이는 항상 4의 배수가 됩니다.
| 입력 | 바이트 수 | Base64 |
|---|---|---|
M | 1 | TQ== |
Ma | 2 | TWE= |
Man | 3 | TWFu |
Hello | 5 | SGVsbG8= |
é (UTF-8 바이트 C3 A9) | 2 | w6k= |
n바이트를 인코딩한 길이는 4 × ceil(n ÷ 3)글자입니다. 1 MB 파일은 약 1.33 MB의 텍스트가 되고, MIME 이메일은 76글자마다 줄바꿈을 넣으므로 오버헤드가 조금 더 늘어납니다.
Base64가 쓰이는 곳
- 이메일 첨부 파일: 초기 메일 시스템은 7비트 텍스트만 전송했기 때문에 MIME은 파일을 Base64로 인코딩합니다.
- 데이터 URL: HTML이나 CSS에 직접 넣는 작은 이미지로,
data:image/png;base64,iVBORw0KGgo...형태로 씁니다. - 이미지, 키, 인증서 같은 바이너리 데이터를 실어 보내야 하는 JSON·XML API.
- JSON Web Token(JWT): 헤더와 페이로드가 Base64url로 인코딩된 JSON입니다.
- TLS 인증서와 키를 담는 PEM 파일:
-----BEGIN CERTIFICATE-----줄 사이에 Base64를 넣습니다. - HTTP Basic 인증:
username:password를 Base64로 인코딩해 보냅니다.
이미지를 데이터 URL로 넣으면 네트워크 요청은 하나 줄지만 크기가 33% 늘고 따로 캐시할 수 없으므로, 보통 아주 작은 이미지에만 쓸 만합니다.
Base64와 Base64url, 그리고 다른 인코딩
표준 Base64는 URL과 파일 이름에서 특별한 의미를 갖는 +와 /를 씁니다. 같은 RFC에 정의된 URL 안전 변형은 이를 -와 _로 바꾸고 = 패딩을 생략하는 경우가 많습니다.
| 인코딩 | 사용 문자 | 크기 오버헤드 | 사용 예 |
|---|---|---|---|
| Base16 (hex) | 0–9, A–F | 100% | 해시, 색상 코드 |
| Base32 | A–Z, 2–7 | 60% | 2단계 인증 비밀 키 |
| Base64 | A–Z, a–z, 0–9, +, / | 33% | 이메일, 데이터 URL, PEM |
| Base64url | A–Z, a–z, 0–9, -, _ | 33% | JWT, URL 매개변수 |
흔한 실수
- 텍스트는 먼저 바이트로 변환해야 하며, 보통 UTF-8을 씁니다. JavaScript의
btoa()는 문자열을 먼저 UTF-8로 인코딩하지 않으면 이모지나 한글처럼 Latin-1 범위를 벗어난 문자에서 오류를 냅니다. - 표준 문자표와 URL 안전 문자표를 섞으면 디코딩 오류가 납니다. 표준 디코더를 쓰기 전에
-와_를+와/로 바꾸세요. - 패딩이 빠지면 엄격한 디코더는 실패할 수 있습니다. 길이가 4의 배수가 될 때까지
=를 붙이세요. - 일부 디코더는 이메일 방식 인코딩의 줄바꿈을 제거해야 문자열을 받아들입니다.
자주 묻는 질문
Base64로 인코딩하면 왜 데이터가 커지나요?
3바이트가 4글자가 되고 각 글자가 1바이트로 저장되므로 출력이 입력보다 약 33% 커집니다.
Base64는 안전한가요?
아니요. 아무것도 숨기지 않으며 디코딩에 키가 필요 없습니다. 데이터를 보호하려면 AES 같은 실제 암호화를 쓰고, Base64는 그 결과를 텍스트로 전달할 때만 쓰세요.
Base64 끝의 =는 무슨 뜻인가요?
패딩입니다. = 하나는 마지막 묶음이 2바이트였다는 뜻이고, ==는 1바이트뿐이었다는 뜻입니다.
Base64 문자열은 어떻게 알아보나요?
영문자, 숫자, +와 /(또는 -와 _)만 들어 있고, 길이가 보통 4의 배수이며, = 하나나 둘로 끝나기도 합니다. eyJ로 시작하는 문자열은 Base64로 인코딩된 JSON인 경우가 많은데, {"로 시작하는 JSON 텍스트를 인코딩하면 eyJ로 시작하기 때문입니다.