Base64는 바이너리 데이터를 정해진 문자 집합으로 표현하는 인코딩입니다. 텍스트만 다루는 형식이나 전송 경로에 이미지 같은 바이너리 데이터를 담을 때 사용합니다.

3바이트를 4문자로 표현하기

표준 Base64는 영문 대문자 26개, 소문자 26개, 숫자 10개, +, /를 사용합니다. 64개 문자를 구분하는 데 필요한 비트 수는 6비트입니다.

  1. 원본 3바이트, 즉 24비트를 묶습니다.
  2. 이를 6비트씩 네 묶음으로 나눕니다.
  3. 각 묶음을 대응하는 문자로 바꿉니다.

입력이 3바이트 단위로 끝나지 않으면 마지막 묶음의 부족한 부분을 처리하고, 패딩이 필요한 형식에서는 =로 출력 길이를 맞춥니다. =는 64개 데이터 문자에 포함되지 않습니다.

간단한 예제

브라우저에서는 btoaatob를 사용할 수 있습니다.

const encoded = btoa("Hello");
const decoded = atob(encoded);

console.assert(encoded === "SGVsbG8=");
console.assert(decoded === "Hello");

btoa는 각 문자를 하나의 바이트로 취급할 수 있는 문자열을 받습니다. 한글 같은 유니코드 문자열을 그대로 넣으면 실패할 수 있으므로, 먼저 UTF-8 바이트로 인코딩하는 처리가 필요합니다.

암호화나 압축이 아니다

Base64에는 비밀 키가 없습니다. 누구나 디코딩할 수 있으므로 비밀번호나 토큰을 Base64로 바꿨다고 보호되는 것은 아닙니다.

또한 크기가 줄지 않습니다. 패딩을 포함한 일반적인 출력 길이는 원본이 N바이트일 때 4 × ceil(N / 3)문자입니다. 큰 데이터에서는 대략 33% 커지므로 이미지 전체를 HTML에 넣으면 문서 크기와 캐시 효율을 함께 고려해야 합니다.

Base64와 Base64url

URL이나 파일 이름에서 쓰기 편하도록 +/를 각각 -_로 바꾼 변형이 Base64url입니다. 패딩 사용 여부는 해당 형식의 규칙을 따라야 하며, 두 형식을 무조건 같은 문자열로 취급하면 안 됩니다.

참고