마지막 업데이트: 2026년 7월 28일

Inside the CBZ - Understanding the Anatomy of Digital Comics

TL;DR CBZ(Comic Book Zip)는 일련의 순차 이미지 파일을 묶은 표준 ZIP 아카이브에 불과하며, 선택적 메타데이터를 추가해 DRM‑무료 만화 컨테이너 하나로 만든 것입니다. 널리 쓰이는 ZIP 형식에 의존하기 때문에 모든 압축 도구로 열 수 있으며, 리더는 이미지를 알파벳 순으로 정렬해 페이지를 순서대로 표시합니다. 최신 CBZ는 종종 풍부한 라이브러리 데이터를 위해 ComicInfo.xml을 포함하고, WebP/AVIF와 같은 효율적인 이미지 코덱을 사용하며, 인터랙티브한 “enhanced” 만화를 위해 HTML을 삽입하기도 합니다.


CBZ가 정확히 무엇인가요?

  • Name: Comic Book Zip.cbz 확장자를 가진 ZIP 파일.
  • MIME type: application/vnd.comicbook+zip (2012년 IANA에 등록됨).
  • Origins: ComicRack 커뮤니티(2005‑2008)에서 CBR이나 PDF와 같은 독점 포맷에 대한 오픈소스 대안으로 널리 알려졌습니다.
  • Cross‑platform: 모든 ZIP‑호환 유틸리티(7‑Zip, WinRAR, macOS Archive Utility, Linux unzip)로 열 수 있습니다. 내용을 확인하는 데 특별한 소프트웨어가 필요하지 않습니다.

실제로 CBZ는 이미지(JPEG, PNG, WebP 등) 폴더를 압축하고 이름을 바꾼 것에 불과합니다. 그 단순함 때문에 PC, 태블릿, 휴대폰에서 디지털 만화의 사실상 표준이 되었습니다.


CBZ 내부: 파일 구조

잘 구성된 CBZ는 평평한 계층 구조를 따르며—추가 중첩이 없으므로—독자가 페이지를 즉시 찾을 수 있습니다. 아래는 일반적인 트리 뷰입니다:

MyComic.cbz
│
├─ 001.jpg          ← first page (front cover)
├─ 002.jpg
├─ 003.jpg
│   …
├─ 050.jpg          ← last page (back cover)
├─ ComicInfo.xml    ← optional rich metadata
└─ cover.jpg        ← optional thumbnail for library views

핵심 요소

요소무엇인지왜 중요한가
연속 이미지 파일알파벳 순서대로 정렬되도록 이름이 지정됨 (001.jpg, 002.jpg, …)모든 리더에서 올바른 페이지 순서를 보장합니다.
이미지 형식JPEG, PNG, GIF, WebP, AVIF, BMP, TIFF파일 크기, 시각적 충실도 및 장치 호환성을 결정합니다.
ComicInfo.xmlComicRack 스키마를 따르는 선택적 XML제목, 저자, 시리즈, 호 번호, 언어, 페이지 유형 플래그 및 썸네일 데이터까지 저장합니다. 강력한 라이브러리 관리를 가능하게 합니다.
표지 이미지cover.jpg/cover.png를 루트에 배치많은 앱에서 갤러리의 만화 썸네일로 사용됩니다.
Unicode 파일명최신 ZIP은 UTF‑8을 지원합니다라틴어가 아닌 제목과 국제 만화에 필수적입니다.
ZIP 중앙 디렉터리아카이브 끝에 있는 인덱스리더는 이를 읽어 페이지 목록을 빠르게 구축하며; 여기에서 손상이 발생하면 전체 CBZ가 손상될 수 있습니다.

아카이브는 이미 압축된 이미지만 압축하기 때문에 최종 크기는 보통 원본 파일들의 합계에 ZIP 오버헤드 몇 킬로바이트(< 5 %).


메타데이터 마법: ComicInfo.xml 및 페이지‑타입 플래그

