Base64란? 유래, 작동 원리와 사용 사례
Base64가 생긴 이유, 3바이트를 4문자로 바꾸는 원리, 패딩과 URL-safe 변형, 올바른 사용 사례를 설명합니다.
한 문장으로 말하는 Base64
Base64는 바이너리를 텍스트로 바꾸는 인코딩입니다. 어떤 바이트열이든 널리 호환되는 작은 문자 집합의 문자열로 표현합니다. 그 바이트가 사진인지 PDF인지 단어인지 해석하지 않고, 텍스트 중심 시스템을 지나갈 수 있는 포장만 씌웁니다.
변환은 되돌릴 수 있고 정보 손실이 없지만 암호화, 해시, 압축은 아닙니다.
Base64는 어디에서 왔을까
초기 네트워크와 이메일 시스템은 임의의 8비트 값을 항상 안전하게 운반하지 못했습니다. 일부 게이트웨이는 인쇄 가능한 7비트 텍스트를 기대해 바이너리 데이터를 바꿀 수 있었습니다. uuencode 같은 선행 방식도 같은 문제를 풀었고, RFC 1421이 Privacy-Enhanced Mail에 정의한 64문자 인쇄 가능 인코딩은 현대 Base64의 직접적인 계보입니다.
이후 MIME은 메일 본문과 첨부의 Content-Transfer-Encoding으로 Base64라는 이름을 사용했습니다. 2006년 RFC 4648은 표준 및 URL-safe 알파벳의 일반 기준이 되었습니다. 한 사람의 비밀 발명이라기보다 상호 운용 표준이 발전한 결과입니다.
왜 64문자이며 3대 4 규칙은 어떻게 작동할까
6비트는 0부터 63까지 정확히 64개 값을 표현합니다. 표준 Base64는 이 값을 A–Z, a–z, 0–9, +, /에 대응시킵니다. 인코더는 3바이트, 즉 24비트를 읽고 경계를 6비트씩 4그룹으로 다시 나눕니다. 각 값을 문자표의 인덱스로 사용해 4문자를 출력합니다.
ASCII/UTF-8의 “Man”은 19, 22, 5, 46을 만들고 각각 T, W, F, u에 대응합니다. 결과는 TWFu이며 디코딩은 이 과정을 거꾸로 수행합니다.
- 입력
Man- 입력 바이트
01001101 01100001 01101110- 6비트 그룹
010011 010110 000101 101110- 알파벳 인덱스
19 · 22 · 5 · 46- Base64 출력
TWFu
패딩, 유니코드와 Base64url
마지막 블록이 1바이트이면 데이터 문자 2개 뒤에 ==가, 2바이트이면 문자 3개 뒤에 =가 붙습니다. 패딩은 숨겨진 데이터가 아니라 마지막 24비트 블록 중 실제 데이터의 양을 알려 주는 표시입니다. 길이를 다른 방법으로 아는 프로토콜은 생략하기도 합니다.
Base64는 문자가 아니라 바이트를 다룹니다. 한글, 中文, 이모지는 보통 UTF-8 바이트로 먼저 변환합니다. URL과 파일 이름용 base64url은 +와 /를 -와 _로 바꿉니다. 관련된 알파벳이지만 프로토콜 확인 없이 섞으면 안 됩니다.
Base64가 실제로 유용한 곳
MIME 이메일 첨부, 인증서나 키의 PEM 블록, 작은 이미지나 글꼴을 넣는 data: URL이 대표적입니다. JSON과 XML도 작은 바이너리 데이터를 Base64 문자열로 운반할 수 있습니다. HTTP Basic 자격 증명은 Base64를, JWT 세그먼트는 base64url을 쓰지만 어느 쪽도 비밀이 되지는 않습니다.
핵심은 외부 채널은 텍스트를 원하고 내부 페이로드는 바이트라는 점입니다. 업로드, 객체 저장소, 데이터베이스 BLOB이 바이너리를 직접 받는다면 Base64는 불필요한 층일 수 있습니다.
크기와 성능 비용
완전한 3바이트는 4문자가 됩니다. 정확한 길이는 4 × ceil(n / 3)이므로 큰 입력의 오버헤드는 약 33.3%에 가까워지고 작은 입력은 비율이 더 큽니다. 줄바꿈이나 data: URL 접두사도 추가됩니다.
다른 계층의 압축이 전송량을 줄일 수는 있지만 인코딩은 여전히 메모리와 CPU를 사용합니다. 큰 파일은 바이너리로 직접 전송하는 편이 대체로 깔끔합니다.
Base64가 하지 못하는 것
Base64는 기밀성이나 진위를 제공하지 않습니다. 누구나 키 없이 디코딩하고 수정할 수 있습니다. 비밀번호, API 토큰, 개인정보 보호에 쓰면 안 됩니다. 비밀 유지에는 암호화와 TLS, 요약에는 암호학적 해시, 위변조 탐지에는 서명이나 MAC을 사용해야 합니다.
간단한 원칙은 이렇습니다. Base64는 텍스트 경계를 넘기 위한 도구이지 보안 경계를 지키는 도구가 아닙니다.