**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 (정확히 같은 내용이 아닌 유사성 기반)