Base64 디코딩·인코딩 방법과 한글 깨짐 해결법

SSDown 에디터2026년 10월 1일읽는 데 8분사용법
#Base64 디코딩#base64 변환#base64 인코딩#base64 한글 깨짐#UTF-8 인코딩

Base64 디코딩은 SGVsbG8= 같은 문자열을 원래 데이터로 되돌리는 작업입니다. 가장 빠른 방법은 온라인 변환 도구에 문자열을 붙여 넣는 것이고, 윈도우 PowerShell이나 맥 터미널 명령어로도 할 수 있습니다.

한글이 섞인 문자열을 디코딩하면 글자가 깨질 때가 많습니다. 이는 Base64 탓이 아니라 문자 인코딩(UTF-8, EUC-KR)이 서로 맞지 않아서 생기는 문제입니다. 이 글에서는 변환 방법과 함께 한글이 깨지는 이유와 해결법을 정리합니다.

Base64란 무엇인가

Base64는 이진 데이터를 알파벳 대소문자, 숫자, +, / 등 64개 문자로 바꾸는 방식입니다. 이메일 첨부파일, 웹 페이지에 넣는 이미지 데이터(data URI), API 인증 헤더처럼 텍스트만 다룰 수 있는 곳에 데이터를 실어 보낼 때 씁니다.

  • 인코딩: 원본 데이터 → Base64 문자열 (예: Hello → SGVsbG8=)
  • 디코딩: Base64 문자열 → 원본 데이터 (예: SGVsbG8= → Hello)

원리는 단순합니다. 데이터를 3바이트(24비트)씩 끊어 6비트 4조각으로 나누고, 각 조각을 64개 문자 중 하나로 바꿉니다. 그래서 결과물은 원본보다 약 33% 커집니다. 마지막에 3바이트가 채워지지 않으면 = 기호로 자리를 채우는데, 이것을 패딩이라고 합니다.

Base64는 암호화가 아닙니다. 누구나 디코딩할 수 있으므로 비밀번호나 개인정보를 숨기는 용도로 쓰면 안 됩니다.

온라인 도구로 Base64 변환하기

프로그램을 설치하지 않고 바로 변환하려면 온라인 도구가 가장 편합니다.

  1. Base64 · URL 인코더 / 디코더 페이지를 엽니다.
  2. 변환할 문자열을 입력 칸에 붙여 넣습니다.
  3. 인코딩 또는 디코딩을 선택합니다.
  4. 결과를 확인하고 복사합니다.

같은 도구에서 URL 인코딩(%ED%95%9C 같은 형태)도 변환할 수 있어, 주소창에 한글이 이상하게 표시될 때도 쓸 수 있습니다. 다만 API 키나 토큰처럼 민감한 값은 어떤 온라인 서비스에도 붙여 넣지 말고 아래의 로컬 명령어를 쓰는 편이 안전합니다.

한글이 깨지는 이유: UTF-8과 EUC-KR

Base64는 글자를 직접 다루지 않습니다. 다루는 것은 바이트입니다. 그래서 한글을 인코딩하려면 먼저 한글을 바이트로 바꿔야 하는데, 이때 어떤 문자 인코딩을 쓰느냐에 따라 바이트가 달라집니다.

문자 인코딩"한글"의 바이트Base64 결과
UTF-8ED 95 9C EA B8 80 (글자당 3바이트)7ZWc6riA
EUC-KR(CP949)C7 D1 B1 DB (글자당 2바이트)x9Gx2w==

같은 "한글"이라도 결과가 완전히 다릅니다. 문제는 디코딩할 때 생깁니다. UTF-8로 인코딩된 값을 EUC-KR로 해석하거나, 그 반대로 해석하면 바이트는 정확히 복원되지만 글자로 바꾸는 단계에서 엉뚱한 문자가 나옵니다. 흔히 보는 �, 한, 뜻 모를 한자 조합이 바로 이 경우입니다.

깨짐 증상별 원인

  • í, ë 같은 라틴 문자가 섞여 나옴: UTF-8 바이트를 Latin-1(ISO-8859-1)로 해석한 경우입니다.
  • 이상한 한자·한글 조합이 나옴: UTF-8 바이트를 EUC-KR로 해석한 경우가 많습니다.
  • � 기호가 반복됨: EUC-KR 바이트를 UTF-8로 해석해 올바르지 않은 바이트로 처리된 경우입니다.

해결법은 인코딩한 쪽과 디코딩하는 쪽의 문자 인코딩을 맞추는 것입니다. 요즘 웹과 API는 대부분 UTF-8을 쓰므로 먼저 UTF-8로 디코딩해 보고, 오래된 윈도우 프로그램이나 국내 레거시 시스템에서 나온 데이터라면 EUC-KR로 다시 시도해 보세요.

윈도우에서 Base64 인코딩·디코딩하기

