Base64 인코딩이란? 개발자를 위한 시각적 가이드

발행: (2026년 2월 5일 오후 10:12 GMT+9)
7 min read
원문: Dev.to

Source: Dev.to

Base64란?

Base64는 바이너리를 텍스트로 변환하는 인코딩 방식입니다. 이미지, 파일, 텍스트 등 모든 바이너리 데이터를 받아서 64개의 “안전한” ASCII 문자만을 사용해 표현합니다:

A‑Z (26) + a‑z (26) + 0‑9 (10) + '+' + '/' = 64 characters

패딩을 위해 = 를 사용합니다.

그게 전부입니다. 전체 알파벳은 텍스트만 안전하게 처리하는 시스템—이메일, URL, JSON, XML, HTML—을 통해 전송될 수 있도록 설계되었습니다.

Base64가 존재하는 이유는?

초기 인터넷 시절에는 많은 시스템이 7‑bit ASCII 텍스트만 처리할 수 있었습니다. 바이너리 데이터(이미지, 실행 파일, 비영어 문자)는 일반 텍스트용으로 설계된 이메일 서버, 게이트웨이 및 프로토콜을 통해 전송될 때 손상되었습니다.

트레이드‑오프? 인코딩된 출력은 원본 데이터보다 약 33 % 더 커집니다.

수학: 입력 3바이트마다 4개의 Base64 문자

3 × 8 = 24 bits → 4 × 6 = 24 bits

Source:

Base64 인코딩 작동 방식 (단계별)

문자열 "Hi" 를 Base64 로 인코딩해 보겠습니다.

Step 1: 바이너리로 변환

H = 72  → 01001000
i = 105 → 01101001

Step 2: 모든 비트를 이어 붙이기

01001000 01101001

Step 3: 6비트 그룹으로 나누기

010010 | 000110 | 1001XX

(마지막 그룹을 6비트로 맞추기 위해 0으로 채웁니다: 100100)

Step 4: 각 6비트 그룹을 Base64 알파벳에 매핑

010010 = 18 → S
000110 = 6  → G
100100 = 36 → k

Step 5: 패딩 추가

입력이 2바이트(3으로 나누어 떨어지지 않음)였으므로 = 패딩을 하나 추가합니다.

결과: SGk=

직접 확인해 보세요 →

Source:

Base64를 실제로 볼 수 있는 경우

  1. Data URIs – 별도의 HTTP 요청 없이 작은 이미지를 HTML/CSS에 직접 삽입합니다.

    <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA...">
  2. JWT 토큰 – 점(.)으로 구분된 세 개의 Base64url‑인코딩된 JSON 객체.

    eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIn0.dozjgNryP4J3jVmNHl0w5N_XgL0n3I9PlFUP0THsR8U
  3. 이메일 첨부 파일 (MIME) – 모든 첨부 파일은 텍스트 기반 이메일에 바이너리 파일을 포함하기 위해 Base64‑인코딩됩니다.

  4. API 응답 – 바이너리 데이터(예: PDF, 이미지, 인증서)가 JSON 내에서 Base64 문자열로 반환되는 경우가 많습니다.

    {
      "file": "UGFzc3dvcmQxMjM=",
      "encoding": "base64"
    }
  5. Basic HTTP 인증username:password를 인코딩합니다.

    Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=

Base64는 암호화가 아닙니다

가장 흔한 오해는 Base64가 보안을 제공한다는 것입니다. 이것은 인코딩이며, 암호화가 아닙니다.

인코딩암호화
데이터를 다른 형식으로 변환 (누구든지 되돌릴 수 있음)키를 사용해 데이터를 보호 (키가 있어야만 되돌릴 수 있음)

Base64는 전혀 보안을 제공하지 않습니다. 누구든지 즉시 디코드할 수 있습니다. 민감한 데이터를 “숨기기” 위해 절대 사용하지 마세요.

# "Hiding" a password in Base64
echo -n 'MySecretPassword' | base64
# TXlTZWNyZXRQYXNzd29yZA==

# "Unhiding" it
echo 'TXlTZWNyZXRQYXNzd29yZA==' | base64 -d
# MySecretPassword

Base64 vs. Base64url

표준 Base64는 +/를 사용하지만, 이는 URL에서 문제가 될 수 있습니다. Base64url는 이를 대체합니다:

표준URL‑안전
+-
/_
= (패딩)종종 생략됨

JWT 토큰은 Base64url을 사용하며, 인코딩된 데이터를 쿼리 매개변수에 넣는 많은 API도 마찬가지입니다.

일반적인 Base64 작업

JavaScript (Browser)

// Encode
const encoded = btoa('Hello, World!'); // SGVsbG8sIFdvcmxkIQ==

// Decode
const decoded = atob('SGVsbG8sIFdvcmxkIQ=='); // Hello, World!

⚠️ btoa()atob()는 ASCII만 처리합니다. 유니코드의 경우:

// Encode Unicode
const encoded = btoa(unescape(encodeURIComponent('Hello 🌍')));

// Decode Unicode
const decoded = decodeURIComponent(escape(atob(encoded)));

Node.js

// Encode
const encoded = Buffer.from('Hello').toString('base64');

// Decode
const decoded = Buffer.from('SGVsbG8=', 'base64').toString('utf8');

Python

import base64

# Encode
b64 = base64.b64encode(b'Hello').decode()
# 'SGVsbG8='

# Decode
txt = base64.b64decode('SGVsbG8=').decode()
# 'Hello'

Command Line

# Encode a string
echo -n 'Hello' | base64

# Decode a string
echo 'SGVsbG8=' | base64 -d

# Encode a file
base64 image.png > image.b64

# Decode a file
base64 -d image.b64 > image.png

Base64를 언제 사용해야 할까

✅ 사용해야 할 경우:

  • 텍스트 기반 포맷(JSON, XML, HTML)에 바이너리 데이터를 삽입할 때
  • 텍스트 전용 프로토콜을 통해 파일을 전송할 때
  • 작은 이미지(< 10 KB)의 데이터 URI를 만들 때
  • Base64 입력을 기대하는 API와 작업할 때

❌ 사용하면 안 되는 경우:

  • 보안을 제공한다고 생각할 때(실제는 그렇지 않음)
  • 파일이 클 때(33 % 크기 증가가 누적됨)
  • 원시 바이너리 데이터를 직접 보낼 수 있을 때(예: multipart/form‑data 사용)
  • 데이터를 압축하려고 할 때(오히려 커짐)

직접 해보기

무료 Base64 인코더/디코더를 base64decode.co 에서 만들었습니다 — 텍스트를 붙여넣거나 파일을 업로드하면 즉시 결과를 얻을 수 있습니다. 회원가입 필요 없고, 추적도 없으며, 전적으로 브라우저에서 실행됩니다.

일상적인 개발 작업을 위해 만든 11개의 무료 개발자 도구 모음의 일부입니다.

Base64를 가장 많이 사용하는 경우는 무엇인가요? 댓글에 남겨 주세요 — JWT, 데이터 URI, 혹은 제가 생각하지 못한 다른 용도인지 궁금합니다.

Back to Blog

관련 글

더 보기 »

JWT란 무엇인가?

JWT가 무엇인가요? JWT(JSON Web Token)는 사용자가 로그인한 후 백엔드가 생성하는 작은 디지털 키와 같은 토큰입니다. 서버에 “예, 이 사용자는 이미 …” 라고 알려줍니다.