한양과학기술고등학교

에듀테크 프로젝트 대시보드

Base64 인코딩

Base64 인코딩

이메일 첨부파일, data: URL, JWT, HTTP Basic 인증 헤더에서 늘 보이는 그 문자열. Base64는 임의의 바이너리 데이터를 영문/숫자 64가지 문자(A–Z a–z 0–9 + /)만으로 표현하는 방법이다. 텍스트만 안전하게 지나가는 통로로 사진·파일을 흘려보내기 위한 인코딩이지 암호화가 아니다 — 아래 표만 알면 누구나 되돌릴 수 있다.

1. 핵심: 8비트 3개 → 6비트 4개

1바이트는 8비트, Base64 문자 하나는 6비트(26 = 64가지)를 담는다. 8과 6의 최소공배수는 24 → 3바이트(24비트)를 6비트씩 4조각으로 잘라 각 조각을 알파벳 표의 인덱스로 바꾸면 4글자가 나온다. 데이터 크기는 항상 4/3배(약 +33%)로 늘어난다.

2. 직접 인코딩해 보기

파랑 = 원본 바이트값 · 회색 = 8비트 이진수 · 보라 = 6비트로 다시 자른 조각 · 빨강 = 그 조각의 10진 인덱스 · 초록 = 알파벳 표에서 뽑은 최종 문자. 남는 비트가 모자라면 0으로 채우고, 부족한 출력 자리는 = 패딩으로 메운다.

3. Base64 알파벳 (인덱스 → 문자)

0–25 = A–Z, 26–51 = a–z, 52–61 = 0–9, 62 = +, 63 = /. URL·파일명에서 문제되는 + / 대신 - _ 를 쓰는 변형이 base64url(JWT가 사용).

4. 패딩(=) — 남은 바이트 수를 알려주는 표시

3n 바이트

딱 맞게 4글자씩 떨어진다. 패딩 없음. 예: "Man" → TWFu.

3n+1 바이트

8비트 → 6비트 2개(+0채움) → 뒤 2자리를 == 로. 예: "M" → TQ==.

3n+2 바이트

16비트 → 6비트 3개(+0채움) → 뒤 1자리를 = 로. 예: "Ma" → TWE=.

왜 필요한가

디코더가 = 개수를 보고 "마지막 그룹은 원래 1바이트였다 / 2바이트였다"를 복원한다.

5. 파이썬 / 자바스크립트

# Python — 표준 라이브러리
import base64
base64.b64encode(b"Man")        # b'TWFu'
base64.b64decode(b"TWFu")        # b'Man'
base64.urlsafe_b64encode(b"\xff\xfe")  # b'__4=' (+ / 대신 - _)

# 원리 그대로 구현
def encode(data):
    A = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
    out = ""
    for i in range(0, len(data), 3):
        chunk = data[i:i+3]
        n = int.from_bytes(chunk + b"\x00"*(3-len(chunk)), "big")
        for s in (18, 12, 6, 0):
            out += A[(n >> s) & 0x3F]
        pad = 3 - len(chunk)
        if pad:
            out = out[:-pad] + "="*pad
    return out

// JavaScript (브라우저)
btoa("Man")                    // "TWFu"  ※ Latin-1만 안전
atob("TWFu")                   // "Man"
// UTF-8 안전:
btoa(String.fromCharCode(...new TextEncoder().encode("한글")))

브라우저 btoa는 0–255 범위 문자만 받으므로, 한글 같은 멀티바이트는 TextEncoder로 먼저 UTF-8 바이트로 바꾼 뒤 넘겨야 한다. 위 데모도 같은 방식으로 동작한다.

6. 실제 사용처

data: URL

<img src="data:image/png;base64,iVBOR..."> — 작은 이미지를 HTML/CSS에 인라인.

JWT

헤더.페이로드.서명 세 조각이 각각 base64url. 페이로드는 누구나 디코드 가능(서명만 검증용).

HTTP Basic 인증

Authorization: Basic dXNlcjpwdw== = base64("user:pw"). HTTPS 없으면 그대로 노출.

이메일(MIME)

SMTP는 7비트 텍스트 기반 → 첨부파일을 base64로 감싸 전송. 76자마다 줄바꿈.