CBZ는 추가 파일 없이도 완벽하게 작동하지만, ComicInfo.xml을 추가하면 단순한 이미지 스택이 검색 가능하고 풍부하게 설명된 만화가 됩니다. 다음은 최소 예시입니다:

<?xml version="1.0" encoding="utf-8"?>
<ComicInfo>
  <Title>Starship Voyager</Title>
  <Series>Space Adventures</Series>
  <Number>12</Number>
  <Writer>Jane Doe</Writer>
  <Penciller>John Smith</Penciller>
  <Inker>Alex Lee</Inker>
  <Publisher>Galaxy Press</Publisher>
  <Year>2024</Year>
  <LanguageISO>en</LanguageISO>
  <PageCount>50</PageCount>
  <Pages>
    <Page Image="001.jpg" Type="FrontCover"/>
    <Page Image="002.jpg" Type="Story"/>
    <Page Image="025.jpg" Type="DoublePage"/>
    <Page Image="050.jpg" Type="BackCover"/>
  </Pages>
</ComicInfo>

왜 신경 쓰나요?

  • 라이브러리 도구 (ComicRack, Calibre 등)는 이러한 필드를 기준으로 정렬, 필터링 및 검색할 수 있습니다.
  • 페이지 유형 플래그 (FrontCover, BackCover, Advert, Deleted 등)는 독자가 광고를 숨기고, 스토리 페이지만 표시하거나, 사용자 정의 표지 썸네일을 표시하도록 합니다.
  • 미래 대비 – Digital Comics Initiative가 CBZ v2.0 사양을 초안 중이며, 매니페스트 파일(manifest.json)이 필수가 될 수 있지만 기존 리더는 여전히 ComicInfo.xml을 지원합니다.

CBZ 파일 만들기 및 변환 (단계별)

1. 이미지 준비하기

  • 각 만화 페이지를 이미지로 내보냅니다.
  • 올바른 정렬을 보장하기 위해 제로 패딩된 번호(001.jpg, 002.jpg, …)로 이름을 지정합니다.
  • 대상 독자에 맞는 코덱을 선택하세요: 가장 작은 크기를 위해 JPEG, 무손실 아트를 위해 PNG, 최신 고품질 압축을 위해 WebP/AVIF.

2. (선택 사항) 메타데이터 생성

Tools like ComicTagger, cbr2cbz,와 같은 도구나 사용자 정의 스크립트를 사용하면 OCR + LLM을 이용해 ComicInfo.xml을 자동으로 채울 수 있습니다. 이 단계는 선택 사항이지만 대규모 라이브러리에는 강력히 권장됩니다.

3. 압축하기

# Navigate to the folder containing the pages
cd /path/to/pages

# Create a CBZ without extra compression (JPEGs are already compressed)
zip -0 -r ../MyComic.cbz *.jpg *.png ComicInfo.xml cover.jpg
# -0 = store (no compression) – speeds up the process

아카이버가 자동으로 처리하지 않았다면 생성된 .zip.cbz로 이름을 바꾸세요.

4. 아카이브 확인

import zipfile, pathlib, sys

def list_pages(cbz_path: pathlib.Path):
    with zipfile.ZipFile(cbz_path, 'r') as z:
        # Guard against zip‑bombs (max 500 MB uncompressed)
        total = sum(z.getinfo(name).file_size for name in z.namelist())
        if total > 500 * 1024 * 1024:
            raise ValueError("Archive too large")
        images = [n for n in z.namelist()
                  if n.lower().endswith(('.jpg', '.jpeg', '.png', '.webp', '.avif'))]
        images.sort()  # natural alphabetical order
        return images

if __name__ == "__main__":
    cbz = pathlib.Path(sys.argv[1])
    for page in list_pages(cbz):
        print(page)

python list_pages.py MyComic.cbz를 실행하면 페이지 파일 이름의 깔끔하고 정렬된 목록이 출력됩니다.

5. PDF로 변환 (인쇄 가능한 버전이 필요할 경우)

