Zettelkasten

Content-Addressable Storage(CAS)는 데이터의 해시값을 주소로 사용한다.

·수정 2026.04.23·수정 3

**Content-Addressable Storage (CAS)**는 데이터를 저장할 때 내용(content)의 해시값을 주소(address)로 사용하는 저장 패턴이다. 전통적인 위치 기반 주소 지정(파일 경로, 블록 번호) 대신, 데이터 자체의 암호학적 해시가 고유 식별자가 된다.

핵심 원리

데이터 → Hash 함수 → 해시값(주소) → 저장소

예시:

"Hello World" → SHA-256 → a591a6d40bf420404a011733cfb7b190d62c65bf0bcda32b57b277d9ad9f146e

이 해시값이 곧 데이터를 찾는 **키(key)**가 된다.

주요 특징

특징 설명
불변성 (Immutability) 동일한 내용은 항상 동일한 주소를 가짐. 내용이 바뀌면 주소도 바뀜
중복 제거 (Deduplication) 동일한 데이터는 한 번만 저장됨
무결성 검증 주소(해시)로 데이터 손상 여부를 즉시 확인 가능
분산 친화적 위치와 무관하게 내용으로 데이터를 식별

실제 활용 사례

Git

Git은 모든 객체(blob, tree, commit)를 SHA-1 해시로 저장한다.

# 파일 내용의 해시가 곧 객체 ID
$ echo "Hello" | git hash-object --stdin
ce013625030ba8dba906f756967f9e9ca394464a

Docker 이미지 레이어

각 레이어는 내용의 SHA-256 해시로 식별되어 중복 다운로드를 방지한다.

IPFS (InterPlanetary File System)

분산 파일 시스템에서 CID(Content Identifier)를 사용하여 전 세계 어디서든 동일한 파일을 찾는다.

백업 시스템

Restic, Borg 같은 백업 도구는 CAS로 증분 백업과 중복 제거를 구현한다.

장점

  • 저장 공간 절약 - 동일 파일은 한 번만 저장
  • 데이터 무결성 보장 - 해시 불일치로 손상 감지
  • 캐싱 최적화 - 동일 해시 = 동일 내용 보장으로 안전한 캐싱
  • 병렬 처리 용이 - 청크 단위로 분할하여 독립적 처리 가능

단점

  • 수정 불가 - 내용 변경 시 새 주소 생성 (참조 업데이트 필요)
  • 가비지 컬렉션 필요 - 참조되지 않는 객체 정리 필요
  • 해시 충돌 가능성 - 극히 드물지만 이론적으로 존재
  • 메타데이터 분리 - 파일명, 권한 등은 별도 관리 필요

간단한 구현 예시 (Python)

import hashlib
import os

class ContentAddressableStorage:
    def __init__(self, storage_dir="./cas"):
        self.storage_dir = storage_dir
        os.makedirs(storage_dir, exist_ok=True)

    def put(self, data: bytes) -> str:
        """데이터 저장, 해시(주소) 반환"""
        content_hash = hashlib.sha256(data).hexdigest()
        path = os.path.join(self.storage_dir, content_hash)

        if not os.path.exists(path):  # 중복 방지
            with open(path, 'wb') as f:
                f.write(data)

        return content_hash

    def get(self, content_hash: str) -> bytes:
        """해시로 데이터 조회"""
        path = os.path.join(self.storage_dir, content_hash)
        with open(path, 'rb') as f:
            data = f.read()

        # 무결성 검증
        if hashlib.sha256(data).hexdigest() != content_hash:
            raise ValueError("Data integrity check failed!")

        return data

관련 개념

  • Merkle Tree: CAS 객체들을 트리 구조로 연결하여 대규모 데이터 무결성 검증 (Git, 블록체인)
  • Chunking: 대용량 파일을 청크로 분할하여 각각 CAS 저장
  • pHash(perceptual hash)는 같은 사진을 찾는데 유용하다. - 유사 이미지 검색을 위한 perceptual hash (정확히 같은 내용이 아닌 유사성 기반)