Base64 디코딩·인코딩 사용법
- 디코딩: Base64 문자열을 입력란에 붙여 넣으면 결과가 바로 나옵니다. 중간의 줄바꿈과 공백은 무시하므로 메일이나 로그에서 여러 줄로 복사한 문자열도 그대로 넣으면 됩니다.
data:…;base64,…형태의 데이터 URI 전체를 넣어도 됩니다. - 인코딩: 작업에서 인코딩을 고르고 텍스트를 입력하세요. 파일을 고르면 그 파일의 Base64와 바로 쓸 수 있는 데이터 URI가 함께 나옵니다.
- 결과를 주소(URL), 파일 이름, 토큰에 넣을 것이라면 URL 안전 Base64에 체크하세요. 디코딩할 때는 두 가지 알파벳을 자동으로 구분합니다.
- 결과 옆의 복사 버튼을 누르면 끝입니다. 입력이 올바른 Base64가 아니면 무엇이 몇 번째 글자에서 잘못됐는지 알려 줍니다.
Base64는 어떻게 동작할까?
Base64는 텍스트, 이미지, 파일 같은 어떤 데이터든 이메일, JSON, HTML, URL을 지나도 바뀌지 않는 64개의 문자(A–Z, a–z, 0–9, +, /)만으로 적는 방법입니다. 데이터를 3바이트(24비트)씩 묶어 6비트씩 네 조각으로 나누고, 0~63인 각 조각의 값을 문자 하나로 바꿉니다. 표준은 RFC 4648입니다.
| M | a | n | |
|---|---|---|---|
| 바이트 | 77 | 97 | 110 |
| 비트 | 01001101 | 01100001 | 01101110 |
이 24비트를 6비트씩 다시 나누면 010011 010110 000101 101110, 곧 19, 22, 5, 46이 되고, 이는 T, W, F, u에 해당합니다. 그래서 ‘Man’은 TWFu가 됩니다. 마지막에 3바이트가 다 차지 않으면 끝을 =로 채웁니다. ‘Ma’는 TWE=, ‘M’은 TQ==입니다. 3바이트가 4글자가 되므로 Base64는 원래 데이터보다 약 3분의 1(33%) 커집니다.
디코딩하면 한글이 깨지는 이유: UTF-8과 EUC-KR(CP949)
Base64가 담는 것은 글자가 아니라 바이트입니다. 그래서 같은 ‘한글’이라도 어떤 문자 인코딩으로 바이트를 만들었느냐에 따라 Base64가 완전히 달라집니다.
| 인코딩 | ‘한글’의 바이트 | Base64 |
|---|---|---|
| UTF-8 (오늘날의 웹·앱 표준) | ED 95 9C EA B8 80 (한 글자 3바이트) | 7ZWc6riA |
| EUC-KR / CP949 (옛 한글 윈도우·국내 레거시 시스템) | C7 D1 B1 DB (한 글자 2바이트) | x9Gx2w== |
‘한글 깨짐’은 만든 쪽과 읽는 쪽의 인코딩이 다를 때 생깁니다. EUC-KR 바이트를 UTF-8로 읽으면 한글 대부분이 검은 마름모 속 물음표 기호로 바뀌고, 반대로 UTF-8로 만든 ‘깨짐’을 CP949로 읽으면 ‘源⑥쭚’처럼 엉뚱한 한자와 한글이 뒤섞입니다. 많은 온라인 디코더가 UTF-8만 가정하기 때문에, 오래된 메일 제목, 국내 기업의 레거시 시스템, 옛 쇼핑몰이나 결제 연동에서 나온 Base64를 넣으면 이렇게 깨진 결과를 보게 됩니다.
이 도구는 먼저 UTF-8로 읽어 보고, 올바른 UTF-8이 아니면 EUC-KR(CP949)로 다시 읽습니다. 결과의 문자 인코딩 줄에 어느 쪽으로 읽었는지 표시되므로, 위의 x9Gx2w==를 넣으면 깨지지 않은 ‘한글’과 함께 ‘EUC-KR(CP949)’이 나옵니다. 두 인코딩은 같은 바이트를 동시에 올바르게 해석하는 경우가 거의 없어서 이 순서로 판별해도 틀리는 일이 드뭅니다.
참고로 원래의 EUC-KR(KS X 1001 완성형)에는 자주 쓰는 한글 2,350자만 들어 있고, 마이크로소프트가 확장한 CP949(MS949, 통합형 한글 코드)는 현대 한글 11,172자를 모두 담습니다. 브라우저의 EUC-KR 디코더는 CP949 기준이라 ‘똠’이나 ‘햏’처럼 완성형에 없던 글자도 제대로 읽습니다. 다만 인코딩 방향은 언제나 UTF-8입니다. 상대 시스템이 EUC-KR Base64를 요구한다면 프로그램 코드에서 인코딩을 지정해 만드세요(아래 예시 참고).
URL 안전 Base64와 JWT
+와 /는 웹 주소에서 특별한 뜻을 가지므로, RFC 4648은 이 두 글자를 -와 _로 바꾼 ‘URL 및 파일 이름 안전’ 알파벳(base64url)도 정의합니다. 이때는 끝의 = 패딩을 보통 생략합니다. 로그인 토큰으로 널리 쓰이는 JWT가 대표적인 예로, 점(.)으로 구분된 헤더와 페이로드가 각각 base64url로 인코딩된 JSON입니다. 이 디코더는 빠진 패딩을 자동으로 채우므로 JWT의 각 부분을 그대로 붙여 넣으면 됩니다.
Base64 이미지와 데이터 URI
웹 페이지 소스나 API 응답에서 data:image/png;base64,iVBORw0… 같은 문자열을 보았다면, 이미지 파일이 통째로 Base64로 들어 있는 것입니다. 전체를 붙여 넣으면 도구가 앞부분 바이트로 PNG, JPEG, GIF, WebP, PDF, ZIP 같은 형식을 알아보고 파일로 내려받을 수 있게 해 줍니다. 반대로 작은 아이콘을 HTML이나 CSS에 직접 넣고 싶다면 인코딩에서 파일을 골라 데이터 URI를 만드세요(RFC 2397). 큰 이미지는 따로 파일로 두는 편이 로딩이 빠릅니다.
커뮤니티에서 본 Base64 링크
게시판이나 커뮤니티에서 링크를 Base64로 적어 두는 경우가 있습니다. aHR0cHM6Ly로 시작하는 문자열은 거의 언제나 ‘https://’로 시작하는 주소입니다. 예를 들어 aHR0cHM6Ly9jYWxjd29ydGh5LmNvbS9rby8=를 디코딩하면 https://calcworthy.com/ko/ 가 나옵니다. 디코딩한 주소는 바로 누르지 말고 도메인을 먼저 확인하세요. 피싱이나 악성 사이트를 숨기는 데에도 같은 방법이 쓰입니다.
예시로 보기
입력란의 예시 7JWI64WV7ZWY7IS47JqUISDwn5GL는 28글자입니다. 28 ÷ 4 × 3 = 21바이트이고, UTF-8로 읽으면 ‘안녕하세요! 👋’가 됩니다. 한글 다섯 글자가 3바이트씩 15바이트, 느낌표와 공백이 1바이트씩, 손 흔드는 이모지가 4바이트로 모두 21바이트입니다. 21바이트는 3바이트씩 딱 나누어떨어지므로 =는 필요 없습니다. 같은 ‘안녕하세요’를 EUC-KR로 만든 Base64는 vsiz58fPvLy/5A==로, 한 글자가 2바이트라 더 짧고 끝에 패딩이 붙습니다. 이것을 넣어도 결과는 똑같이 ‘안녕하세요’이며, 문자 인코딩만 EUC-KR(CP949)로 표시됩니다.
오류 메시지와 원인
| 메시지 | 흔한 원인 |
|---|---|
| 쓸 수 없는 문자가 있습니다 | 따옴표, 쉼표, ‘Authorization:’ 같은 머리말이나 Base64가 아닌 글이 함께 복사됨 |
| 바이트를 온전히 만들 수 없습니다 | 복사하다 끝이 잘렸거나 한 글자가 더 들어감. 올바른 길이는 4로 나눈 나머지가 0, 2, 3 |
| 끝이 아닌 곳에 =가 있습니다 | Base64 문자열 두 개가 이어 붙음. 따로 디코딩하세요 |
| 표준과 URL 안전 Base64가 섞여 있습니다 | 서로 다른 두 문자열의 일부가 함께 붙여 넣어짐 |
| 텍스트가 아닌 바이너리 데이터 | 오류가 아닙니다. 파일이 들어 있으니 내려받거나, 인코딩하려던 것인지 확인하세요 |
명령어와 코드로 디코딩하기
- Linux·macOS 터미널:
echo '7ZWc6riA' | base64 -d(예전 macOS에서는-D) - Windows 명령 프롬프트:
certutil -decode 입력.txt 출력.txt - Python:
base64.b64decode(s).decode('utf-8'), EUC-KR이라면.decode('cp949'). 인코딩은base64.b64encode('한글'.encode('cp949')) - Java:
new String(Base64.getDecoder().decode(s), "MS949")
코드에서 한글이 깨진다면 거의 언제나 바이트를 문자열로 바꾸는 단계에서 문자 인코딩을 지정하지 않은 것이 원인입니다.
팁과 한계
- Base64는 암호화가 아니라 인코딩입니다. 누구나 디코딩할 수 있으므로 비밀번호나 키를 숨기는 수단으로 쓰면 안 됩니다. 안전한 비밀번호가 필요하다면 비밀번호 생성기를 이용하세요.
- 이메일(MIME)의 Base64는 76글자마다 줄을 바꾸는데, 디코더는 이 줄바꿈을 무시합니다.
- 파일은 10MB까지 인코딩할 수 있습니다. 결과가 아주 길면 화면에 표시하는 대신 텍스트 파일로 내려받게 합니다.
- 디코딩한 글의 길이를 재려면 글자수 세기에 붙여 넣으세요.
모든 처리는 브라우저 안에서 이루어집니다. 붙여 넣은 문자열과 고른 파일은 업로드되지 않으며, 어디에도 저장되지 않습니다.
자주 묻는 질문
Base64는 암호화인가요?
아니요. Base64는 데이터를 적는 방식만 바꿀 뿐이라 키 없이 누구나 디코딩할 수 있습니다. 텍스트만 다루는 시스템으로 바이너리 데이터를 보내기 위한 것이지, 내용을 숨기기 위한 것이 아닙니다.
Base64를 디코딩했더니 한글이 깨져요.
원래 문자열이 UTF-8이 아니라 EUC-KR(CP949)로 만들어졌을 가능성이 큽니다. 이 도구는 UTF-8로 읽히지 않으면 EUC-KR(CP949)로 다시 읽으므로 그대로 붙여 넣으면 됩니다. 그래도 깨진다면 이미 깨진 글자가 Base64로 인코딩된 것일 수 있습니다.
Base64 끝의 =나 ==는 무엇인가요?
패딩입니다. Base64는 3바이트씩 처리하는데, 마지막에 1바이트가 남으면 ==, 2바이트가 남으면 =를 붙여 묶음을 채웁니다. JWT처럼 패딩을 생략하는 경우도 많으며, 이 디코더는 빠진 패딩을 자동으로 채웁니다.
JWT는 어떻게 디코딩하나요?
토큰을 점(.) 기준으로 나눠 첫 부분(헤더)이나 둘째 부분(페이로드)을 붙여 넣으세요. 둘 다 URL 안전 Base64로 된 JSON입니다. 셋째 부분은 서명이라 텍스트가 아닙니다. 디코딩은 서명을 검증하지 않으며, 토큰을 가진 사람은 누구나 페이로드를 읽을 수 있습니다.
Base64로 바꾸면 크기가 얼마나 커지나요?
약 33%입니다. 3바이트가 4글자가 되고, 끝에 패딩이 최대 두 글자 붙습니다. 300KB 이미지는 약 400KB의 Base64가 되며, 줄바꿈이 들어가면 조금 더 커집니다.
입력한 내용이나 파일이 서버로 전송되나요?
아니요. 디코딩과 인코딩은 모두 브라우저 안에서 처리되며, 문자열과 파일은 업로드되거나 저장되지 않습니다.
최종 수정일: 2026년 10월 15일