Base64를 디코딩하는 방법
- 입력 · Base64 상자에 Base64를 붙여넣으세요. 줄 바꿈, 공백, 앞뒤의 따옴표,
data:...;base64,접두사는 그대로 두어도 디코더가 제거합니다. - 출력 · 텍스트에 디코딩된 텍스트가 나타납니다. 상태 표시줄에 올바른 Base64 여부, 변형(Standard 또는 Base64URL), 디코딩된 바이트 수, 그리고 추정 형식 항목에 감지된 내용 유형이 표시됩니다.
- 글자가 깨지면 문자 인코딩을 바꾸거나 자동 감지를 고르세요.
- 내용이 JSON이면 JSON 보기 좋게 정렬로 읽기 좋게 들여쓰기할 수 있습니다.
- 출력 복사를 누르거나, 다운로드로 디코딩된 바이트를 파일로 저장하세요. 확장자는 감지된 유형을 따르므로 JSON은
decoded.json, PNG는decoded.png로 저장됩니다.
바꾸기는 디코딩된 텍스트를 입력으로 되돌리고 인코딩으로 전환합니다. 문자열이 왕복 변환되는지 빠르게 확인할 수 있습니다.
디코더가 받는 입력
Base64가 깔끔한 상태로 오는 일은 드뭅니다. 이메일에서는 76자마다 줄 바꿈되어, JSON 파일에서는 따옴표에 싸여, URL에서는 퍼센트 인코딩되어, 토큰에서는 패딩 없이 옵니다. 디코더는 아무 설정 없이 이 모두를 받습니다.
| 붙여넣은 값 | 결과 | 일어난 일 |
|---|---|---|
SGVsbG8gV29ybGQ | Hello World | 빠진 =를 복원하고 상태 표시줄에 알림 |
8J-Riw | 👋 | URL-safe -와 _를 인식하고 변형을 Base64URL로 표시 |
data:text/plain;base64,SGk= | Hi | data URI 접두사 제거 |
"SGVsbG8=" | Hello | 코드나 JSON의 따옴표 제거 |
SGVsbG8%3D | Hello | URL 인코딩된 %3D를 =로 읽음 |
SGVs (줄 바꿈) bG8= | Hello | 줄 바꿈과 공백 건너뜀 |
디코더는 이런 포장에는 관대하지만 그 밖의 것에는 엄격해서, 알파벳 밖의 문자가 나오면 그 문자와 위치를 알려 주는 오류와 함께 멈춥니다. 반면 일부 라이브러리는 잘못된 문자를 조용히 건너뛰고 손상된 출력을 내놓습니다(아래 코드 섹션 참고).
URL-safe 토큰이라면 Base64URL 디코더에서 알파벳을, Base64와 Base64URL 비교에서 차이를 설명합니다.
디코딩한 Base64가 파일일 때
Base64는 어떤 바이트든 담을 수 있으므로, Base64 문자열 중에는 이미지나 문서가 많습니다. 도구는 디코딩한 데이터의 첫 바이트를 알려진 파일 시그니처(매직 넘버)와 대조해 추정 형식에 결과를 보여 줍니다. PNG, JPEG, PDF, ZIP, gzip, JSON, XML 등 많은 형식을 알아봅니다. 바이너리 형식이면 출력 가능한 미리보기를 보여 주고, 바이너리 데이터라고 알린 뒤 Base64를 이미지로나 Base64를 PDF로 같은 알맞은 도구로 연결합니다. 어느 경우든 다운로드는 원래 바이트를 저장합니다.
디코딩하기 전에 Base64 문자열의 시작 부분만 봐도 형식을 알 수 있는 경우가 많습니다.
| Base64 시작 부분 | 디코딩된 바이트 | 형식 |
|---|---|---|
iVBORw0KGgo | 89 50 4E 47 0D 0A 1A 0A | PNG 이미지 |
/9j/ | FF D8 FF | JPEG 이미지 |
JVBERi0 | %PDF- | PDF 문서 |
UEsDBA | PK 03 04 | ZIP, DOCX와 XLSX도 해당 |
H4sI | 1F 8B 08 | gzip 데이터(Gzip Base64 디코더) |
eyJ | {" | JSON, JWT 세그먼트인 경우가 많음 |
PD94bWwg | <?xml | XML |
더 많은 시그니처는 자주 보는 Base64 접두사에 정리되어 있습니다. 유형을 모르는 파일이라면 Base64 파일 변환이 형식을 감지하고 미리 보여 줍니다.
문자 인코딩: 깨진 글자 고치기
Base64는 바이트를 저장할 뿐, 어떤 문자 인코딩이 문자를 그 바이트로 바꿨는지는 알려 주지 않습니다. 디코더는 대부분의 최신 데이터에 맞는 UTF-8로 가정합니다. 이 가정이 틀리면 알아볼 수 있는 증상이 나타납니다.
�문자와 “일부 바이트가 올바른 UTF-8이 아닙니다” 안내. 텍스트가 레거시 문자 인코딩에서 왔습니다.Y2Fm6Q==는 UTF-8에서caf�, ISO-8859-1이나 Windows-1252에서café로 읽힙니다. 한국어 레거시 시스템의 데이터라면 EUC-KR이 필요합니다.vsiz58fPvLy/5A==는 EUC-KR로 읽어야안녕하세요가 됩니다.z/Do4uXy같은 러시아어 텍스트는 Windows-1251이어야Привет가 나옵니다.- 글자마다 뒤에 점이나 빈칸이 붙음. UTF-16입니다. ASCII 글자 뒤에 0 바이트가 하나씩 붙기 때문입니다.
SABlAGwAbABvAA==는 UTF-16LE로Hello입니다(Base64를 UTF-16으로). - 출력에
é,ü,’가 보임. 디코딩은 올바릅니다. Base64로 바꾸기 전에 텍스트가 이중 인코딩된 것으로, 앞선 어느 단계에서 UTF-8을 Latin-1로 잘못 읽고 그 결과를 다시 UTF-8로 저장했기 때문입니다.Y2Fmw4PCqQ==는 정확히café로 디코딩됩니다. 원본에서 고치세요.
자동 감지는 바이트 순서 표시를 먼저 찾고, 다음으로 바이트가 올바른 UTF-8인지, 그다음 UTF-16의 0 바이트 패턴이 있는지 확인합니다. EUC-KR, Windows-1251, KOI8-R 같은 레거시 문자 인코딩은 어떤 감지기로도 서로 구별하기 어려우므로, 출처를 안다면 직접 고르세요.
오류 메시지와 그 의미
| 메시지 | 흔한 원인 | 해결 방법 |
|---|---|---|
| 잘못된 문자 “."(위치 21) | JWT 전체를 붙여넣음: 점이 세 세그먼트를 구분 | 세그먼트 하나만 디코딩하거나 JWT 디코더 사용 |
잘못된 문자 "\\"(위치 8) | /가 \/로 이스케이프된 JSON에서 Base64를 복사함 | \/를 /로 바꾸기 |
| 입력에 표준(+ /) 문자와 URL-safe(- _) 문자가 섞여 있습니다 | 두 문자열이 합쳐졌거나 변환이 반쯤만 됨 | Base64URL을 Base64로로 한 가지 알파벳으로 변환 |
| 패딩(=)은 맨 끝에만 올 수 있습니다 | SGk=SGk=처럼 Base64 값 두 개가 붙어 있음 | 나눠서 각각 디코딩 |
| 길이가 잘못되었습니다. 문자가 하나 많거나 적습니다 | 복사하면서 문자가 빠지거나 더해짐 | 다시 복사하거나 Base64 복구 시도 |
Base64 오류 가이드에서 각 경우를 더 깊이 다룹니다. 문자열에서 정확히 어느 문자나 패딩이 문제인지 찾으려면 Base64 검사기를 사용하세요.
JavaScript, Python, 명령줄에서 Base64 디코딩
atob()는 바이트 하나당 문자 하나인 “바이너리 문자열"을 돌려주므로 UTF-8 텍스트에는 TextDecoder 단계가 필요합니다. atob는 빠진 패딩은 받아 주지만 URL-safe -와 _에서는 InvalidCharacterError를 던집니다.
const s = "R3LDvMOfZSDwn5GL";
new TextDecoder().decode(Uint8Array.from(atob(s), c => c.charCodeAt(0)));
// "Grüße 👋"
// Node.js accepts both alphabets
Buffer.from(s, "base64").toString("utf8"); // "Grüße 👋"
Buffer.from("8J-Riw", "base64url").toString("utf8"); // "👋"
Python은 패딩이 없는 입력에서 binascii.Error: Incorrect padding을 발생시키므로 패딩을 직접 붙이세요.
import base64
s = "SGVsbG8"
base64.b64decode(s + "=" * (-len(s) % 4)).decode("utf-8")
# 'Hello'
base64.b64decode("SGVs*bG8=", validate=True)
# binascii.Error: Only base64 data is allowed
validate=True가 없으면 Python은 *를 버리고 b'Hello'를 돌려줍니다. Node의 Buffer.from도 마찬가지여서, 손상된 문자열이 아무 오류 없이 디코딩될 수 있습니다.
명령줄에서는 다음과 같습니다.
printf '%s' 'R3LDvMOfZSDwn5GL' | base64 -d
base64 -d message.b64 > message.bin
첫 줄은 Grüße 👋를 출력합니다. 오래된 macOS 버전에서는 플래그를 -D로 씁니다. 언어별 자세한 내용: JavaScript, Node.js, Python, PHP.
자주 묻는 질문
Base64 문자열은 어떻게 디코딩하나요?
위 입력란에 붙여넣으면 디코딩된 텍스트가 바로 나타납니다. 코드에서는 Base64를 바이트로 디코딩한 다음 그 바이트를 UTF-8로 읽습니다. Python에서는 base64.b64decode(s).decode(), Node.js에서는 Buffer.from(s, "base64").toString()입니다.
디코딩한 텍스트에 �나 é 같은 이상한 문자가 나오는 이유는 무엇인가요?
�는 바이트가 올바른 UTF-8이 아니라는 뜻이므로 텍스트가 다른 문자 인코딩으로 저장되었을 가능성이 높습니다. 문자 인코딩 메뉴에서 EUC-KR, Windows-1252, UTF-16LE 등을 시도하세요. é 자리에 é가 나온다면 누군가 인코딩하기 전에 이미 텍스트가 깨져 있었던 것입니다.
= 패딩이 없는 Base64도 디코딩할 수 있나요?
네. 디코더가 빠진 =를 직접 붙이고 상태 표시줄에 알려 줍니다. 패딩은 마지막 블록을 채울 뿐이므로 길이만 알면 언제든 복원할 수 있습니다.
디코딩한 출력이 알아볼 수 없는 글자투성이입니다. Base64가 망가진 건가요?
그보다는 데이터가 파일인 경우가 더 많습니다. 상태 표시줄의 “추정 형식” 항목을 확인하세요. 이미지, PDF, 압축 파일 등 바이너리 형식이면 파일을 미리 보거나 저장할 수 있는 디코더로 가는 링크가 나옵니다.
Base64는 키 없이 디코딩할 수 있나요?
언제나 가능합니다. Base64는 알파벳이 공개된 인코딩이므로 비밀을 지켜 주지 않습니다. 디코딩한 결과가 여전히 무작위로 보인다면 인코딩하기 전에 데이터를 암호화하거나 압축한 것입니다.