Base64란?
Base64는 바이너리 데이터를 64개의 문자(A-Z, a-z, 0-9, +, /)를 사용해 텍스트 문자열로 변환하는 인코딩 방식입니다. 이름은 사용되는 64개의 문자에서 왔습니다. Base64로 인코딩된 문자열에는 텍스트 기반 프로토콜에서 제어 문자나 구분자로 잘못 해석될 수 있는 특수 문자가 없습니다.
Base64가 아닌 것을 분명히 해야 합니다. Base64는 암호화가 아닙니다. 누구든 Base64 인코딩 데이터를 쉽게 디코딩할 수 있습니다. 난독화는 되지만 보안은 전혀 제공하지 않습니다. 민감한 정보를 "보호"하기 위해 Base64를 사용하지 마세요.
Base64가 존재하는 이유
Base64는 텍스트 처리를 위해 설계된 많은 프로토콜과 시스템이 임의의 바이너리 데이터를 안정적으로 전송할 수 없다는 특정 기술적 문제를 해결하기 위해 만들어졌습니다.
1980년대에 설계된 SMTP 같은 이메일 프로토콜은 데이터를 7비트 ASCII 문자로 전송했습니다. 바이트의 상위 절반(값 128-255)은 전송 중 종종 제거되거나 손상되었고, 특정 바이트 값(0x00, 널 문자)은 메시지 종료 마커로 해석될 수 있었습니다. JPEG 이미지 같은 바이너리 파일을 SMTP로 직접 전송하면 파일이 손상됩니다.
Base64는 가능한 모든 바이너리 바이트 값을 64개의 "안전한" ASCII 문자만 사용해 표현함으로써 이 문제를 해결합니다. 3바이트의 바이너리 데이터(24비트)가 4개의 Base64 문자(각 6비트, 총 24비트)로 인코딩됩니다. 결과 텍스트는 원본 바이너리보다 33% 크지만, 어떤 텍스트 기반 전송 메커니즘에서도 온전히 살아남습니다.
Base64 인코딩의 작동 방식
알고리즘은 간단합니다. 입력에서 3바이트를 가져와 24비트 이진수로 보고 4개의 6비트 그룹으로 나눕니다. 각 6비트 값(0-63)은 Base64 알파벳의 특정 문자에 대응합니다. 입력 길이가 3으로 나누어지지 않으면 패딩 문자(=)가 추가됩니다.
예를 들어, ASCII 텍스트 "Man"은 이진수로 01001101 01100001 01101110입니다. 24비트로 합치면: 010011010110000101101110. 4개의 6비트 그룹으로 분할: 010011 | 010110 | 000101 | 101110 = 19, 22, 5, 46. Base64 테이블에서 조회하면 T, W, F, u. 따라서 "Man"은 "TWFu"로 인코딩됩니다.
Base64 문자열 끝의 = 패딩은 마지막 그룹에서 하나 또는 두 개의 입력 바이트가 적었음을 나타냅니다.
주요 사용 사례
**데이터 URL.** HTML과 CSS는 외부 파일에 링크하는 대신 리소스 데이터를 코드에 직접 내장하는 data: URI 스킴을 지원합니다. 작은 이미지, 폰트, 아이콘을 Base64로 인라인화할 수 있습니다: data:image/png;base64,iVBORw0KGgo... 이렇게 하면 HTTP 요청이 줄어 작은 리소스의 성능이 향상됩니다.
**이메일 첨부파일.** 이메일에 첨부파일을 담는 MIME 표준은 Base64로 바이너리 파일을 인코딩합니다. PDF를 이메일에 첨부할 때 이메일 클라이언트가 Base64로 인코딩하는 것입니다.
**JSON API.** JSON은 텍스트 포맷이라 바이너리 데이터를 직접 담을 수 없습니다. 이미지, 오디오 클립, 파일 업로드 같은 바이너리 콘텐츠를 전달해야 하는 API는 종종 바이너리를 Base64로 인코딩해 JSON 문자열 값으로 내장합니다.
**기본 HTTP 인증.** HTTP의 기본 인증 방식은 Authorization 헤더에 Base64(사용자명:비밀번호)로 자격증명을 전송합니다. 인코딩 자체는 되돌릴 수 있어 보안이 없지만, 전송이 암호화된 HTTPS 위에서 사용됩니다.
**CSS에 이미지 내장.** 배경 이미지와 아이콘을 CSS 스타일시트에 Base64 데이터 URL로 인라인화하면, 별도의 이미지 요청 없이 단일 CSS 파일로 웹사이트가 동작할 수 있습니다.
**텍스트 필드에 바이너리 데이터 저장.** 텍스트 컬럼 타입만 있는 데이터베이스나 JSON·XML로 설정을 저장해야 하는 시스템에서는 암호화 키, 인증서, 파일 내용 같은 바이너리 데이터를 Base64로 저장합니다.
URL 안전 Base64
표준 Base64는 URL에서 특별한 의미를 가진 + 와 / 문자를 사용합니다. Base64 문자열을 쿼리 파라미터에 내장하면 URL 파싱이 깨집니다. URL 안전 Base64(Base64url)는 +를 -로, /를 _로 대체하고 패딩을 보통 생략합니다. URL에 Base64를 사용하는 대부분의 현대 API는 이 변형을 씁니다.
Base64를 쓰지 말아야 할 때
Base64는 데이터 크기를 약 33% 늘립니다. 대용량 파일, 즉 동영상, 고해상도 이미지, 대형 바이너리 블롭에는 크기 오버헤드가 상당합니다. 10MB 바이너리 파일을 13.3MB의 Base64 텍스트로 전송하면 대역폭과 메모리를 낭비합니다.
대용량 바이너리 전송에는 바이너리 안전 프로토콜을 직접 사용하세요. HTTP 업로드의 multipart/form-data, 바이너리 WebSocket 프레임, 파일 스트리밍 프로토콜 등이 있습니다. Base64는 작은 리소스, 자격증명, 바이너리 전송이 불가능한 상황에 적합한 도구이지, 범용 바이너리 전송 메커니즘이 아닙니다.