텍스트를 Base64로 인코딩하는 방법
- 입력 · 텍스트 상자에 텍스트를 입력하거나 붙여넣으세요. 페이지를 열면 예시가 들어 있으니, 빈 상태에서 시작하려면 지우기를 누르세요.
- 입력하는 동안 출력 · Base64에 Base64가 나타납니다. 입력이 아주 크다면 실시간을 해제하고 실행을 누르세요.
- 받는 쪽 시스템이 요구하는 옵션을 설정하세요: URL-safe (- _), 패딩 없음 (=), 줄 바꿈, 문자 인코딩. 기본값(표준 알파벳, 패딩 포함, 한 줄, UTF-8)은 대부분의 API에 맞습니다.
- 출력 복사를 누르거나, 다운로드로 결과를
base64.txt로 저장하세요. - 왕복 변환을 확인하려면 바꾸기를 누르세요. Base64를 입력란으로 옮기고 도구를 디코딩 모드로 바꿉니다.
버튼 아래에는 입력 크기(바이트), 출력 크기, 증가 비율이 표시되므로 필드에 길이 제한이 있을 때 유용합니다.
Base64 인코딩의 작동 원리
Base64는 바이트를 다루므로 첫 단계는 문자 인코딩(따로 고르지 않으면 UTF-8)으로 텍스트를 바이트로 바꾸는 것입니다. 인코더는 바이트를 3개씩, 즉 24비트씩 묶어 6비트 숫자 4개로 나누고, 각 숫자를 64개 문자로 된 알파벳 A–Z, a–z, 0–9, +, / 중 한 글자로 씁니다.
대표적인 예는 텍스트 Man입니다. 바이트 4D 61 6E가 TWFu가 됩니다. 마지막 묶음이 1바이트나 2바이트뿐이면 출력 끝을 =로 채웁니다. Ma는 TWE=, M은 TQ==가 됩니다. 전체 과정은 Base64의 작동 원리에서, =를 생략해도 되는 경우는 패딩 설명에서 다룹니다.
n바이트의 출력 길이는 항상 4 × ⌈n / 3⌉문자로, 입력보다 약 33% 깁니다. Base64 크기 계산기가 어떤 크기든 이 계산을 해 주고, Base64 크기 오버헤드는 이 차이가 언제 문제가 되는지 설명합니다. Base64는 누구나 되돌릴 수 있어서 아무것도 숨기지 못합니다. 비밀 값을 넣기 전에 인코딩과 암호화의 차이를 읽어 보세요.
인코딩 옵션
| 옵션 | 바뀌는 점 | 사용하는 경우 |
|---|---|---|
| URL-safe (- _) | +가 -로, /가 _로 바뀜(RFC 4648 5절) | URL, 쿼리 문자열, 파일 이름, 쿠키, JWT. Base64URL 인코더는 기본으로 켜져 있음 |
| 패딩 없음 (=) | 끝의 = 문자를 제거 | JWT와 대부분의 URL-safe 형식, 어차피 =를 지워 버리는 모든 곳 |
| 줄 바꿈: 76 (MIME, LF 또는 CRLF) | 76자마다 줄 바꿈 삽입 | 이메일 본문과 첨부 파일(MIME 인코더) |
| 줄 바꿈: 64 (PEM) | 64자마다 줄 바꿈 삽입 | -----BEGIN과 -----END 줄 사이의 인증서와 키 |
| 문자 인코딩 | 인코딩 전에 각 문자가 어떤 바이트가 되는지 | 받는 쪽이 UTF-16, EUC-KR, Windows-1251, Shift_JIS 같은 레거시 인코딩을 기대하지 않는 한 UTF-8 |
유니코드, 이모지, URL-safe 출력 예시
아래 값은 모두 Python의 base64 모듈로 만든 것이며 이 도구의 출력과 같습니다.
| 입력 | 설정 | Base64 |
|---|---|---|
Hello | UTF-8 | SGVsbG8= |
Hello, world! | UTF-8 | SGVsbG8sIHdvcmxkIQ== |
café | UTF-8 | Y2Fmw6k= |
café | ISO-8859-1 | Y2Fm6Q== |
€ | UTF-8 | 4oKs |
€ | Windows-1252 | gA== |
👋 | UTF-8 | 8J+Riw== |
👋 | UTF-8, URL-safe, 패딩 없음 | 8J-Riw |
Привет | UTF-8 | 0J/RgNC40LLQtdGC |
Привет | Windows-1251 | z/Do4uXy |
같은 단어라도 문자 인코딩이 다르면 바이트가 달라서 Base64도 달라집니다. é는 UTF-8에서 2바이트(C3 A9), Latin-1에서 1바이트(E9)입니다. 손 흔드는 이모지는 UTF-8로 4바이트이므로 단독으로 인코딩하면 8문자가 되고, 그중 2개가 패딩입니다.
문자 인코딩과 표현할 수 없는 문자
UTF-8은 모든 유니코드 문자를 표현할 수 있어서 잃는 것이 없습니다. 목록의 나머지 26개 문자 인코딩(UTF-16LE/BE, UTF-32LE, ASCII, ISO-8859와 Windows 코드 페이지, KOI8-R/U, CP866, Shift_JIS, EUC-JP, GBK, Big5, EUC-KR)은 그것을 요구하는 시스템을 위해 있습니다. 선택한 문자 인코딩에 없는 문자가 텍스트에 있으면 ?로 바뀌고, 몇 문자가 바뀌었는지 경고가 표시됩니다. 예를 들어 ISO-8859-1에서 €는 Pw==로 인코딩되는데, 이는 물음표 하나일 뿐입니다.
Windows와 .NET 문자열, PowerShell에는 UTF-16LE를 고르세요. 이유는 UTF-16을 Base64로 페이지에서 설명합니다. 7비트 텍스트 밖의 문자를 모두 거부해야 하는 시스템에는 ASCII를 고르세요(ASCII를 Base64로).
줄 바꿈
일반 Base64는 긴 한 줄이며, JSON, HTTP 헤더, URL, 환경 변수에는 이 형태가 필요합니다. 이메일은 76자 줄(RFC 2045)을, PEM 파일은 64자 줄을 씁니다. 줄 바꿈 옵션은 그 너비마다 \n을 넣으며, 76 (MIME, CRLF) 에서는 CRLF를 넣습니다. 이 사이트의 디코더를 비롯한 디코더는 줄 바꿈을 건너뛰므로, 줄 바꿈한 출력도 같은 바이트로 디코딩됩니다. MIME 규칙은 이메일 속 Base64에서 다룹니다.
자주 하는 인코딩 실수
- 끝에 줄 바꿈이 끼어듭니다.
echo Hello | base64는echo가\n을 붙이기 때문에SGVsbG8K를 출력합니다. 텍스트Hello만 인코딩하면SGVsbG8=입니다.printf '%s'를 쓰고, 여기에 붙여넣을 때는 입력 바이트 수가 예상과 같은지 확인하세요. btoa()가 유니코드에서 예외를 던집니다. 브라우저에서btoa("Grüße 👋")는InvalidCharacterError를 일으킵니다.btoa는 Latin-1 문자만 받기 때문입니다. 아래 코드처럼 먼저 UTF-8 바이트로 바꾸세요.- 받는 쪽이 다른 문자 인코딩을 씁니다. UTF-8로 인코딩했는데 상대가 Latin-1로 디코딩하면
café가café로 깨집니다. 한글을 EUC-KR로 읽어도 마찬가지로 깨집니다. 문자 인코딩을 맞추거나, 여기서 받는 쪽의 문자 인코딩을 고르세요. - 두 번 인코딩합니다.
SGVsbG8=의 Base64는U0dWc2JHOD0=입니다. 값을 디코딩했는데 또 Base64가 나온다면 파이프라인 어딘가에서 한 번 더 인코딩한 것입니다. +와/가 URL을 망가뜨립니다. 쿼리 문자열에서+는 공백으로 읽힙니다. URL-safe 옵션이나 Base64URL 인코더를 쓰거나, 값을 퍼센트 인코딩하세요.
JavaScript, Python, 명령줄에서 Base64 인코딩
브라우저 JavaScript에서는 TextEncoder로 문자열을 UTF-8 바이트로 바꾼 뒤 바이트를 인코딩합니다. 최신 브라우저에서는 bytes.toBase64()를 바로 호출할 수 있습니다(Uint8Array.toBase64).
const bytes = new TextEncoder().encode("Grüße 👋");
let bin = "";
for (const b of bytes) bin += String.fromCharCode(b);
btoa(bin); // "R3LDvMOfZSDwn5GL"
// Node.js
Buffer.from("Grüße 👋", "utf8").toString("base64"); // "R3LDvMOfZSDwn5GL"
Buffer.from("👋", "utf8").toString("base64url"); // "8J-Riw"
Python의 b64encode는 바이트를 받아 바이트를 돌려줍니다.
import base64
base64.b64encode("Grüße 👋".encode("utf-8")).decode("ascii")
# 'R3LDvMOfZSDwn5GL'
base64.urlsafe_b64encode("👋".encode()).rstrip(b"=").decode()
# '8J-Riw'
Linux와 macOS에서는 base64 명령이 표준 입력을 인코딩합니다.
printf '%s' 'Grüße 👋' | base64
base64 -w 0 file.bin > file.b64
첫 번째 명령은 R3LDvMOfZSDwn5GL을 출력합니다. Linux의 GNU base64는 기본으로 76열에서 출력을 줄 바꿈하며 -w 0으로 끌 수 있습니다. macOS 버전은 따로 지정하지 않으면 줄 바꿈하지 않습니다. 다른 언어와 예외 상황은 JavaScript의 Base64, Node.js, Python, PHP에서 볼 수 있습니다.
이미지, PDF 등 모든 파일은 파일 인코더에서 처리하며 data URI와 JSON 출력도 지원합니다.
자주 묻는 질문
문자열을 Base64로 인코딩하려면 어떻게 하나요?
위 입력란에 문자열을 붙여넣고 출력란에서 결과를 복사하세요. 코드에서는 문자열을 UTF-8 바이트로 바꾼 뒤 그 바이트를 인코딩합니다. Python은 base64.b64encode(s.encode()), Node.js는 Buffer.from(s).toString("base64")입니다.
Base64 끝에 =나 ==가 붙는 이유는 무엇인가요?
Base64는 3바이트 단위로 동작합니다. 입력 길이가 3의 배수가 아니면 마지막 블록이 모자라고, =가 빠진 바이트를 표시합니다. 남은 바이트가 2개면 = 하나, 1개면 ==입니다. 자세한 내용은 패딩 설명에 있습니다.
같은 텍스트인데 다른 곳에서 인코딩하면 Base64가 달라지는 이유는 무엇인가요?
대개 바이트에 눈에 보이지 않는 차이가 있습니다. 끝의 줄 바꿈(echo가 하나 붙임), 다른 문자 인코딩(UTF-8, Latin-1, UTF-16, EUC-KR 등), 유니코드 정규화가 원인입니다. 도구 아래에 표시되는 입력 바이트 수를 비교해 보세요.
Base64 인코딩으로 비밀번호를 숨길 수 있나요?
아닙니다. Base64에는 키가 없어서 누구나 1초 만에 디코딩할 수 있습니다. 데이터 전송에만 쓰고, 보호가 필요하면 실제 암호화나 해시를 사용하세요. 인코딩과 암호화의 차이를 참고하세요.
Base64로 인코딩하면 텍스트가 얼마나 커지나요?
3바이트가 4문자가 되므로 출력은 약 33% 커지고, 줄 바꿈을 넣으면 그만큼 더 늘어납니다. UTF-8 100바이트는 136문자가 됩니다.