IPFS는 마치 토렌트처럼 파일을 분산된 여러 노드에 저장하고 불러올 수 있는 peer-to-peer 블록체인 파일 시스템이다.
기존의 웹 프로토콜은 서버-클라이언트 관계로 어떤 컨텐츠에 접근하려면 서버의 위치(URL) 을 통해 클라이언트와 해당 서버와 직접 통신을 하는 방식이다. 반면 IPFS 프로토콜은 content addressing 이라는 방식을 통해 컨텐츠 자체의 고유한 hash 값(CID)을 통해 컨텐츠를 보유하고 있는 노드를 찾아 컨텐츠를 받아간다.
즉, 컨텐츠에 접근하기 위해 고정된 위치에 있는 서버에 접근하는 것이 아니라 해당 파일을 가지고 있는 가장 가까운 노드에 접근하므로 (노드의 현황에 따라 다르겠지만)보다 효율적으로 자원에 접근할 수 있다. 또한 중앙화된 서버의 관리가 필요 없기 때문에 검증된 컨텐츠 접근을 위해 특정 authority에 의존할 필요 없이 컨텐츠 접근할 수 있는 주소 자체로 컨텐츠에 대한 무결성을 보장한다.
IPFS의 주소(CID) 예시
/ipfs/QmXoypizjW3WknFiJnKLwHCnL72vedxjQkDDP1mXWo6uco/wiki/Aardvark.html
위 CID를 직접 접근하려면 IPFS의 API,CLI나 설치형 프로그램을 통해 접근해야 하지만 일반적인 http 웹에서 접근할 수 있도록 공식 게이트웨이를 제공하고 있다. ipfs.io 뒤에 원하는 CID를 붙이면 된다.
https://ipfs.io/ipfs/QmXoypizjW3WknFiJnKLwHCnL72vedxjQkDDP1mXWo6uco/wiki/Aardvark.html
IPFS에서는 CID를 통해 원하는 컨텐츠에 접근할 수 있다. 그러나 CID는 컨텐츠 자체의 내용을 포함한 해쉬 이기 때문에 컨텐츠가 수정될 때 마다 변경된다는 단점이 있다. 업데이트된 컨텐츠를 공유하려면 새로운 주소(CID)를 제공해주어야 한다.
이 문제를 해결하기 위해 IPFS에서는 IPNS라는 name 체계를 사용한다. IPNS의 name을 사용하는 방법은 다음과 같다.
// {
// hash: CID('QmXmJBmnYqXVuicUfn9uDCC8kxCEEzQpsAbeq1iJvLAmVs'),
// size: 60,
// cumulativeSize: 118,
// blocks: 1,
// type: 'directory'
// }