Base64 문자열을 복구하는 방법
- 깨진 값을 검사할 Base64에 붙여넣으세요. 앞뒤 따옴표, 접두사, 줄 바꿈은 그대로 두세요. 무슨 일이 있었는지 파악하는 데 필요합니다.
- 출력 형식을 고르세요. 표준(패딩 있음), 표준(패딩 없음), URL-safe(패딩 있음 또는 없음), MIME(76자 줄, CRLF), PEM(64자 줄) 중 하나입니다.
- 수정된 내용을 읽으세요. 수정 사항이 하나씩 따로 표시되므로 무해한 정리와 데이터를 잃었을 수 있는 변경을 구분할 수 있습니다.
- 결과를 복사하거나 다운로드하세요. 결과 검사로 전체 검사를 실행하거나 디코딩된 파일 다운로드로 바이트를 저장할 수도 있습니다.
복구 기능이 고치는 것
| 붙여넣은 값 | 원인 | 복구 결과 |
|---|---|---|
"SGVsbG8gd29ybGQ\u003d" | =가 이스케이프된 JSON 문자열 | SGVsbG8gd29ybGQ= |
SGVsbG8%3D | URL에서 퍼센트 인코딩됨 | SGVsbG8= |
PDw/Pz8 Pg== | 쿼리 문자열에서 +가 공백이 됨 | PDw/Pz8+Pg== |
PDw_Pz8-Pg | URL-safe이고 패딩 없음 | PDw/Pz8+Pg== |
SGVsbG8gd29ybGQ | 패딩이 제거됨 | SGVsbG8gd29ybGQ= |
SGVsbG8=V29ybGQ= | 값 두 개가 이어 붙음 | SGVsbG9Xb3JsZA== (HelloWorld) |
SGVsbG9= | 0이 아닌 미사용 비트 | SGVsbG8= |
Authorization: Basic … | 헤더 이름까지 복사됨 | 토큰만 |
그 밖에 data:…;base64, 접두사와 PEM -----BEGIN …----- 줄을 제거하고, 일반 따옴표를 벗기고, 리터럴 \n과 \/를 문자로 되돌리며(PHP의 json_encode는 기본적으로 \/를 씁니다), 공백과 줄 바꿈을 지우고, 섞인 +/와 -_ 알파벳을 통일하고, =의 개수를 바로잡습니다.
이어 붙은 값은 조각마다 따로 디코딩한 뒤 바이트를 합치는데, 프로그램이 패딩된 조각을 차례로 덧붙인 경우에는 이것이 올바른 처리입니다. 중간의 =를 지우는 식으로 처리하면 뒤따르는 모든 비트가 밀려 쓰레기 데이터가 됩니다.
실제 문제를 가릴 수 있는 수정
추측에 기반한 수정 두 가지는 경고로 표시됩니다.
- 잘못된 문자 제거. 문자열에
*,#, 엉뚱한 유니코드 문자가 있으면 도구가 이를 지우고 어떤 문자가 빠졌는지 보여 줍니다. 데이터 중간의 문자는 원래 의미 있는 기호가 망가진 것일 수 있고, 그렇다면 그 지점부터 디코딩된 바이트가 여전히 틀립니다. - 남는 문자 하나 제거. 4로 나눈 나머지가 1인 길이는 어떤 인코더도 만들 수 없으므로, 문자가 하나 남거나 문자열이 잘린 것입니다. 도구는 나머지가 디코딩되도록 마지막 문자를 버리지만, 값이 잘린 것이라면 파일의 끝부분은 이미 사라졌습니다. 잘린 이미지는 보통 아래쪽이 회색이거나 비어 있고, 잘린 ZIP은 열리지 않습니다.
둘 중 어느 경고든 나타나면 원본을 다시 구해 보세요. 잘리지 않은 로그 줄, 전체 API 응답, 메일 서버에서 직접 받은 첨부 파일 같은 것입니다.
단순한 수정으로는 부족한 이유
Base64를 “고치는” 흔한 코드 조각은 공백, URL-safe 문자, 패딩을 처리합니다.
def fix_base64(s):
s = "".join(s.split())
s = s.replace("-", "+").replace("_", "/").rstrip("=")
return s + "=" * (-len(s) % 4)
이 코드는 SGVsbG8gd29ybGQ와 PDw_Pz8-Pg는 올바르게 고칩니다. 하지만 +가 공백으로 바뀐 PDw/Pz8 Pg==를 넣으면 공백을 지워 데이터 문자 9개만 남깁니다. 그러면 Python은 “number of data characters (9) cannot be 1 more than a multiple of 4” 오류를 냅니다. JSON 이스케이프, %3D, 붙어 버린 조각, 접두사도 같은 식으로 그대로 통과합니다. 이 페이지의 복구 기능은 수정을 하나씩 시도하고, 공백을 +로 바꾸는 수정은 결과 길이가 올바를 때만 적용합니다.
장기적으로 더 안전한 해결책은 출처에서 고치는 것입니다. URL에 넣기 전에 Base64를 퍼센트 인코딩하거나 Base64URL을 쓰고, 텍스트를 다시 줄 바꿈하거나 이스케이프하는 곳에 두지 마세요. 복구한 문자열이 여전히 예상과 다른 내용으로 디코딩된다면 Base64 오류 가이드에서 글자 깨짐과 이중 인코딩을 다루고, Base64 디코더에서 바이트를 확인할 수 있습니다.
자주 묻는 질문
Python에서 "Incorrect padding" 오류는 어떻게 고치나요?
길이가 4의 배수가 될 때까지 =를 붙이세요: s + "=" * (-len(s) % 4). 그래도 오류가 나면 공백이나 이스케이프 같은 다른 손상이 있는 것입니다. 여기에 붙여넣으면 무엇이 더 잘못됐는지 볼 수 있습니다.
Base64에 공백이 들어 있는 이유는 무엇인가요?
대개 +가 퍼센트 인코딩 없이 URL 쿼리 문자열이나 HTML 폼을 거치면서 받는 쪽에서 공백으로 바뀐 것입니다. 복구 기능은 길이가 올바르게 되는 경우 +를 되돌립니다.
복구하다가 데이터가 손실될 수도 있나요?
잘못된 문자나 남는 마지막 문자를 제거하면 그럴 수 있으며, 수정 목록에 그렇게 표시됩니다. 데이터가 잘려서 문자를 버렸다고 나오면 결과를 믿지 말고 원본의 완전한 사본을 다시 구하세요.
Base64 끝에 있는 \u003d는 무슨 뜻인가요?
=의 JSON 이스케이프입니다. Gson을 비롯한 일부 JSON 라이브러리는 HTML 안전성을 위해 =를 이스케이프합니다. JSON 파서는 이를 자동으로 되돌리며, 원본 텍스트를 붙여넣으면 복구 기능도 같은 일을 합니다.