Base64 인코딩이란? 정의, 존재 이유, 사용 시점

발행: (2026년 6월 9일 PM 07:10 GMT+9)
8 분 소요
원문: Dev.to

Source: Dev.to

Base64 인코딩은 JWT 토큰, 이메일 첨부 파일, data URI, HTTP Basic Auth 헤더 등 어디에서든 볼 수 있는 기술이지만, 명확히 설명되는 경우는 드뭅니다. 여기서는 Base64가 무엇이며, 왜 만들어졌고, 언제 사용하고 언제 사용하면 안 되는지에 대한 실용적인 가이드를 제공합니다.

Base64는 이진 데이터(바이트)를 64개의 출력 가능한 ASCII 문자 문자열로 변환하는 인코딩 방식입니다. 그 64자는 다음과 같습니다: A–Z (26자), a–z (26자), 0–9 (10자), +/ (각 1자) — 그리고 패딩용 =가 추가됩니다.

Base64가 해결하고자 하는 핵심 문제: 모든 데이터 전송 시스템이 임의의 바이트를 안전하게 처리하지는 못합니다. 이메일 프로토콜, HTTP 헤더, 그리고 많은 구식 시스템은 텍스트 전송을 위해 설계되었으며, 이진 데이터를 직접 다루지 못합니다. 바이트 값 0x00(null), 0x0A(줄바꿈), 0x1B(escape) 등은 텍스트 기반 전송을 손상시키거나 중단시킬 수 있습니다.

Base64는 이러한 문제를 회피하기 위해, 어떤 이진 데이터든 안전하고 출력 가능한 문자 문자열로 인코딩합니다. 따라서 어떤 시스템도 이를 오해하지 못합니다.

알고리즘은 매우 간단합니다:

  1. 입력 바이트를 3바이트씩 묶습니다.
  2. 각 3바이트(24비트) 그룹을 4개의 Base64 문자(각 6비트)로 변환합니다.
  3. 입력 길이가 3의 배수가 아니면 = 문자를 사용해 패딩을 추가해 출력 길이를 4의 배수로 맞춥니다.

이 4:3 비율 때문에 Base64 출력은 항상 입력보다 약 33% 정도 더 커집니다.

예시: 문자열 hello(5바이트)는 aGVsbG8=(8문자)로 인코딩됩니다.

JWT 토큰

JSON Web Token은 헤더, 페이로드, 서명 세 부분을 Base64url‑인코딩한 뒤 점(.)으로 연결한 형태입니다. 토큰 eyJhbGciOiJIUzI1NiJ9.eyJ1c2VyIjoiYWxleCJ9.xyz는 Base64로 디코딩할 수 있으므로, 키 없이도 헤더와 페이로드를 읽을 수 있습니다. 이는 의도된 동작이며, JWT는 인코딩된 것이지 암호화된 것이 아닙니다.

HTTP Basic Authentication

Basic Auth의 Authorization 헤더는 Basic <base64> 형식입니다. 예를 들어 admin:passwordYWRtaW46cGFzc3dvcmQ= 로 인코딩됩니다. 따라서 Basic Auth는 반드시 HTTPS 위에서만 사용해야 합니다—헤더를 보는 사람은 즉시 디코딩할 수 있기 때문입니다.

이메일 첨부 파일 (MIME)

이메일 프로토콜은 ASCII 텍스트 전송을 전제로 설계되었습니다. PDF, 이미지, 압축 파일 등 이진 첨부 파일은 MIME multipart 형식 안에서 Base64로 인코딩되어 본문에 포함됩니다. 그래서 이메일 자체가 실제 첨부 파일보다 크게 보이는 것입니다.

Data URI

이미지를 별도 파일 요청 없이 HTML이나 CSS에 직접 삽입할 수 있습니다:

<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA...">

작은 아이콘이나 SVG를 HTTP 라운드 트립 없이 전달할 때 유용합니다.

API 페이로드

일부 API는 바이너리 데이터를 별도 업로드가 아닌 JSON 문자열 필드로 전송하기 위해 Base64를 사용합니다(이미지, 오디오 등).

언어별 예시

JavaScript (브라우저)

btoa("hello")          // → "aGVsbG8="
atob("aGVsbG8=")       // → "hello"

JavaScript (Node.js)

Buffer.from("hello").toString("base64")      // 인코드
Buffer.from("aGVsbG8=", "base64").toString() // 디코드

Python

import base64
base64.b64encode(b"hello")          # → b'aGVsbG8='
base64.b64decode("aGVsbG8=")        # → b'hello'

PHP

base64_encode("hello");             // "aGVsbG8="
base64_decode("aGVsbG8=");          // "hello"

Command line

echo -n "hello" | base64            # 인코드
echo "aGVsbG8=" | base64 --decode   # 디코드

표준 Base64는 +/를 사용하지만, 이 문자들은 URL에서 특별한 의미를 가집니다. URL에 포함되는 토큰(OAuth 코드, URL 파라미터의 JWT, 서명된 URL 등)에는 +-로, /_로 바꾸는 URL‑safe Base64를 사용해야 합니다.

대부분의 언어는 URL‑safe Base64 전용 함수를 제공합니다:

  • Python: base64.urlsafe_b64encode()
  • Ruby: Base64.urlsafe_encode64()
  • Go: base64.URLEncoding

Base64가 아닌 것들

  • 암호화가 아니다. Base64는 쉽게 복원할 수 있는 인코딩이며, 암호화가 아닙니다. 민감한 데이터를 “숨기기” 위해 절대 사용하지 마세요. 대신 AES‑256 같은 적절한 암호화 라이브러리를 사용하세요.
  • 압축이 아니다. Base64 출력은 입력보다 33% 정도 더 커집니다. 데이터를 압축하는 것이 아니라 오히려 부피가 늘어납니다.
  • 해시가 아니다. SHA‑256이나 bcrypt와 달리 Base64는 가역적이며, 일방향 다이제스트나 비밀번호 저장에 적합하지 않습니다.

한 번만 인코딩·디코딩하면 되는 경우—예: JWT를 붙여넣어 페이로드를 확인하거나, API 헤더용 자격 증명을 인코딩하거나, 이미지를 data URI로 변환할 때—SnappyTools Base64 Encoder / Decoder를 사용하면 브라우저 내에서 처리되며 서버로 데이터가 전송되지 않습니다.

Base64는 텍스트 전용 채널을 통해 이진 데이터를 안전하게 전달하기 위한 간단하고 잘 정의된 도구입니다. 언제 사용하고 언제 사용하면 안 되는지를 아는 것은 웹 API와 데이터 포맷을 다룰 때 기본적인 역량이라 할 수 있습니다.

0 조회
Back to Blog

관련 글

더 보기 »

Eidentic 소개

Today we're releasing Eidentic, an open-source TypeScript SDK for building AI agents with self-improving memory and the production fundamentals built in — not b...

Typescript의 타입

Introdução Tipos são uma forma de definir a “forma” ou o contrato dos dados que estamos usando no código. Pensando em Javascript puro, ele é dinâmico: você pode...