gzip Base64 문자열을 디코딩하는 방법
- 입력란에 Base64를 붙여넣거나
.gz,.zz,.deflate파일을 놓으세요. 공백과 줄 바꿈은 무시됩니다. - 형식은 자동 감지로 두세요. 상태 표시줄에 “gzip 감지됨"처럼 찾은 형식이 나타납니다.
- 텍스트 결과는 출력 창에 표시되고, JSON은 보기 좋게 정렬됩니다. 바이너리 결과는 파일 형식을 감지하고 다운로드 버튼을 보여 줍니다.
- gzip 입력이면 보낸 쪽이 저장해 둔 경우 원래 파일 이름과 수정 시각도 함께 표시됩니다.
gzip, zlib, deflate 구별하기
세 가지 모두 같은 DEFLATE 압축을 쓰고 감싸는 형식만 다르며, 그 차이는 Base64의 첫 몇 글자에 드러납니다.
| 시작 문자 | 형식 | 주요 출처 |
|---|---|---|
H4sI | gzip (1F 8B 08) | gzip, GZIPOutputStream, HTTP 본문, CloudWatch Logs |
eJ | zlib, 기본 레벨 (78 9C) | zlib.compress(), PHP gzcompress(), PDF 스트림 |
eNo–eNr | zlib, 최고 압축 (78 DA) | 레벨 7–9 |
eAE–eAH, eF4–eF7 | zlib, 가장 빠름 및 낮은 레벨 (78 01, 78 5E) | 레벨 1–5 |
| 고정 접두사 없음 | raw deflate | SAML Redirect 바인딩, PHP gzdeflate(), ZIP 항목 |
SDRzSU | 두 번 Base64 인코딩된 gzip | Helm 릴리스 Secret |
raw deflate에는 시그니처가 없으므로 자동 감지는 gzip과 zlib가 실패한 뒤에 이를 시도합니다. Brotli도 시그니처가 없어 가장 마지막에, 브라우저가 지원할 때만 시도합니다.
실제 페이로드 예
AWS CloudWatch Logs 구독 이벤트는 {"awslogs": {"data": "H4sI…"}} 형태로 Lambda에 전달됩니다. data 값을 붙여넣으면 logGroup, logStream, logEvents가 담긴 JSON을 읽을 수 있습니다.
Helm 3 릴리스 Secret에는 gzip으로 압축한 JSON의 Base64가 들어 있고, Kubernetes가 이를 한 번 더 Base64로 인코딩합니다. 셸에서는 다음과 같습니다.
kubectl get secret sh.helm.release.v1.myapp.v3 -o jsonpath='{.data.release}' \
| base64 --decode | base64 --decode | gunzip | jq -r .manifest
여기서는 Kubernetes Secret 디코더나 Base64 디코더로 바깥 층을 디코딩한 뒤, 나온 H4sI… 결과를 이 페이지에 붙여넣으세요.
SAML Redirect 메시지는 raw deflate입니다. 여기서도 디코딩되지만, SAML 디코더는 URL 디코딩까지 하고 XML 요약도 보여 줍니다.
Python과 Node.js에서 디코딩하기
import base64, zlib
raw = base64.b64decode(s)
text = zlib.decompress(raw, 47).decode() # 47 = 32 + 15: accept gzip or zlib
const zlib = require("zlib");
const text = zlib.unzipSync(Buffer.from(s, "base64")).toString(); // gzip or zlib
raw deflate라면 Python에서는 zlib.decompress(raw, -15), Node에서는 zlib.inflateRawSync()를 쓰세요. Python에서 Base64와 Node.js에서 Base64도 참고하세요.
오류와 제한
- “올바른 Base64이지만 gzip, zlib, raw deflate 데이터가 아닙니다.” 처음부터 압축되지 않은 문자열입니다. Base64 디코더를 쓰거나, 바이너리라면 Base64를 파일로를 사용하세요.
- “올바른 gzip 데이터가 아니거나 잘렸습니다.” 문자열 일부가 빠졌습니다. 로그 한 줄 길이 제한 때문에 잘리는 경우가 많으니 원본에서 다시 복사하세요.
- “압축 스트림 뒤의 추가 바이트는 무시했습니다.” 스트림이 끝난 뒤에 무언가가 덧붙어 있습니다. 그 앞의 데이터는 유지됩니다.
- “압축 해제된 데이터가 256.0 MB보다 커서 중단했습니다(zip 폭탄 가능성).” 압축 폭탄을 막기 위해 출력 크기에 상한을 두었습니다. 그보다 큰 데이터는 로컬에서
gunzip을 사용하세요. - 멀티 멤버 gzip 파일(gzip 스트림 여러 개를 이어 붙인 파일)은 지원하지 않습니다.
자주 묻는 질문
Base64 문자열 앞의 H4sI는 무슨 뜻인가요?
1F 8B 08, 즉 gzip 시그니처와 deflate 방식 바이트를 Base64로 나타낸 것입니다. H4sI로 시작하는 문자열은 gzip 데이터이므로, Base64로 디코딩한 다음 바이트를 gunzip하면 됩니다.
명령줄에서 Base64 gzip을 디코딩하려면 어떻게 하나요?
Linux와 macOS에서는 echo 'H4sI…' | base64 --decode | gunzip을 사용하세요. zlib 데이터(eJ…)는 gunzip이 헤더를 거부하므로, Base64 단계 다음에 python3 -c 'import sys,zlib; sys.stdout.buffer.write(zlib.decompress(sys.stdin.buffer.read()))'를 쓰세요.
Base64 디코딩 결과가 바이너리로 나오는 이유는 무엇인가요?
데이터를 압축한 뒤에 인코딩했기 때문에 일반 Base64 디코더는 압축된 바이트를 그대로 돌려줍니다. 이 페이지에 문자열을 붙여넣으면 디코딩과 압축 해제가 한 번에 이루어집니다.
.zip이나 .tar.gz 파일도 열 수 있나요?
.tar.gz는 압축을 풀면 .tar 아카이브가 되며, 이를 다운로드할 수 있습니다. ZIP 아카이브는 다른 컨테이너 형식이므로 Base64를 ZIP으로에서 목록을 보고 저장하세요.