Base64는 왜 파일 크기를 33% 증가시킬까? (인코딩의 원리)
웹 개발을 하다 보면 이미지나 파일을 Base64로 인코딩하여 전송하는 경우를 자주 접하게 됩니다.
Data URI Scheme(data:image/png;base64,...)을 사용하여 이미지를 HTML에 직접 삽입하거나, 바이너리 데이터를 JSON에 담아 보낼 때 주로 사용하죠.
그런데 Base64로 인코딩하면 원본 파일보다 크기가 약 33% 더 커진다는 사실, 알고 계셨나요?
이 글에서는 Base64의 동작 원리를 통해 그 이유를 명확히 파헤쳐 보겠습니다.
1. Base64란 무엇인가?
컴퓨터의 모든 데이터는 0과 1로 이루어진 바이너리(Binary) 데이터입니다.
하지만 이메일이나 HTML과 같은 텍스트 기반 프로토콜은 바이너리 데이터를 그대로 처리하는 데 한계가 있습니다. 제어 문자나 특정 비트 패턴이 시스템에서 오작동을 일으킬 수 있기 때문입니다.
Base64는 이러한 바이너리 데이터를 **64개의 안전한 출력 문자(ASCII)**로만 이루어진 텍스트로 변환하는 인코딩 방식입니다.
사용되는 64개의 문자는 다음과 같습니다:
A-Z(26개)a-z(26개)0-9(10개)+,/(2개)- (그리고 패딩을 위한
=)
2. 33% 증가의 수학적 비밀
Base64 인코딩의 핵심은 **"3바이트를 4문자로 변환한다"**는 것입니다.
- 원본 데이터: 3바이트는 비트입니다.
- 변환 과정: 이 24비트를 6비트씩 4개의 그룹으로 나눕니다. ()
- 인코딩: 각 6비트 그룹(0~63)을 Base64 색인표에 매핑하여 문자로 변환합니다.
왜 커지는가?
원본 데이터 3바이트(24비트)를 표현하기 위해, Base64는 4바이트(ASCII 문자 4개, 32비트)를 사용합니다.
즉, 3바이트의 정보를 담기 위해 4바이트의 공간을 소비하는 셈입니다.
이것이 바로 Base64 인코딩 시 데이터 크기가 약 33% 증가하는 수학적 이유입니다.
3. 패딩(=)의 역할
만약 원본 데이터의 길이가 3의 배수가 아니라면 어떻게 될까요?
남는 비트가 생길 경우, Base64는 뒤에 = 문자를 붙여 길이를 4의 배수로 맞춥니다. 이를 **패딩(Padding)**이라고 합니다.
- 1바이트가 남으면:
=두 개 추가 - 2바이트가 남으면:
=한 개 추가
따라서 Base64 문자열의 끝에 있는 =는 데이터의 끝을 알리고 길이를 맞추기 위한 용도입니다.
결론
Base64는 바이너리 데이터를 텍스트 환경에서 안전하게 전송하기 위한 필수적인 도구입니다.
하지만 33%의 용량 증가는 네트워크 대역폭과 로딩 속도에 영향을 줄 수 있습니다.
따라서 대용량 파일의 경우 Base64 인코딩보다는 바이너리 전송을 고려하거나, 꼭 필요한 경우에만 사용하는 것이 성능 최적화의 지름길입니다.
관련 도구 둘러보기
Pockit의 무료 개발자 도구를 사용해 보세요