unzip -q MyComic.cbz -d tmp_pages
convert tmp_pages/*.jpg MyComic.pdf   # ImageMagick's `convert`
rm -r tmp_pages

트렌드, 보안, 그리고 CBZ의 미래

트렌드무슨 일이 일어나고 있나요CBZ에 미치는 영향
웹‑우선 배포출판사는 사전 서명된 URL을 사용해 클라우드 스토리지에 CBZ를 호스팅합니다.더 빠른 DRM‑무료 다운로드; 더 쉬운 자체 출판.
하이브리드/인터랙티브 만화index.html + 자산을 아카이브에 추가하면 “향상된” 만화(오디오, 비디오, HTML5)가 생성됩니다.웹 뷰를 지원하는 리더는 멀티미디어 레이어를 렌더링할 수 있습니다.
WebP 및 AVIF 채택~15 %의 신규 릴리스(2024)에서 이러한 코덱을 사용합니다.품질을 유지하면서 30‑50 % 용량 감소—모바일 대역폭에 필수적입니다.
AI‑생성 메타데이터이제 ComicTagger와 같은 도구가 OCR + LLM을 사용하여 ComicInfo.xml을 채웁니다.향상된 검색 가능성, 자동 태깅 및 라이브러리 정리.
클라우드 동기화 독서 앱Chunky, Perfect Viewer 등은 Firebase/iCloud를 통해 진행 상황을 동기화합니다.휴대폰, 태블릿, 데스크톱 전반에 걸친 원활한 독서.
표준화 추진 (CBZ v2.0)DCI는 필수 manifest.json, 다중 해상도 자산 및 <DRM> 플래그를 제안합니다.고해상도 DPI 장치와 선택적 권리 관리에 대해 CBZ를 더욱 견고하게 만들 것입니다.
보안 인식Zip‑bomb 공격(작은 ZIP → 압축 해제 시 기가바이트)은 실제 위협입니다.리더는 이제 추출 크기 제한을 적용하고 안전한 라이브러리(예: 검사 기능이 포함된 Python의 zipfile)를 사용합니다.

개발자를 위한 보안 팁

CBZ를 추출하기 에 전체 압축 해제 크기를 항상 검증하십시오. Python 코드 조각에 표시된 간단한 검사는 악성 아카이브가 디스크 공간이나 메모리를 고갈시키는 것을 방지합니다.


리더가 실제로 CBZ를 렌더링하는 방법

  1. 아카이브 열기 – 앱은 ZIP 중앙 디렉터리를 읽어 항목의 빠른 인덱스를 얻습니다.
  2. 이미지 파일 필터링 – 이미지가 아닌 항목(ComicInfo.xml, __MACOSX/ 등)은 무시됩니다.
  3. 알파벳 순 정렬 – 제로 패딩된 파일명 때문에 정렬된 목록이 의도한 페이지 순서와 일치합니다.
  4. 메타데이터 파싱ComicInfo.xml이 존재하면 리더가 페이지 유형 플래그, 제목, 저자 등을 추출하고 Advert 또는 Deleted로 표시된 페이지를 숨길 수 있습니다.
  5. 페이지 렌더링 – 이미지가 디코딩됩니다(종종 최신 전자잉크 태블릿의 하드웨어 가속 JPEG/WebP 디코더를 사용) 그리고 한 장씩 표시되며, 부드러운 스크롤을 위해 다음 몇 페이지를 미리 가져옵니다.
  6. 상태 유지 – 읽기 위치, 북마크 및 주석이 로컬에 저장되거나 앱에 따라 클라우드와 동기화됩니다.

그 파이프라인 덕분에 CBZ는 네이티브 PDF만큼 빠르고 반응성이 뛰어나면서도 완전히 개방적이고 편집이 가능합니다.


핵심 요약: CBZ의 우아함은 그 단순성에 있습니다—누구나 열고, 편집하고, 재활용할 수 있는 일반 ZIP 파일이죠. 선택적인 ComicInfo.xml 메타데이터, 최신 이미지 코덱, 그리고 새로운 표준과 함께, DRM‑free이며 크로스‑플랫폼인 뿌리를 유지하면서 지속적으로 발전하고 있습니다.