블록체인 데이터 거버넌스: 출처 추적과 연쇄 보관 설계

블록체인 앵커링과 오프체인 메타데이터를 결합해 데이터 출처, 연쇄 보관, 감사 증적을 설계하는 방법

2026-08-14 · 최초 발행 2025-11-09

데이터의 이력과 책임을 분리해 기록하는 방식

데이터 거버넌스에서 문제는 파일이나 레코드를 보관하는 데서 끝나지 않는다. 어떤 데이터가 어디서 생성됐고, 어떤 변환과 승인을 거쳐 현재 상태가 되었는지, 누구에게 언제 전달됐는지를 나중에도 검증할 수 있어야 한다.

블록체인 기반 접근은 이 이력을 신뢰 가능한 형태로 남기는 데 초점을 둔다. 데이터 출처 추적(Data Provenance), 연쇄 보관(Chain of Custody), 오프체인 메타데이터를 결합하면 규제 준수와 감사 대응, 데이터 무결성 검증을 하나의 체계로 설계할 수 있다.

Data Provenance는 데이터가 생성된 뒤 현재 상태에 이르기까지의 변환, 버전, 의사결정 경로를 담는 이력 정보다. 이때 블록체인에는 머클 루트나 문서 해시 같은 해시 앵커, 버전 식별자, 타임스탬프, 서명자를 기록하고 실제 데이터는 오프체인에 둔다.

Chain of Custody는 데이터나 자산의 보관, 전달, 접근 권한 이동을 시간 순서로 통제하는 방식이다. DID/PKI로 주체를 식별하고 전달·회수·폐기 이벤트에 서명한 뒤 불변 원장에 남기면, 위변조 방지와 책임 추적성을 함께 확보할 수 있다.

오프체인 메타데이터는 온체인 저장 비용과 프라이버시 제약을 피하기 위한 스키마화된 설명 데이터다. IPFS, S3, 데이터 레이크 등에 저장하며, 체인에는 콘텐츠 해시, 포인터, 스키마 버전, 접근 정책 해시처럼 최소한의 앵커만 남긴다. 검색, 암호화, 보존 정책의 세부 구현은 오프체인 계층이 맡는다.

신뢰의 기준점은 식별, 해시, 정책에서 만들어진다

주체는 DID/PKI와 KMS에 보관된 키를 이용해 서명과 검증을 수행한다. 이벤트를 일으킨 주체와 역할(Role)을 정책에 연결해야 한다. 데이터 객체는 해시 기반 불변 ID(bytes32)로 식별하고, 외부 시스템의 비즈니스 키와 상호 참조할 수 있다.

문서나 배치의 SHA-256 또는 Keccak 해시를 온체인 트랜잭션에 커밋하면 블록 타임과 블록 번호를 통해 시점을 증명할 수 있다. 대량 데이터를 처리할 때는 개별 항목 대신 머클 트리 루트를 앵커링해 비용을 낮추고 검증을 효율화한다.

저장소는 서로 다른 역할을 가진다. IPFS는 컨텐츠 주소화와 핀 서비스를 제공하고, S3나 데이터 레이크는 액세스 제어와 수명 주기 관리에 적합하다. 메타데이터 스키마에는 버전 필드와 역호환 규칙을 두고, JSON Schema와 레지스트리 같은 방식으로 스키마를 운영한다.

민감 정보는 레코드별 객체 키를 이용해 전송 전에 암호화하고, KMS/HSM으로 키를 관리하며, ABAC/RBAC 정책으로 접근을 집행한다. 온체인에는 최소 정보 원칙을 적용하고, 필요한 경우 해시, 비식별 처리, 영지식증명(ZKP)을 활용한다.

역할은 Submitter, Approver, Auditor로 분리할 수 있다. 변경 승인 워크플로우와 감사 로그의 불변화를 함께 두고, 데이터 보존·폐기 정책과 해시 일치·서명 유효성 검증을 주기적으로 점검한다.

앵커링 파이프라인은 저장 성공과 최종성을 함께 확인한다

입력은 원본 데이터(파일 또는 레코드), JSON 메타데이터, 제출자의 DID와 서명 키로 구성된다. 먼저 SHA-256 해시를 계산하고 스키마를 검증한다. 이후 데이터를 IPFS 또는 S3에 저장해 CID나 URI를 얻은 뒤, 콘텐츠 해시와 메타데이터 포인터, 스키마 버전을 온체인에 커밋한다. 인수인계와 반출·반입은 별도의 연쇄 보관 이벤트로 기록한다.

