Base64 인코더·디코더 쉽게 이해하기 — 개념과 원리
Base64는 임의의 바이트를 안전한 문자 64개만으로 이루어진 ASCII 텍스트로 바꾸는 방식입니다. 그래서 이메일 첨부 파일(MIME), 데이터 URL, JSON 필드, HTTP Basic 인증 헤더, JWT처럼 텍스트만 다루는 경로로 이진 데이터를 보낼 수 있습니다. 이 도구는 텍스트를 Base64로 인코딩하거나 원래대로 디코딩하고, URL 안전 형식도 만들어 줍니다. 먼저 UTF-8로 바꾸므로 한글도 그대로 처리되며, 모든 계산은 브라우저 안에서 이루어집니다.
계산 방법
- 텍스트를 UTF-8 바이트로 바꿉니다.
- 바이트를 3개(24비트)씩 묶습니다.
- 각 묶음을 6비트 값(0~63) 4개로 나눕니다.
- 각 값을 A~Z(0~25), a~z(26~51), 0~9(52~61), +(62), /(63)에 대응시킵니다.
- 마지막 묶음이 1바이트나 2바이트이면 출력 길이가 4의 배수가 되도록 == 또는 =를 붙입니다.
출력 길이 = 4 × ⌈바이트 수 ÷ 3⌉입니다. URL 안전 모드는 +를 -로, /를 _로 바꾸고 패딩을 뺍니다. 디코딩은 이 과정을 거꾸로 하며 URL 안전 문자도 받아들입니다.
원리
6비트로는 정확히 64가지 조합이 나오고, 거의 모든 텍스트 경로를 그대로 통과하는 문자 64개를 고를 수 있습니다. 3바이트(24비트)는 6비트 조각 4개로 딱 나누어지므로 Base64는 3바이트를 4글자로 바꾸는 단위로 동작하고, 데이터 크기는 약 3분의 1 늘어납니다. 패딩은 마지막 묶음에 실제로 몇 바이트가 있었는지를 디코더에 알려 줍니다.
예제 풀이
- 입력값은 "Hello, 세계!", 모드는 인코딩입니다.
- UTF-8로 "Hello, "는 7바이트, 세(EC 84 B8)와 계(EA B3 84)는 각각 3바이트, "!"는 1바이트이므로 모두 14바이트입니다.
- 첫 묶음 "Hel" = 48 65 6C = 010010 000110 010101 101100 = 18, 6, 21, 44이므로 "SGVs"가 됩니다.
- 14바이트는 완전한 묶음 4개와 2바이트이므로 4 × 4 + 4 = 20글자가 되고 끝에 =가 하나 붙습니다.
- 결과는 SGVsbG8sIOyEuOqzhCE=, 길이는 20입니다.
결과 해석
표준 모드에서 길이는 항상 4의 배수입니다. 끝의 = 하나는 마지막 묶음이 2바이트였다는 뜻이고, ==는 1바이트였다는 뜻입니다. 허용되지 않는 문자가 섞인 문자열을 디코딩하면 "invalid input"이 표시됩니다. 디코딩한 글자가 깨져 보인다면 원래 데이터가 이미지처럼 UTF-8 텍스트가 아니었거나 다른 문자 집합으로 저장된 경우일 가능성이 큽니다.
흔한 실수
- Base64를 암호화로 오해하는 경우(누구나 곧바로 디코딩할 수 있습니다)
- 시스템 사이에서 표준 형식과 URL 안전 형식을 섞어 쓰는 경우
- EUC-KR처럼 UTF-8이 아닌 문자 집합으로 인코딩하고 같은 결과를 기대하는 경우
자주 묻는 질문
Base64로 바꾸면 왜 크기가 약 33% 커지나요?
3바이트가 4글자가 되어 4 ÷ 3 비율로 늘고, 여기에 패딩이 최대 두 글자 붙기 때문입니다.
URL 안전 Base64는 언제 쓰나요?
결과를 URL, 파일 이름, JWT 같은 토큰에 넣을 때 씁니다. 이런 곳에서는 +와 /가 특별한 의미를 가집니다.
패딩은 생략해도 되나요?
이 도구처럼 패딩 없이도 받아들이는 디코더가 많지만, 엄격한 디코더는 패딩을 요구하기도 합니다.
출처: IETF RFC 4648, The Base16, Base32, and Base64 Data Encodings · IETF RFC 3629, UTF-8, a transformation format of ISO 10646