에듀테크 프로젝트 대시보드
Base64 인코딩
이메일 첨부파일, data: URL, JWT, HTTP Basic 인증 헤더에서 늘 보이는 그 문자열.
Base64는 임의의 바이너리 데이터를 영문/숫자 64가지 문자(A–Z a–z 0–9 + /)만으로
표현하는 방법이다. 텍스트만 안전하게 지나가는 통로로 사진·파일을 흘려보내기 위한 인코딩이지
암호화가 아니다 — 아래 표만 알면 누구나 되돌릴 수 있다.
1바이트는 8비트, Base64 문자 하나는 6비트(26 = 64가지)를 담는다. 8과 6의 최소공배수는 24 → 3바이트(24비트)를 6비트씩 4조각으로 잘라 각 조각을 알파벳 표의 인덱스로 바꾸면 4글자가 나온다. 데이터 크기는 항상 4/3배(약 +33%)로 늘어난다.
파랑 = 원본 바이트값 · 회색 = 8비트 이진수 · 보라 = 6비트로 다시 자른 조각 · 빨강 = 그 조각의 10진 인덱스 · 초록 = 알파벳 표에서 뽑은 최종 문자. 남는 비트가 모자라면 0으로 채우고, 부족한 출력 자리는 = 패딩으로 메운다.
0–25 = A–Z, 26–51 = a–z,
52–61 = 0–9, 62 = +, 63 = /.
URL·파일명에서 문제되는 + / 대신 - _ 를 쓰는 변형이 base64url(JWT가 사용).
딱 맞게 4글자씩 떨어진다. 패딩 없음. 예: "Man" → TWFu.
8비트 → 6비트 2개(+0채움) → 뒤 2자리를 == 로. 예: "M" → TQ==.
16비트 → 6비트 3개(+0채움) → 뒤 1자리를 = 로. 예: "Ma" → TWE=.
디코더가 = 개수를 보고 "마지막 그룹은 원래 1바이트였다 / 2바이트였다"를 복원한다.
# 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 바이트로 바꾼 뒤 넘겨야 한다. 위 데모도 같은 방식으로 동작한다.
<img src="data:image/png;base64,iVBOR..."> — 작은 이미지를 HTML/CSS에 인라인.
헤더.페이로드.서명 세 조각이 각각 base64url. 페이로드는 누구나 디코드 가능(서명만 검증용).
Authorization: Basic dXNlcjpwdw== = base64("user:pw"). HTTPS 없으면 그대로 노출.
SMTP는 7비트 텍스트 기반 → 첨부파일을 base64로 감싸 전송. 76자마다 줄바꿈.