결과물은 트랜잭션 해시, 블록 번호, 검증 가능한 앵커, 감사 증적 패키지다. 퍼블릭 체인에서는 12~64 블록의 최종성을 기다리고, 프라이빗/PoA 체인에서는 즉시 또는 n블록 정책을 적용한다. 오프체인 작업은 idempotency 키로 재시도를 관리하고, 온체인에서는 nonce나 레코드 존재 여부를 검사해 중복을 피한다. 스토리지 404, 해시 불일치, 체인 재구성(reorg)이 발생하면 감지 후 재앵커링한다.

아니오아니오아니오입력: 원본 데이터 + 메타데이터+ 서명해시 계산 & 스키마 검증오프체인 저장 성공?CID/URI 획득재시도/스토리지 장애 알림온체인 커밋(해시+포인터+버전)블록 최종성 확보?연쇄 보관 이벤트 기록재구성 감지→재커밋/보류검증 요청 처리오프체인 콘텐츠 해시 일치?검증 성공: 감사 증적 생성검증 실패: 격리/조사/알림

온체인과 오프체인은 서로 다른 제약을 보완한다

항목 온체인 메타데이터 오프체인 메타데이터 하이브리드(권고)
성능 낮음(가스 비용↑) 높음 중간
확장성 제한적 높음(오브젝트 스토리지) 높음
일관성 강한(원장 불변성) 저장소 정책에 의존 앵커링으로 무결성 보강
안정성 체인 가용성 의존 스토리지/네트워크 의존 이중화 가능
운영 편의 스키마 변경 어려움 유연한 스키마/버전 유연성+무결성 균형

하이브리드 구조는 체인의 불변성과 오프체인 저장소의 유연성을 결합한다. 빈번하게 바뀌는 정보는 오프체인에 두고, 특정 시점의 스냅샷과 검증 기준점만 온체인에 남기는 방식이 운영상 적합하다.

최소 레지스트리로 앵커를 남기기

Solidity ^0.8.20, EVM 호환 테스트넷, Hardhat, Node.js 18+ 환경을 전제로 한다. 해시는 오프체인에서 SHA-256(32바이트)로 계산하고, 컨트랙트는 bytes32로 저장한다.

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

contract ProvenanceRegistry {
    struct Record {
        bytes32 contentHash;    // SHA-256 or Keccak-256
        string  metadataURI;    // e.g., ipfs://CID or s3://bucket/key
        address submitter;
        uint64  blockNo;
        bool    exists;
    }
    struct Custody {
        address from_;
        address to_;
        bytes32 reasonHash; // off-chain reason doc hash
        uint64  blockNo;
    }

    mapping(bytes32 => Record) public records;     // id -> record
    mapping(bytes32 => Custody[]) public chainOfCustody; // id -> events

    event Committed(bytes32 indexed id, bytes32 contentHash, string metadataURI, address indexed submitter);
    event CustodyTransferred(bytes32 indexed id, address indexed from_, address indexed to_, bytes32 reasonHash);

    function commit(bytes32 id, bytes32 contentHash, string calldata metadataURI) external {
        require(!records[id].exists, "already exists");
        records[id] = Record(contentHash, metadataURI, msg.sender, uint64(block.number), true);
        emit Committed(id, contentHash, metadataURI, msg.sender);
    }

    function transferCustody(bytes32 id, address to, bytes32 reasonHash) external {
        require(records[id].exists, "unknown id");
        // simple model: submitter controls; extend with roles/ACL as needed
        require(msg.sender == records[id].submitter, "not owner");
        chainOfCustody[id].push(Custody(msg.sender, to, reasonHash, uint64(block.number)));
        emit CustodyTransferred(id, msg.sender, to, reasonHash);
    }
}

오프체인 파이프라인은 JSON Schema 검증, SHA-256 계산, 암호화(옵션), IPFS/S3 저장, CID/URI 획득 순으로 구성할 수 있다. 온체인 커밋에서 id는 비즈니스 키, 파일 해시, 타임스탬프 salt의 SHA-256 값으로 만들고, contentHash에는 콘텐츠의 SHA-256을, URI에는 ipfs://CID를 사용한다. 검증 시에는 URI에서 콘텐츠를 가져와 해시를 다시 계산하고 온체인 contentHash 및 서명을 확인한다.

// Node.js 18+, ethers ^6, dotenv
import { ethers } from "ethers";
import fs from "fs";
import crypto from "crypto";

const rpc = process.env.RPC_URL;
const pk = process.env.PRIVATE_KEY;
const addr = "0xYourDeployedRegistry";

const abi = [
  "function commit(bytes32 id, bytes32 contentHash, string metadataURI) external",
];

function sha256Hex(buf) {
  return crypto.createHash("sha256").update(buf).digest();
}

