단순하게 파일 이름으로 해당 파일을 접근하는 것이 아니라
각각의 의존성 파일에 hash id 를 부여하고 관리
이 과정에서 중복되는 패키지는 동일한 hash id를 얻게 된다.
개념
- 저장되는 컨텐츠의 해시값을 주소로 사용
- 동일한 컨텐츠는 항상 동일한 주소
- 내용 기반으로 파일을 식별하고 저장
위치(URL)가 아닌 컨텐츠를 기반으로 검색할 수 있도록 정보를 저장하는 방법
기존의 데이터는 중앙화된 서버에 보관되어 주소(URL)를 통해 접근하여 데이터를 볼 수 있었음
이런 방법을 위치 주소라고 함
*ex) https://n.news.naver.com/article/032*
네이버 뉴스 페이지에서 기사 032를 가져오라는 URL이다. 말 그대로 네이버 뉴스 페이지라는 위치에서 기사 032라는 데이터를 가지고 오는 방식이다. 이러한 방식이 지금까지도 보편적으로 많이 볼 수 있는 방법이다.
컨텐츠 주소 지정 저장소(CAS)는 데이터를 Chunk화 시켜 해시 암호화
그리고 그 데이터를 저장하고, 데이터가 같은 고유의 콘텐츠 식별자 (CID)를 부여한다.
만약 해당 데이터를 조회하고 싶으면 검색창에 저장소위치 + 식별자(CID)를 입력하면 해당 데이터를 조회할 수 있음.
데이터 개체는 하드 디스크에 저장하고, 고유한 콘텐츠 주소 / 식별자(CID)를 할당하여 작동하기 때문이다.
컨텐츠 주소 지정 저장소(CAS)는 데이터에 따라 식별자가 정해집니다.
CAS는 주어진 문서 내용을 매우 빠르게 검색할 수 있도록 설계되었으며 검색된 문서가 원래 저장된 문서와 동일함을 보장합니다. (문서가 다르면 내용 주소가 달라집니다.)
정의에 따르면 두 개의 동일한 문서에는 동일한 콘텐츠 주소가 있으므로 동일한 저장 위치를 가리킵니다.
때문에 데이터 객체가 저장되면 복제, 수정 또는 삭제할 수 없습니다.
CAS는 일반적으로 시간이 지나도 변하지 않는 고정 데이터를 효율적으로 정장 및 액세스를 용이하게 설계되었습니다.
때문에, 이런 장점을 통해 조직은 더 많은 양의 데이터를 더 긴 시간동안 보존 하고, 검색 할 수 있게 되었습니다.
용도
패키지 매니저에서 콘텐츠 주소 지정 저장소란 패키지의 내용을 특정 주소를 통해 직접 참조할 수 있는 저장소를 의미한다. 이러한 방식은 패키지의 특정 버전이 고유한 해시값을 가지므로, 해당 해시를 기반으로 정확히 동일한 콘텐츠를 얻을 수 있는 장점이 있다. 또한, 변조된 콘텐츠를 방지하고, 안정적이며 반복 가능한 빌드를 지원하는데 유용하다.
장점
- 스토리지 효율성
- 동일한 콘텐츠는 한 번만 저장
- 데이터 무결성
- // 파일 검증이 간단함 const fileHash = calculateHash(file); if (fileHash !== storedHash) { // 파일이 손상됨 }
- 캐싱 최적화
- 내용이 같으면 주소가 같음
- 효율적인 캐시 확인 가능
실제 사용 예시 : pnpm
# package.json
{
"dependencies": {
"react": "17.0.2"
}
}
# 설치 시
pnpm install
# 1. react-17.0.2.tgz 다운로드
# 2. 파일 내용의 해시값 계산
# 3. ~/.pnpm-store에 저장 (없는 경우)
# 4. node_modules에 하드링크로 연결
// 두 개의 다른 프로젝트가 같은 버전의 react를 사용할 때
project1/node_modules/react → ~/.pnpm-store/v3/files/aa/aabbcc... ← project2/node_modules/react
추가 사용 사례
- Git
- Git도 CAS 원리 사용
- 객체를 해시로 식별
- Docker
- 이미지 레이어 저장에 CAS 사용
- 레이어 재사용 최적화
- IPFS
- 분산 파일 시스템
- 컨텐츠 주소 기반 식별