Base64란?

Base64는 바이너리 데이터를 ASCII 문자열로 변환하는 인코딩 방식입니다. RFC 4648로 표준화되어 있으며, 이메일 첨부파일(MIME), 웹 Data URI, JWT 토큰, HTTP 기본 인증 등 텍스트 기반 프로토콜에서 바이너리 데이터를 안전하게 전송할 때 사용됩니다.

중요한 점은 Base64는 인코딩이지 암호화가 아니라는 것입니다. 누구나 디코딩하여 원본 데이터를 확인할 수 있으므로, 민감한 정보를 보호하는 용도로는 사용할 수 없습니다. 보안이 필요한 경우 AES, RSA 같은 암호화 알고리즘을 사용해야 합니다.

인코딩 원리

Base64는 6비트 단위로 데이터를 분할하여 64가지 문자(A-Z, a-z, 0-9, +, /)로 매핑합니다. 3바이트(24비트)의 입력이 4개의 Base64 문자로 변환되므로, 출력 크기는 원본 대비 약 33% 증가합니다. 입력 바이트 수가 3의 배수가 아닌 경우, 나머지를 0으로 채우고 패딩 문자(=)를 추가합니다.

예를 들어, 문자열 "Hi"(2바이트)를 Base64로 인코딩하면 "SGk="(4문자)가 됩니다. 2바이트는 3의 배수가 아니므로 1바이트의 제로 패딩이 추가되고, 마지막에 = 하나가 붙습니다. 1바이트 입력에는 ==, 3바이트 입력에는 패딩 없음이 적용됩니다.

표준 Base64 vs URL-safe Base64

표준 Base64(RFC 4648 Section 4)는 +/ 문자를 사용합니다. 하지만 이 문자들은 URL과 파일명에서 특수한 의미를 가지므로 문제가 발생합니다. URL에서 +는 공백으로 해석되고, /는 경로 구분자로 처리됩니다.

URL-safe Base64(RFC 4648 Section 5)는 +-로, /_로 대체합니다. JWT 토큰, OAuth 파라미터, 파일명 등 URL이나 파일시스템에서 사용되는 경우 URL-safe 변형을 사용해야 합니다. 또한 URL-safe Base64에서는 패딩(=)을 생략하는 것이 일반적입니다.

실무 활용 사례

JWT (JSON Web Token)

JWT는 세 부분(Header, Payload, Signature)을 점(.)으로 구분한 문자열입니다. Header와 Payload는 JSON 객체를 URL-safe Base64로 인코딩한 것이며, Signature는 이 두 부분을 HMAC이나 RSA로 서명한 값입니다.

JWT의 Payload를 Base64 디코딩하면 사용자 ID, 만료 시간(exp), 발급 시간(iat) 등의 클레임을 확인할 수 있습니다. API 디버깅 시 토큰의 만료 여부를 확인하려면 Payload를 디코딩하여 exp 값을 타임스탬프로 변환하면 됩니다. Base64 디코더타임스탬프 변환기를 함께 활용하세요.

Data URI (인라인 이미지)

Data URI는 이미지나 폰트 같은 리소스를 Base64로 인코딩하여 HTML이나 CSS에 직접 삽입하는 방식입니다. 형식은 data:[MIME 타입];base64,[Base64 데이터]입니다. 작은 아이콘(수 KB 이하)을 인라인으로 넣으면 HTTP 요청 수를 줄여 초기 로딩을 빠르게 할 수 있습니다.

하지만 크기가 큰 이미지를 인라인하면 HTML/CSS 파일 크기가 급격히 증가하고, 브라우저 캐싱의 이점을 잃게 됩니다. 일반적으로 2~5KB 이하의 아이콘에만 Data URI를 사용하고, 그 이상은 별도 파일로 분리하는 것이 권장됩니다. 이미지를 Data URI로 변환하려면 이미지 Base64 변환기를 활용하세요.

HTTP Basic Authentication

HTTP 기본 인증은 사용자이름:비밀번호 문자열을 Base64로 인코딩하여 Authorization: Basic [Base64 문자열] 헤더로 전송합니다. 간단하지만 Base64는 디코딩이 가능하므로, 반드시 HTTPS와 함께 사용해야 합니다. HTTP 환경에서는 네트워크 스니핑으로 인증 정보가 노출됩니다.

이메일 첨부파일 (MIME)

이메일 프로토콜(SMTP)은 원래 7비트 ASCII만 지원하도록 설계되었습니다. 이미지, 문서 등 바이너리 첨부파일을 전송하려면 MIME(Multipurpose Internet Mail Extensions)이 Base64로 인코딩하여 텍스트 형태로 변환합니다. 수신 측 이메일 클라이언트가 자동으로 디코딩하여 원본 파일을 복원합니다.

API 페이로드

REST API에서 이미지 업로드를 JSON으로 처리해야 할 때, 파일 내용을 Base64 문자열로 변환하여 JSON 필드에 포함하는 패턴이 사용됩니다. 멀티파트 폼 데이터보다 구현이 간단하지만, 33%의 크기 증가를 감안해야 합니다. 대용량 파일에는 멀티파트 업로드나 사전 서명 URL 방식이 더 적합합니다.

프로그래밍 언어별 사용법

JavaScript(브라우저)에서는 btoa()로 인코딩하고 atob()로 디코딩합니다. 다만 이 함수들은 Latin-1 문자만 지원하므로, UTF-8 문자열(한글 등)은 encodeURIComponent()와 조합해야 합니다. Node.js에서는 Buffer.from(data).toString('base64')를 사용합니다.

Python에서는 base64 모듈의 b64encode()b64decode()를 사용합니다. URL-safe 변형은 urlsafe_b64encode()를 사용합니다. 입력은 bytes 타입이어야 하므로 문자열은 .encode('utf-8')로 변환 후 인코딩합니다.

Java에서는 java.util.Base64 클래스의 getEncoder()getDecoder()를 사용합니다. URL-safe 변형은 getUrlEncoder()를 사용합니다.

주의사항

암호화가 아님 — Base64는 단순 인코딩입니다. 누구나 디코딩할 수 있으므로 비밀번호, API 키 등을 Base64만으로 보호하면 안 됩니다.

크기 증가 — 출력이 입력 대비 약 33% 증가합니다. 대용량 파일을 Base64로 변환하면 네트워크 전송량과 메모리 사용량이 크게 늘어납니다.

패딩 처리 — 일부 시스템은 패딩(=)을 요구하고, 일부는 생략합니다. JWT는 패딩 없이, MIME은 패딩 포함이 표준입니다. 디코딩 오류가 발생하면 패딩 유무를 확인하세요.

줄바꿈 처리 — MIME Base64는 76자마다 줄바꿈을 삽입하지만, URL-safe Base64는 줄바꿈 없이 한 줄로 출력합니다. 서로 다른 줄바꿈 규칙이 디코딩 오류의 원인이 될 수 있습니다.

도구 활용

텍스트를 Base64로 인코딩/디코딩하려면 Base64 인코더를 사용하세요. 이미지 파일을 Data URI로 변환하려면 이미지 Base64 변환기가 적합합니다. JWT 토큰의 만료 시간을 확인하려면 Base64 디코딩 후 타임스탬프 변환기exp 값을 변환하세요.

광고 영역