Base64 디코딩이 실패할 때 원인 네 가지와 입력을 고치는 순서
분명 정상적인 문자열 같은데 디코딩이 안 된다면 대부분 원인이 정해져 있습니다. 패딩, URL 안전 변형, 접두사, 잘림을 순서대로 확인하는 방법입니다.
최종 수정일 읽는 데 약 4분
핵심 요약
- 실패의 대부분은 패딩 부족, URL 안전 변형, data URI 접두사, 문자열 잘림 네 가지입니다.
- 길이가 4의 배수가 아니면 패딩이 잘렸거나 문자열이 중간에 끊긴 것입니다.
- 하이픈과 밑줄이 보이면 URL 안전 변형이라 표준 문자로 바꿔야 합니다.
- 디코딩은 됐는데 한글이 깨진다면 실패가 아니라 문자 인코딩이 다른 경우입니다.
API 응답에서 받은 Base64 문자열을 디코더에 붙여넣었는데 오류가 납니다. 보기에는 정상적인 문자열이고 길이도 충분히 긴데 결과가 나오지 않습니다.
값이 손상된 것은 아닐 가능성이 높습니다. 결론부터 말하면 디코딩 실패의 대부분은 네 가지 원인 중 하나이고, 어느 것인지는 문자열을 보면 30초 안에 판별됩니다.
실패를 만드는 네 가지
첫째, 패딩이 잘렸습니다. Base64 결과의 길이는 항상 4의 배수입니다. 모자라는 자리는 끝에 등호로 채웁니다. 그런데 이 등호가 지저분해 보여 지우거나, 주소에 넣는 과정에서 사라지는 일이 흔합니다. 길이가 4의 배수가 아니라면 여기를 의심해야 합니다.
둘째, URL 안전 변형입니다. 표준 Base64는 더하기와 슬래시를 씁니다. 그런데 이 두 글자는 웹 주소에서 다른 의미를 가져서, 주소에 실을 때는 하이픈과 밑줄로 바꿔 쓰는 방식이 널리 쓰입니다. 문자열에 하이픈이나 밑줄이 보이면 이 경우입니다.
셋째, data URI 접두사가 함께 붙었습니다. 이미지 태그에서 값을 복사하면 data:image/png;base64, 같은 앞부분이 딸려옵니다. 이것은 Base64 데이터가 아니라 그 데이터가 무엇인지 설명하는 머리말이라, 텍스트 디코더에 그대로 넣으면 실패합니다.
넷째, 문자열이 잘렸습니다. 화면에서 긴 문자열을 드래그해 복사하면 끝이나 중간이 누락되는 경우가 있습니다. 로그에 출력된 값은 아예 일정 길이에서 잘려 있기도 합니다.
어느 경우인지 판별하는 표
| 문자열에서 보이는 것 | 원인 | 조치 |
|---|---|---|
| 길이가 4의 배수가 아님 | 패딩 잘림 또는 문자열 잘림 | 원본을 다시 받기 |
| 하이픈이나 밑줄이 있음 | URL 안전 변형 | 하이픈을 더하기, 밑줄을 슬래시로 |
앞에 data: 로 시작하는 부분 | data URI 접두사 | 쉼표 뒤부터만 사용 |
| 중간에 점이 두 개 이상 | JSON 웹 토큰 | 마침표로 나눈 각 부분을 따로 디코딩 |
| 공백과 줄바꿈이 섞임 | 대개 문제 없음 | 그대로 시도해 보기 |
| 한글이나 특수문자가 섞임 | 다른 데이터가 섞임 | 원본 범위를 다시 확인 |
공백과 줄바꿈은 대체로 괜찮습니다. Base64 디코더는 일반적인 공백과 줄바꿈을 정리한 뒤 처리합니다.
순서대로 확인하는 방법
- 길이를 봅니다. 4의 배수가 아니면 그 자체로 답이 나옵니다.
- 앞부분을 봅니다.
data:로 시작하면 쉼표 뒤부터만 잘라 씁니다. - 하이픈과 밑줄을 찾습니다. 있으면 표준 문자로 바꿉니다.
- 점의 개수를 셉니다. 두 개면 토큰 형식이므로 각 부분을 따로 디코딩합니다.
- 원본이 파일인지 확인합니다. 이미지나 문서라면 텍스트가 아니라 파일 디코더를 씁니다.
- 그래도 안 되면 원본을 다시 받습니다. 잘림은 눈으로 확인하기 어렵습니다.
디코딩은 됐는데 결과가 이상할 때
성공했는데 내용이 이상한 경우는 실패와 다르게 다뤄야 합니다.
| 결과 | 의미 | 조치 |
|---|---|---|
| 한글이 깨져 보임 | 원본이 UTF-8이 아님 | 원본 인코딩을 확인 |
| 읽을 수 없는 기호가 가득 | 바이너리 파일임 | 파일 디코더로 복원 |
| 앞부분만 정상이고 뒤가 깨짐 | 문자열이 중간에 잘림 | 원본을 다시 받기 |
| 또 다른 Base64 문자열이 나옴 | 두 번 인코딩됨 | 한 번 더 디코딩 |
| 빈 결과 | 입력이 공백뿐 | 붙여넣기 확인 |
네 번째 줄이 의외로 자주 나옵니다. 시스템 사이를 거치면서 중복으로 감싸진 경우인데, 결과가 다시 Base64처럼 보이면 한 번 더 돌려보면 됩니다.
디코딩 실패를 오래 끄는 습관
오류 메시지만 반복해서 봅니다. 대부분의 디코더는 어디가 문제인지 알려주지 않습니다. 메시지보다 입력 문자열을 보는 편이 빠릅니다.
여러 디코더를 옮겨 다닙니다. 도구를 바꿔도 표준을 따르는 이상 결과는 같습니다. 입력을 고쳐야 합니다.
패딩을 임의로 붙입니다. 등호를 몇 개 붙이면 통과하는 경우가 있지만, 문자열이 잘린 상황이라면 복원된 내용도 잘려 있습니다. 통과했다고 정상은 아닙니다.
바이너리를 텍스트로 디코딩합니다. 이미지를 텍스트 디코더에 넣으면 깨진 문자가 나오는데, 이것을 실패로 오해하기 쉽습니다.
원본 확보를 마지막으로 미룹니다. 잘림이 의심되면 원본을 다시 받는 것이 가장 빠른 해결입니다.
오류 메시지보다 입력을 보세요
디코딩은 규칙이 단순해서 실패 원인도 몇 가지로 좁혀집니다. 길이, 앞부분, 하이픈과 밑줄, 점의 개수. 이 네 가지만 확인하면 대부분 판별됩니다.
그리고 결과가 나왔는데 이상하다면 그것은 실패가 아니라 다른 문제입니다. 문자 인코딩이나 파일 형식 쪽을 봐야 합니다.
자주 묻는 질문
길이가 4의 배수여야 하나요?
표준 Base64는 그렇습니다. 3바이트가 4글자로 변환되므로 결과 길이는 항상 4의 배수가 되고, 모자라면 등호로 채웁니다. 길이가 4의 배수가 아니라면 등호가 잘렸거나 문자열 자체가 중간에 끊긴 것입니다.
하이픈과 밑줄이 들어 있습니다.
URL 안전 변형입니다. 표준 Base64의 더하기와 슬래시가 주소에서 문제를 일으키기 때문에 하이픈과 밑줄로 바꿔 쓰는 방식입니다. 하이픈을 더하기로, 밑줄을 슬래시로 되돌리면 표준 디코더로 읽힙니다.
디코딩은 됐는데 한글이 깨집니다.
디코딩 자체는 성공한 것이고 문자 인코딩이 다른 경우입니다. Base64는 바이트를 복원할 뿐이라, 그 바이트가 UTF-8이 아닌 다른 방식으로 만들어졌다면 글자가 깨져 보입니다. 원본을 만든 쪽에서 어떤 인코딩을 썼는지 확인해야 합니다.
이미지인데 텍스트로 디코딩하면 되나요?
안 됩니다. 이미지는 바이너리라 텍스트로 복원하면 읽을 수 없는 문자가 나옵니다. 파일로 복원하는 디코더를 사용하면 형식을 감지해 적절한 확장자로 저장해 줍니다.