윈도우에서는 PowerShell을 쓰면 문자 인코딩을 직접 지정할 수 있어 한글 깨짐을 피하기 쉽습니다.

PowerShell

인코딩:

[Convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes("한글"))

디코딩:

[Text.Encoding]::UTF8.GetString([Convert]::FromBase64String("7ZWc6riA"))

EUC-KR 데이터라면 UTF8 부분을 GetEncoding(949)로 바꾸면 됩니다. 다만 PowerShell 버전에 따라 949 코드 페이지 지원 방식이 다를 수 있습니다.

certutil (파일 변환)

파일 단위로 변환할 때는 명령 프롬프트의 certutil을 쓸 수 있습니다.

  • 인코딩: certutil -encode 원본파일 결과.txt
  • 디코딩: certutil -decode 입력.txt 원본파일

certutil로 인코딩하면 결과 파일 앞뒤에 -----BEGIN CERTIFICATE----- 같은 줄이 붙습니다. 순수 Base64 문자열만 필요하면 이 줄을 지우고 쓰세요.

맥·리눅스에서 Base64 인코딩·디코딩하기

macOS와 리눅스에는 base64 명령이 기본으로 들어 있습니다. 터미널은 보통 UTF-8을 쓰므로 한글도 그대로 처리됩니다.

  • 인코딩: echo -n "한글" | base64
  • 디코딩: echo "7ZWc6riA" | base64 -d
  • 파일 인코딩: base64 -i 원본파일 -o 결과.txt (macOS 기준)

echo에 -n을 빼면 줄바꿈 문자까지 인코딩되어 결과 끝이 달라집니다. 다른 사람과 결과가 다르다면 가장 먼저 이 부분을 확인하세요. 오래된 macOS에서는 디코딩 옵션이 -D일 수 있습니다.

코드로 변환할 때 주의할 점

JavaScript

브라우저의 btoa()는 Latin-1 범위의 문자만 받기 때문에 btoa("한글")은 오류가 납니다. 한글은 먼저 UTF-8 바이트로 바꿔야 합니다.

const bytes = new TextEncoder().encode("한글");
const b64 = btoa(String.fromCharCode(...bytes));

디코딩은 반대로 atob()로 얻은 문자열을 바이트 배열로 만든 뒤 new TextDecoder("utf-8").decode()로 글자로 바꿉니다. Node.js에서는 Buffer.from("한글", "utf8").toString("base64")처럼 한 줄로 처리할 수 있습니다.

Python

base64.b64encode("한글".encode("utf-8"))로 인코딩하고, base64.b64decode(값).decode("utf-8")로 디코딩합니다. encode()와 decode()에 같은 문자 인코딩을 지정하는 것이 핵심입니다.

URL-safe Base64

URL이나 JWT 토큰에서는 +와 /가 주소에서 특별한 의미를 갖기 때문에 각각 -와 _로 바꾼 URL-safe Base64를 씁니다. 패딩 =도 생략하는 경우가 많습니다. 일반 디코더에서 오류가 나면 이 문자들을 원래대로 돌리고 길이가 4의 배수가 되도록 =를 붙여 다시 시도해 보세요.

자주 묻는 질문

Base64 디코딩 결과가 알아볼 수 없는 문자로 나옵니다.

원본이 텍스트가 아니라 이미지, PDF 같은 이진 파일일 수 있습니다. 이런 경우에는 텍스트로 보지 말고 파일로 저장해야 합니다. 텍스트인데 깨진다면 UTF-8과 EUC-KR을 바꿔 가며 디코딩해 보세요.

"Invalid character" 또는 길이 오류가 납니다.

복사 과정에서 공백·줄바꿈이 섞였거나, URL-safe 문자(-, _)가 들어 있거나, 끝의 =가 빠진 경우가 대부분입니다. 불필요한 문자를 지우고 패딩을 맞춰 보세요.

Base64로 인코딩하면 보안이 되나요?

되지 않습니다. Base64는 형식 변환일 뿐이라 누구나 원래 값을 되돌릴 수 있습니다. 민감한 데이터는 별도의 암호화를 적용해야 합니다.

이미지를 Base64로 바꾸면 용량이 늘어나나요?

네, 약 33% 늘어납니다. 작은 아이콘을 HTML이나 CSS에 직접 넣을 때는 편리하지만, 큰 이미지는 일반 파일로 두는 편이 효율적입니다.

정리

Base64 인코딩은 바이트를 64개 문자로 바꾸는 방식이고, 디코딩은 이를 원래 바이트로 되돌리는 작업입니다. 간단한 변환은 Base64 · URL 인코더 / 디코더 같은 온라인 도구로, 민감한 값은 PowerShell이나 터미널 명령어로 처리하면 됩니다. 한글이 깨지는 원인은 Base64가 아니라 문자 인코딩 불일치이므로, 인코딩한 쪽과 같은 UTF-8 또는 EUC-KR로 디코딩하면 해결됩니다.