Base64는 3바이트를 4글자로 바꿉니다
Base64 인코딩은 데이터를 바이트 3개(24비트)씩 묶고 6비트씩 넷으로 나눈 뒤, 0~63 번호를 A~Z, a~z, 0~9, +, / 64글자 가운데 하나로 적는 방식입니다. 그래서 바이트 3개는 언제나 글자 4개가 되고, 결과는 원본보다 약 33% 길어집니다. 한글은 먼저 UTF-8 바이트로 바뀌므로 '안녕하세요 👋'는 20바이트이고, Base64로는 끝에 = 하나가 붙은 28자 7JWI64WV7ZWY7IS47JqUIPCfkYs=가 됩니다. Base64는 암호화가 아니라서 누구나 그대로 되돌릴 수 있습니다.
위 도구는 원문 칸과 Base64 칸을 모두 고칠 수 있습니다. 원문을 고치면 인코딩하고, Base64 칸에 값을 붙여 넣으면 디코딩합니다. Authorization: Basic 헤더, 메일 제목의 =?EUC-KR?B?…?=, data: 주소, PEM 인증서, PowerShell -EncodedCommand처럼 포장된 값도 그대로 붙여 넣으면 포장을 벗겨 읽습니다. UTF-8로 읽히지 않는 바이트는 EUC-KR·UTF-16 같은 다른 인코딩이나 PNG·PDF 같은 파일로 가려냅니다. 판독 경로에는 변환 단계가, 묶음 레일과 돋보기에는 3바이트가 4글자로 바뀌는 자리가 나옵니다.
Base64를 직접 풀거나 만들어야 하는 상황
- HTTP Basic 인증 헤더를 확인할 때: RFC 7617은 아이디와 콜론(:), 비밀번호를 이어 붙인 뒤 Base64로 인코딩해
Authorization: Basic뒤에 보내도록 정합니다. 예를 들어admin:1234는YWRtaW46MTIzNA==입니다. 반대로 말하면 이 헤더를 본 사람은 누구나 비밀번호를 읽을 수 있으므로, Basic 인증은 HTTPS 위에서만 써야 합니다. - 메일 제목이 =?EUC-KR?B?…?=처럼 보일 때: 메일 머리글에는 ASCII 글자만 쓰기 때문에 한글 제목은 RFC 2047의 encoded-word로 적힙니다. 물음표 사이의 EUC-KR이나 UTF-8은 글자 인코딩이고, B는 Base64라는 표시입니다. 머리글 값을 통째로 붙여 넣으면 적힌 인코딩으로 풀어 줍니다.
- 설정 값이나 Kubernetes Secret을 읽을 때: Kubernetes Secret의 data 필드 값은 Base64로 인코딩한 문자열이어야 하고, 인코딩하고 싶지 않으면 stringData 필드를 씁니다. 꺼낸 값이 무엇인지 확인하거나 새 값을 넣을 Base64를 만들 때 씁니다.
- JSON에 이미지·PDF 같은 파일을 담을 때: 글만 받는 형식에 파일 바이트를 넣을 때 Base64가 흔히 쓰입니다. Base64 칸에 붙여 넣은 값이 글이 아니면 이 도구는 형식과 크기를 보여 주고 파일로 저장하게 합니다.
- JWT 내용을 볼 때: JWT를 점(.)으로 나눈 각 부분은 URL-safe 글자를 쓰고 끝의 =를 뺀 Base64url(RFC 7515)입니다. 헤더와 페이로드는 여기서도 풀리지만 서명은 확인하지 않습니다.
- PowerShell -EncodedCommand 값을 만들거나 확인할 때: PowerShell 설명서는 이 값이 UTF-16LE로 인코딩한 문자열의 Base64여야 한다고 적습니다. 같은
Get-Date라도 UTF-8로는R2V0LURhdGU=, UTF-16LE로는RwBlAHQALQBEAGEAdABlAA==로 전혀 다릅니다. - 인증서·키 파일(PEM)을 다룰 때:
-----BEGIN CERTIFICATE-----사이의 본문은 Base64이고, RFC 7468에 따라 한 줄을 64자로 감쌉니다. 본문을 풀면 DER 형식의 바이트가 나옵니다.
쓰는 법
- 인코딩: 원문 칸에 글을 넣거나, '파일 넣기'로 파일을 고릅니다. 원문 칸에 파일을 끌어다 놓거나 붙여 넣어도 됩니다. Base64 칸에 바로 결과가 나옵니다.
- 디코딩: Base64 칸에 값을 붙여 넣습니다. 앞뒤에 따옴표나 헤더 이름이 붙어 있어도 됩니다. 원문 칸에 글이 나오고, 글이 아니면 형식과 크기를 적은 파일 카드가 나옵니다.
- 모양 고르기: 조절판에서 표준(+ /)과 URL-safe(- _), = 붙임과 생략, 한 줄·76자·64자 줄 나눔을 고릅니다. 붙여 넣은 값의 모양은 조절판에 그대로 옮겨지므로, 풀어 낸 글을 고쳐도 같은 모양으로 다시 만들어집니다.
- 글자 인코딩: 기본값은 자동 판별입니다. 풀어 낸 글이 이상하면 UTF-8, UTF-16LE, EUC-KR 같은 인코딩을 직접 고릅니다. 한 줄에 값 하나씩 여러 값이 들어 있으면 '줄마다 따로'를 켭니다.
- 확인: 판독 경로에서 벗긴 포장, 무시한 공백, 보충한 패딩을 확인합니다. 레일의 묶음을 누르면 돋보기에 그 묶음의 비트가 나옵니다. 다른 도구와 결과가 다르면 '같은 글, 다른 Base64' 목록에서 원인을 찾고, 줄을 누르면 그 값을 복사합니다.
3바이트가 4글자가 되는 규칙
'안'의 UTF-8 바이트 EC 95 88을 예로 들어 보겠습니다. 세 바이트를 이으면 24비트가 되고, 이것을 6비트씩 끊으면 0~63 사이 번호가 넷 나옵니다. 번호를 아래 글자표에서 찾아 적으면 7JWI가 됩니다.
| 단계 | 첫째 바이트 | 둘째 바이트 | 셋째 바이트 |
|---|---|---|---|
| 바이트 | EC | 95 | 88 |
| 8비트씩 | 11101100 | 10010101 | 10001000 |
| 6비트씩 | 111011 · 001001 · 010110 · 001000 | ||
| 번호 | 59 · 9 · 22 · 8 | ||
| 글자 | 7 · J · W · I | ||
데이터 끝이 3바이트로 나누어떨어지지 않으면 남는 비트를 0으로 채워 글자를 만들고, 빈 자리는 =로 적습니다. 바이트가 1개 남으면 글자 2개와 ==, 2개 남으면 글자 3개와 =가 붙습니다. RFC 4648은 인코더가 채우는 비트를 0으로 두도록 정하고, 0이 아닌 값은 디코더가 거부할 수 있다고 적습니다.
| 원문 | 바이트 | Base64 | = 생략 |
|---|---|---|---|
| Man | 3 | TWFu | TWFu |
| Ma | 2 | TWE= | TWE |
| M | 1 | TQ== | TQ |
| 😀 | 4 | 8J+YgA== | 8J+YgA |
| +0 | +1 | +2 | +3 | +4 | +5 | +6 | +7 | |
|---|---|---|---|---|---|---|---|---|
| 0 | A | B | C | D | E | F | G | H |
| 8 | I | J | K | L | M | N | O | P |
| 16 | Q | R | S | T | U | V | W | X |
| 24 | Y | Z | a | b | c | d | e | f |
| 32 | g | h | i | j | k | l | m | n |
| 40 | o | p | q | r | s | t | u | v |
| 48 | w | x | y | z | 0 | 1 | 2 | 3 |
| 56 | 4 | 5 | 6 | 7 | 8 | 9 | + / - | / / _ |
Base64 길이 계산
패딩을 붙이면 Base64 길이는 4 × ⌈n ÷ 3⌉(n = 바이트 수)이고, 패딩을 생략하면 ⌈4n ÷ 3⌉입니다. 길이를 정하는 것은 글자 수가 아니라 바이트 수입니다. 한글 음절은 UTF-8에서 한 글자가 3바이트라서, 같은 글자 수라면 영문보다 Base64가 세 배쯤 깁니다. 메일처럼 76자마다 CRLF 줄바꿈을 넣으면 줄마다 2글자가 더 붙습니다.
| 원본 | 바이트 | = 붙임 | = 생략 | 76자 줄 나눔(CRLF) | 늘어난 비율 |
|---|---|---|---|---|---|
| Hello | 5 | 8 | 7 | 8 | 60% |
| 안녕하세요 👋 | 20 | 28 | 27 | 28 | 40% |
| 100바이트 | 100 | 136 | 134 | 138 | 36% |
| 1 KiB | 1,024 | 1,368 | 1,366 | 1,402 | 33.6% |
| 1 MiB | 1,048,576 | 1,398,104 | 1,398,102 | 1,434,896 | 33.3% |
| 5 MiB(파일 상한) | 5,242,880 | 6,990,508 | 6,990,507 | 7,174,468 | 33.3% |
표준·URL-safe·MIME·PEM은 무엇이 다른가
이름은 달라도 3바이트를 4글자로 바꾸는 계산은 같습니다. 차이는 62·63번 글자, 끝의 =, 줄 나눔 세 가지뿐입니다.
| 형식 | 62·63번 | 끝 = | 줄 나눔 | 주로 쓰는 곳 | 근거 |
|---|---|---|---|---|---|
| 표준 | + / | 붙임 | 없음 | 일반 데이터, data: 주소, Basic 인증 | RFC 4648 4절 |
| URL-safe | - _ | 붙이거나 생략 | 없음 | 주소·파일 이름에 넣는 값 | RFC 4648 5절 |
| JWT(Base64url) | - _ | 생략 | 없음 | JWT·JWS의 세 부분 | RFC 7515 2절 |
| MIME(메일) | + / | 붙임 | 한 줄 76자 이하 | 메일 본문·첨부 파일 | RFC 2045 6.8절 |
| PEM | + / | 붙임 | 한 줄 64자(마지막 줄 제외) | 인증서·키 파일 | RFC 7468 2절 |
| GNU base64 명령 | + / | 붙임 | 기본 76자, -w 0이면 한 줄 | 리눅스 명령줄 | coreutils 설명서 |
디코딩 규칙도 조금씩 다릅니다. RFC 4648은 알파벳 밖 글자가 섞이면 거부하라고 정하지만, 메일용 RFC 2045는 줄바꿈과 표에 없는 글자를 무시하라고 정합니다. 브라우저의 atob()은 공백만 지우고, -나 _가 있으면 오류를 냅니다(WHATWG forgiving-base64). 이 도구는 줄바꿈·공백을 무시하고, 주소 속 %2B·%2F·%3D와 JSON 글의 \n 표기를 되돌리며, 표준과 URL-safe 글자를 모두 받습니다. 그 밖의 글자는 위치를 알려 주고 멈춥니다.
같은 글, 글자 인코딩마다 다른 Base64
Base64는 바이트를 글자로 적는 방법일 뿐이므로, 글을 어떤 바이트로 바꿨는지(글자 인코딩)에 따라 결과가 달라집니다. 영문 Hello는 UTF-8·EUC-KR·Shift_JIS에서 바이트가 같아 Base64도 같지만, 한글과 일본어는 인코딩마다 전혀 다른 값이 됩니다.
| 글 | UTF-8 | EUC-KR(CP949) | UTF-16LE | UTF-16BE |
|---|---|---|---|---|
| 한글 | 7ZWc6riA | x9Gx2w== | XNUArg== | 1VyuAA== |
| Hello | SGVsbG8= | SGVsbG8= | SABlAGwAbABvAA== | AEgAZQBsAGwAbw== |
| こんにちは | 44GT44KT44Gr44Gh44Gv | qrOq86rLqsGqzw== | UzCTMGswYTBvMA== | MFMwkzBrMGEwbw== |
| Résumé | UsOpc3Vtw6k= | 없는 글자(é) | UgDpAHMAdQBtAOkA | AFIA6QBzAHUAbQDp |
자동 판별은 먼저 첫 바이트로 PNG·JPEG 같은 파일인지 확인합니다. 그다음 ① 메일 제목·data: 주소·PowerShell처럼 인코딩이 적혀 있거나 정해진 값, ② 맨 앞의 BOM(EF BB BF, FF FE, FE FF), ③ ASCII 글자마다 00이 끼는 UTF-16 모양, ④ UTF-8의 순서로 제어 문자 없이 읽히는지 봅니다. 그래도 읽히지 않으면 EUC-KR·Shift_JIS·Windows-1252와 00이 없는 UTF-16으로 모두 읽어 보고, 그 인코딩의 글자(완성형 한글, 가나·한자, 라틴 글자)로 가장 잘 채워진 결과를 고릅니다. 점수가 같으면 페이지 언어의 인코딩(한국어 페이지는 EUC-KR)을 먼저 씁니다. 바이트만으로는 인코딩을 확정할 수 없으므로, 결과가 어색하면 조절판에서 직접 고르세요.
붙여 넣은 값의 포장, 도구가 벗기는 것
복사한 값에는 Base64 앞뒤로 헤더 이름이나 형식 표시가 붙어 있는 경우가 많습니다. 아래 모양은 포장을 벗기고 안의 Base64만 읽으며, 원문을 고치면 같은 포장으로 다시 만듭니다(서명이 필요한 JWT는 빼고). 판독 경로의 '포장 유지' 칩에서 × 단추를 누르면 포장을 뺄 수 있습니다.
| 모양 | 예 | 처리 |
|---|---|---|
| Basic 인증 | Authorization: Basic cm9i… | UTF-8로 먼저 읽음 |
| 메일 제목 | =?EUC-KR?B?W7fO…?= | 적힌 인코딩으로 읽음, 여러 단어는 이어 붙임, 다시 만들 때는 한 단어 75자 이하로 나눔 |
| data: 주소 | data:image/png;base64,iVBOR… | 형식과 charset을 반영, ;base64가 없으면 Base64가 아니라고 알림 |
| PEM | -----BEGIN CERTIFICATE----- | 본문만 읽고 64자 줄 나눔을 유지, 블록 앞뒤 설명 글은 무시, 블록이 여러 개(인증서 묶음)면 하나씩 넣으라고 알림 |
| PowerShell | powershell -EncodedCommand RwBl… | UTF-16LE로 읽음 |
| JWT·Bearer | eyJhbGci….eyJzdWIi….서명 | 헤더와 페이로드를 줄로 나눠 풀고 서명은 건너뜀 |
| 따옴표·Python | "SGVsbG8=", b'SGVsbG8=' | 따옴표만 벗김 |
| 주소 속 %XX | SGVsbG8%3D | %2B·%2F·%3D를 +·/·=로 되돌림 |
| JSON 속 \n 표기 | MIIB…\nMIIC… | 줄바꿈으로 보고 무시 |
풀리지 않을 때, 오류별 원인
Base64 칸의 값을 읽지 못하면 상태 줄에 몇 번째 글자에서 멈췄는지와 그 주변 글자를 보여 줍니다. 원문 칸은 흐리게 남아 마지막으로 읽은 결과를 보여 줍니다.
| 상태 | 예 | 원인 | 고치는 법 |
|---|---|---|---|
| Base64에 없는 글자 | SGVs bG8! | !, :, 한글 같은 글자가 섞임 | 설명 문구와 기호를 빼고 값만 넣기 |
| 글자 수가 맞지 않음 | SGVsb | 4글자 묶음에서 1글자만 남음 | 복사할 때 빠졌거나 더 붙은 글자가 있는지 확인 |
| = 개수가 맞지 않음 | SGVsbG8== | 이 길이에는 = 1개가 맞음 | = 하나 빼기 |
| = 뒤에 글자가 더 있음 | SGVsbG8=V29ybGQ= | 값 두 개가 이어 붙음 | 줄을 나누고 '줄마다 따로' 켜기 |
| 끝 비트가 0이 아님(경고) | SGVsbG | 마지막 글자의 남는 비트가 0이 아님, 끝이 잘렸을 수 있음(풀면 Hell) | 원본의 끝부분 확인 |
| UTF-8로 읽을 수 없음 | x9Gx2w== | EUC-KR 등 다른 인코딩의 바이트 | 자동 판별 결과를 보거나 인코딩 직접 고르기 |
| 파일로 보임 | iVBORw0KGgo… | 글이 아닌 바이트(이 예는 PNG 서명) | 파일 카드에서 저장 |
다른 도구와 결과가 다를 때
같은 글을 넣었는데 Base64가 다르면 거의 언제나 바이트가 다르거나 모양 설정이 다릅니다. 도구 아래쪽의 '같은 글, 다른 Base64' 목록이 지금 원문으로 아래 경우를 다시 계산해 첫 차이부터 보여 줍니다.
| 원인 | 원문 | 결과 차이 |
|---|---|---|
| echo가 붙인 끝 줄바꿈 | hello | printf로는 aGVsbG8=, echo로는 aGVsbG8K |
| 줄바꿈 LF와 CRLF | 첫 줄 ↵ 둘째 줄 | LF 7LKrIOykhArrkZjsp7gg7KSE, CRLF 7LKrIOykhA0K65GY7Ke4IOykhA== |
| 글자 인코딩 | 한글 | UTF-8 7ZWc6riA, EUC-KR x9Gx2w== |
| 표준과 URL-safe | 😀 | 8J+YgA==, 8J-YgA== |
| 패딩 | Hello | SGVsbG8=, SGVsbG8 |
| 줄 나눔 | 긴 파일 | GNU base64는 76자마다 줄바꿈, -w 0이면 한 줄 |
| 디코더의 너그러움 | Zm9v-_ | Python b64decode()는 기본 설정에서 - _를 버려 b'foo'만 남기고, 이 도구는 URL-safe 글자로 읽음 |
코드로 할 때
브라우저의 btoa()는 한 바이트에 들어가지 않는 글자가 있으면 InvalidCharacterError를 냅니다. 한글은 먼저 UTF-8 바이트로 바꾼 뒤 인코딩해야 합니다. 새 Uint8Array.prototype.toBase64()는 Chrome 140, Firefox 133, Safari 18.2부터 쓸 수 있습니다.
// JavaScript: 한글은 UTF-8 바이트로 바꾼 뒤 인코딩(짧은 글)
const bytes = new TextEncoder().encode('안녕하세요');
const b64 = btoa(String.fromCharCode(...bytes)); // 7JWI64WV7ZWY7IS47JqU
const back = new TextDecoder().decode(Uint8Array.from(atob(b64), c => c.charCodeAt(0)));
bytes.toBase64({ alphabet: 'base64url', omitPadding: true }); // 새 API
# Python
import base64
base64.b64encode('안녕하세요'.encode('utf-8')) # b'7JWI64WV7ZWY7IS47JqU'
base64.b64decode('SGVsbG8') # = 없이 끝나면 binascii.Error: Incorrect padding
base64.b64decode('Zm9v-_', validate=True) # 알파벳 밖 글자를 버리지 않고 오류
# 명령줄
printf '%s' '안녕하세요' | base64 # echo는 끝에 줄바꿈을 붙임
base64 -w 0 report.pdf # GNU: 줄 나눔 없이(macOS base64는 기본이 한 줄, -b 76으로 나눔)
자주 틀리는 경우
- Base64를 암호화로 여기는 경우: 열쇠 없이 누구나 되돌릴 수 있습니다. 비밀번호나 토큰을 Base64로 바꿔도 가려지지 않습니다.
- echo로 만든 값을 그대로 쓰는 경우:
echo는 끝에 줄바꿈을 붙여서 결과 끝이K나o=처럼 달라집니다.printf '%s'나echo -n을 씁니다. - 대소문자를 바꾸는 경우: Base64는 대문자와 소문자를 다른 글자로 읽습니다. 표기를 맞춘다고 바꾸면 다른 데이터가 되거나 풀리지 않습니다.
- 주소 쿼리에 표준 Base64를 그대로 넣는 경우: 폼 데이터 해석에서는 +가 공백으로 바뀌고, /와 =도 주소 안에서 의미가 있습니다. URL-safe를 쓰거나 퍼센트 인코딩을 합니다.
- 두 번 인코딩한 경우: 풀어 낸 결과가 다시 Base64처럼 보이면 상태 줄 옆에 '한 번 더 풀기'가 나옵니다.
- 이미지 Base64의 data: 머리를 빼먹는 경우: HTML·CSS에 넣을 때는
data:image/png;base64,머리가 필요합니다. 이미지라면 이미지 ↔ Base64 변환기가 HTML·CSS 모양까지 만들어 줍니다.
한계
- 파일은 5MB(5,242,880바이트)까지 넣을 수 있습니다(Base64로 약 700만 자). 칸의 글이 40만 자를 넘으면 앞뒤만 보이고, 복사와 저장에는 전체가 들어갑니다.
- 자동 판별은 바이트 모양으로 추정한 결과입니다. 짧은 값은 여러 인코딩으로 읽힐 수 있어 틀릴 수 있습니다.
- 만들 수 있는 인코딩은 UTF-8, UTF-16LE·BE, EUC-KR(CP949), Shift_JIS, Windows-1252입니다. 메일 제목에 적힌 ISO-2022-JP 같은 인코딩은 읽기만 하고, 풀어 낸 글을 고치면 UTF-8로 다시 만듭니다.
- JWT의 서명은 확인하지 않고, 메일 제목의 Q 인코딩(=?…?Q?…?=)은 풀지 않습니다.
- 브라우저 글 칸은 줄바꿈을 LF로 바꾸므로 원문 칸의 줄바꿈은 LF로 인코딩됩니다. CRLF가 필요하면 '같은 글, 다른 Base64'의 CRLF 줄을 복사합니다.
- 묶음 레일은 앞 480묶음(1,440바이트)까지 그립니다. 나머지도 변환과 복사에는 들어갑니다.
- 변환은 이 브라우저 안에서만 하며, 넣은 값을 서버로 보내거나 주소·저장소에 남기지 않습니다.
출처
기준: Base64 형식은 RFC 4648, 메일·PEM·인증 헤더·JWT의 쓰임은 각 RFC, 브라우저 동작은 WHATWG 표준과 MDN, 명령줄과 언어별 동작은 각 설명서를 2026년 10월 21일에 확인했습니다. 표의 값은 이 도구와 Python 3.14 base64 모듈로 같은 결과를 확인했습니다.
- 01RFC 4648 — The Base16, Base32, and Base64 Data Encodings3.1 줄바꿈, 3.3 알파벳 밖 글자 거부, 3.5 남는 비트 0, 4절 글자표, 5절 URL-safe(- _), 10절 시험 값
- 02RFC 2045 — MIME Part One6.8 한 줄 76자 이하, 줄바꿈과 표에 없는 글자는 디코더가 무시
- 03RFC 2047 — MIME Part Three: Message Header Extensionsencoded-word 형식 =?charset?B?…?=, 한 단어 75자 이하, B = BASE64
- 04RFC 7468 — Textual Encodings of PKIX StructuresPEM 본문은 마지막 줄을 빼고 한 줄 64자
- 05RFC 7617 — The 'Basic' HTTP Authentication Scheme아이디 + ':' + 비밀번호를 Base64로, charset 값은 UTF-8만
- 06RFC 7515 — JSON Web Signature (JWS)2절 Base64url: URL-safe 글자, 끝의 = 생략, 줄바꿈 없음
- 07RFC 2397 — The "data" URL schemedata:[형식][;base64],데이터
- 08WHATWG Infra — forgiving-base64 decodeatob()의 규칙: 공백 제거, 끝 = 1~2개 허용, + / 밖 글자는 실패
- 09WHATWG — Encoding StandardTextDecoder의 UTF-8·UTF-16·EUC-KR·Shift_JIS·Windows-1252 해석
- 10MDN — Window.btoa()한 바이트에 들어가지 않는 글자는 InvalidCharacterError
- 11MDN — Uint8Array.prototype.toBase64()alphabet(base64·base64url)·omitPadding 옵션, 지원 버전은 MDN 브라우저 호환 데이터
- 12Python 3 — base64 moduleb64decode(validate=False)는 알파벳 밖 글자를 버림, urlsafe_b64encode
- 13GNU coreutils — base64(1)-w(--wrap) 기본 76자, 0이면 줄 나눔 없음
- 14Microsoft Learn — about_Pwsh-EncodedCommand 값은 UTF-16LE 문자열의 Base64
- 15Kubernetes — Secretsdata 필드 값은 Base64, 인코딩하지 않으려면 stringData
자주 묻는 질문
Base64는 암호화인가요?
아닙니다. Base64는 바이트를 64개 글자로 옮겨 적는 인코딩일 뿐이라 열쇠 없이 누구나 원래 값으로 되돌릴 수 있습니다. 예를 들어 Basic 인증 헤더의 YWRtaW46MTIzNA==는 풀면 바로 admin:1234가 됩니다. 비밀번호나 토큰을 보호하려면 HTTPS와 실제 암호화를 써야 합니다.
같은 한글인데 사이트마다 Base64 결과가 다른 이유는 무엇인가요?
대부분 바이트가 다르기 때문입니다. '한글'은 UTF-8로 7ZWc6riA, EUC-KR로 x9Gx2w==, UTF-16LE로 XNUArg==입니다. 이 밖에 echo가 붙인 끝 줄바꿈(hello → aGVsbG8K), 줄바꿈 CRLF와 LF, URL-safe 글자, 끝의 = 생략, 76자 줄 나눔도 결과를 바꿉니다. 도구 아래 '같은 글, 다른 Base64'에서 이 경우들을 나란히 볼 수 있습니다.
끝에 붙은 =는 무엇이고 빼도 되나요?
=는 마지막 묶음이 3바이트보다 짧을 때 4글자를 채우는 패딩이며 원문의 일부가 아닙니다. 바이트가 1개 남으면 ==, 2개 남으면 =가 붙습니다. JWT처럼 =를 빼도록 정한 형식이 있고 그렇지 않은 곳도 있으니 받는 쪽 규칙을 따르세요. 이 도구는 =가 있든 없든 읽습니다.
Base64 길이는 어떻게 계산하나요?
패딩을 붙이면 4 × ⌈바이트 수 ÷ 3⌉, 패딩을 빼면 ⌈4 × 바이트 수 ÷ 3⌉입니다. 5바이트인 Hello는 8자, 20바이트인 '안녕하세요 👋'는 28자, 1MiB(1,048,576바이트)는 1,398,104자가 되어 약 33% 늘어납니다. 76자마다 CRLF 줄바꿈을 넣으면 줄마다 2글자가 더 붙습니다.
디코딩했더니 한글이 깨져 보이면 어떻게 하나요?
원래 바이트가 UTF-8이 아닐 가능성이 큽니다. 이 도구는 UTF-8로 읽히지 않으면 EUC-KR(CP949) 같은 옛 인코딩과 UTF-16으로 다시 읽어 봅니다. 그래도 글이 어색하면 조절판의 글자 인코딩에서 UTF-8, UTF-16LE, EUC-KR, Shift_JIS, Windows-1252를 직접 골라 비교하세요.
주소(URL)에 넣을 Base64는 어떤 형식으로 만들어야 하나요?
URL-safe 형식을 쓰는 것이 안전합니다. 표준 Base64의 +는 폼 데이터 해석에서 공백으로 바뀌고 /와 =는 주소 안에서 의미가 있기 때문입니다. URL-safe는 62·63번 글자를 - 와 _로 바꾼 형식(RFC 4648 5절)이며, 받는 쪽이 =를 원하지 않으면 '= 생략'도 함께 고릅니다.
메일 제목의 =?UTF-8?B?…?= 같은 값은 어떻게 읽나요?
RFC 2047의 encoded-word입니다. 첫 물음표 사이가 글자 인코딩, B가 Base64라는 표시, 그다음이 Base64 본문입니다. 값을 통째로 Base64 칸에 붙여 넣으면 적힌 인코딩(EUC-KR, UTF-8 등)으로 풀고, 여러 단어로 나뉜 제목은 이어 붙입니다. Q로 표시된 값은 Base64가 아니라서 풀지 않습니다.
Base64로 바꾼 이미지나 PDF를 파일로 되돌릴 수 있나요?
네. Base64 칸에 붙여 넣은 값이 글이 아니면 첫 바이트를 보고 PNG, JPEG, PDF, ZIP 같은 형식을 알아내 파일 카드로 보여 주며, '파일로 저장'으로 내려받을 수 있습니다. 반대로 '파일 넣기'로 5MB까지의 파일을 Base64로 바꿀 수 있습니다. 변환은 브라우저 안에서만 하고 서버로 보내지 않습니다.