async function main() {
  const provider = new ethers.JsonRpcProvider(rpc);
  const wallet = new ethers.Wallet(pk, provider);
  const c = new ethers.Contract(addr, abi, wallet);

  const buf = fs.readFileSync("./artifact.pdf");
  const contentHash = sha256Hex(buf); // 32 bytes Buffer
  const id = sha256Hex(Buffer.concat([contentHash])); // simple id

  const uri = "ipfs://bafy..."; // 사전 업로드 완료 가정
  const tx = await c.commit(id, contentHash, uri);
  const rc = await tx.wait();
  console.log("Committed at block", rc.blockNumber);
}

main().catch(console.error);

메타데이터는 콘텐츠 해시 알고리즘, 암호화 방식, 소유자, 보존 정책을 함께 표현할 수 있다.

{
  "schemaVersion": "1.0.0",
  "businessKey": "PO-2025-000123",
  "contentHashAlgo": "SHA-256",
  "contentHashHex": "0x...",
  "encryption": {
    "algo": "AES-256-GCM",
    "kmsKeyId": "arn:aws:kms:ap-northeast-2:123:key/...",
    "encrypted": true
  },
  "owner": "did:example:12345",
  "tags": ["pharma", "batch", "gmp"],
  "retention": { "policy": "7y", "legalHold": false }
}

감사와 재현성 검증이 필요한 영역

공급망과 제조에서는 배치 생산 이력, 검사 결과, 출하 서류의 해시를 앵커링하고 인수인계 기록으로 책임 소재를 분명히 할 수 있다. 리콜 시 원인 규명 속도를 높이고, 무결성 위반이 확인되면 범위를 한정해 격리할 수 있다.

임상·라이프사이언스에서는 원시 데이터, CRF, 분석 코드의 출처를 추적하고 FDA/EMA 점검에 필요한 증적 패키지를 자동화할 수 있다. 민감 정보는 오프체인에서 암호화하고 체인에는 최소 앵커만 둔다.

ML 모델 거버넌스에서는 데이터셋, 스냅샷, 학습 파라미터, 모델 가중치의 해시를 연결해 재현 가능한 학습 라인을 구성한다. 릴리즈 승인 워크플로우와 롤백의 근거도 함께 남길 수 있다.

IoT와 로그 무결성에는 게이트웨이에서 배치 머클 루트를 앵커링하고 이벤트 드리븐 검증으로 변조를 탐지하는 방식을 적용한다. 장기 보관은 오프체인에서 수행하고, 온체인에는 주기적 타임스탬핑을 남긴다.

미디어 출처 증명에서는 C2PA와 연계해 캡처와 편집 체인의 서명·해시를 연결하고, 배포 시 뷰어가 자동 검증하도록 구성할 수 있다. 개인 프라이버시를 고려한다면 선택적 공개와 ZKP 도입을 검토한다.

운영 지표와 설계 선택의 균형

증적 자동화는 감사 리드타임을 3060% 단축할 수 있으며, 변경 불가 앵커링과 재현성 검증은 무결성 사고 건수를 50% 이상 줄이는 효과를 기대할 수 있다. 표준화된 증적 패키지는 외부 심사 준비 시간을 40% 절감하고, Chain of Custody 대시보드는 SLA 위반 탐지 시간 단축과 MTTR 2040% 개선에 기여한다.

이 효과를 유지하려면 키 관리와 프라이버시, 비용, 최종성을 함께 설계해야 한다. HSM/KMS 기반 서명과 키 롤오버 정책을 두고 ECDSA→EdDSA 전환 계획을 세운다. 온체인에는 최소 정보만 남기며, 솔트 있는 해시와 필요 시 ZKP/Commitment를 사용하고 재식별 위험을 주기적으로 평가한다.

비용과 성능은 머클 루트 기반 배치 앵커링, L2 활용, 이벤트 중심 설계로 조절한다. 확률적 최종성 체인에서는 n블록 대기와 재구성 모니터링이 필요하고, 프라이빗 체인은 합의 노드 장애에 대비해 이중화해야 한다. W3C DID/VC, EIP-712(서명), EIP-3668(CCIP Read) 같은 표준을 채택할 때는 표준 변화도 최신 정보로 확인한다.

운영 준비 항목

식별과 스키마 측면에서는 DID/PKI, 스키마 레지스트리, 버전 호환성 규칙을 먼저 정한다. 파이프라인에는 해시, 암호화, 스토리지, 온체인 커밋을 자동화하고 재시도와 역추적이 가능한 로그를 남긴다.

거버넌스는 역할 분리, 승인 워크플로우, 보존·폐기 정책, 주기적 무결성 감사를 위한 배치 작업을 포함한다. 블록 확정성, 스토리지 가용성, 해시 불일치 경보를 관측성 항목으로 관리하면 앵커링과 오프체인 저장소를 함께 운영할 수 있다.

블록체인데이터 거버넌스데이터 출처 추적연쇄 보관메타데이터