gzip, zip, tar는 각각 무엇을 하는가
묶는 일과 줄이는 일은 다릅니다. DEFLATE와 gzip의 관계, tar.gz와 zip의 압축률 차이를 실제 수치로 정리했습니다.
.gz, .zip, .tar, .tar.gz는 비슷해 보이지만 하는 일이 다릅니다. 왜 tar만 두 번 확장자가 붙는지, zip과 tar.gz 중 무엇을 쓸지 판단하려면 두 가지 작업이 나뉘어 있다는 것부터 봐야 합니다. 여러 파일을 하나로 묶는 일과 크기를 줄이는 일입니다.
알맹이는 DEFLATE 하나
gzip, zip, PNG, HTTP 응답 압축은 대부분 같은 알고리즘을 씁니다. DEFLATE입니다. 차이는 그 앞뒤에 무엇을 붙이느냐입니다.
| 형식 | 구성 | 시작 바이트 |
|---|---|---|
| raw deflate | 압축 데이터만 | 없음 |
| zlib | 2바이트 헤더 + 데이터 + Adler-32 | 78 9c |
| gzip | 10바이트 이상의 헤더 + 데이터 + CRC32 + 길이 | 1f 8b 08 |
같은 9,000바이트 텍스트를 넣으면 결과가 이렇게 나옵니다.
raw deflate 89 바이트
zlib 95 바이트
gzip 107 바이트
brotli 60 바이트
압축된 내용은 같고 감싸는 부분만 다릅니다. 그래서 zlib으로 압축한 데이터를 gzip 해제기에 넣으면 "잘못된 헤더" 오류가 납니다. 알고리즘을 몰라서가 아니라 앞의 몇 바이트가 기대한 형식이 아니기 때문입니다. 라이브러리에서 gzip과 deflate 옵션을 헷갈려 실패하는 경우가 대개 여기에 해당합니다.
tar는 압축하지 않는다
tar는 여러 파일을 하나의 스트림으로 이어 붙이는 형식입니다. 파일마다 512바이트 헤더를 붙이고 내용을 512바이트 단위로 채웁니다. 크기를 줄이는 기능은 없습니다. 파일 권한, 소유자, 심볼릭 링크 같은 유닉스 속성을 그대로 보존하는 것이 목적입니다.
gzip은 반대로 스트림 하나를 압축할 뿐 여러 파일을 다루지 못합니다.
그래서 둘을 이어 씁니다. tar로 묶고 그 결과를 gzip으로 압축한 것이 .tar.gz입니다. 확장자가 두 개인 이유가 이것입니다.
tar.gz와 zip의 차이
zip은 묶는 일과 줄이는 일을 한 형식에서 처리합니다. 다만 파일을 각각 따로 압축한 뒤 모아 둡니다. tar.gz는 전부 이어 붙인 다음 통째로 한 번 압축합니다.
이 차이가 결과에 크게 나타납니다. 형식이 비슷한 로그 파일 200개(합계 24,962바이트)를 두 방식으로 만들면 이렇습니다.
원본 24,962 바이트
tar.gz 12,618 바이트
zip 54,946 바이트
zip이 원본보다 두 배 넘게 커졌습니다. 이유는 두 가지입니다. 파일마다 로컬 헤더와 중앙 디렉터리 항목이 붙어 200개 분량의 고정 비용이 쌓이고, 각 파일이 130바이트 남짓이라 압축 사전이 채워지기도 전에 끝나 압축이 거의 되지 않습니다. tar.gz는 전체를 한 스트림으로 보므로 파일 사이의 반복까지 함께 줄입니다.
대신 zip에는 tar.gz가 못 하는 것이 있습니다.
- 파일 하나만 꺼낼 수 있습니다. 각 파일이 독립적으로 압축돼 있고 위치를 담은 목록이 끝에 있습니다
- 목록만 읽으면 내용물을 알 수 있습니다
- tar.gz는 앞에서부터 순서대로 풀어야 합니다. 마지막 파일 하나를 꺼내려면 전체를 지나가야 합니다
정리하면 이렇습니다.
- 작은 파일이 많고 통째로 주고받는다면 — tar.gz
- 일부만 꺼내 쓰거나 다른 환경에서 열어야 한다면 — zip
이미 압축된 것은 다시 줄지 않는다
압축은 반복되는 패턴을 찾아 줄이는 일이라, 패턴이 남지 않은 데이터에는 효과가 없습니다. 오히려 헤더만큼 커집니다.
tar.gz 파일 560 바이트 → 다시 gzip 583 바이트
JPEG, PNG, MP4, 그리고 대부분의 오피스 문서가 이미 압축된 상태입니다. 이런 파일만 담은 zip은 시간만 쓰고 크기는 그대로입니다.
HTTP에서의 압축
응답 압축은 Content-Encoding 헤더로 지정합니다. Content-Type과 다른 자리입니다.
gzip— 어디서나 동작합니다br(brotli) — 텍스트에서 gzip보다 확실히 작습니다. 위 예시에서 gzip 107바이트가 brotli로는 60바이트였습니다zstd— 압축 해제가 빠릅니다
이미 압축된 응답(이미지, 동영상)에는 적용하지 않습니다. 서버 설정에서 압축 대상 MIME 타입을 지정하는 이유가 이것입니다.
확장자가 알려 주지 않는 것
zip은 컨테이너로 널리 쓰입니다. 다음 파일들은 전부 내부 구조만 정해 둔 zip입니다.
.docx,.xlsx,.pptx.jar,.war,.apk.epub
확장자를 .zip으로 바꾸면 그대로 열립니다. 파일이 어떤 형식인지 확실히 하려면 시작 바이트를 봅니다.
50 4b 03 04 zip (PK)
1f 8b 08 gzip
tools.onuel.dev에 gzip, deflate, zip, tar가 각각 있어 같은 입력으로 크기를 비교할 수 있습니다. 결과의 시작 바이트는 헥스 덤프로 확인할 수 있습니다.
- #압축
- #gzip
- #아카이브