WIA-LEG-009 · Phase 3 · 블록체인 통합

제6장: 3단계 블록체인 통합

암호학적 삭제 검증, 불변 감사 추적, 스마트 컨트랙트

6.1 Phase 3 개요

Phase 3은 블록체인 기술을 활용하여 삭제 작업의 검증 가능성과 투명성을 극대화합니다. 블록체인의 불변성(immutability)을 이용해 삭제가 실제로 수행되었다는 암호학적 증명을 제공하고, 모든 프로세스를 감사 가능한 형태로 기록합니다.

블록체인이 해결하는 문제

  • 신뢰 문제: "정말로 삭제했나요?" → 블록체인 증명으로 검증
  • 감사 추적: 모든 삭제 작업의 변경 불가능한 기록
  • 투명성: 규제 기관과 데이터 주체가 독립적으로 검증 가능
  • 책임성: 누가, 언제, 무엇을 삭제했는지 명확히 기록
  • 역사 보존: 삭제 기록은 영구 보존 (컴플라이언스 증명)

역설: 블록체인에 개인정보를 저장하지 않기

블록체인은 불변성을 가지므로, 개인정보 자체를 저장하면 절대 삭제할 수 없게 됩니다. 따라서 WIA-LEG-009는 개인정보의 암호학적 해시만 저장합니다. 해시는 원본 데이터를 복원할 수 없지만, 삭제를 증명하는 데는 충분합니다.

6.2 암호학적 삭제 증명

해시 기반 증명 메커니즘

삭제 증명은 다음 단계로 작동합니다:

  1. 삭제 전 해시 생성: 삭제할 데이터의 SHA-256 해시를 계산
    before_hash = SHA256(user_data + salt + timestamp)
  2. 삭제 실행: 실제 데이터베이스에서 데이터 삭제
  3. 삭제 후 해시 생성: 데이터가 없음을 나타내는 해시 생성
    after_hash = SHA256("DELETED" + deletion_timestamp + request_id)
  4. 블록체인 기록: 두 해시와 메타데이터를 블록체인에 기록
블록체인 레코드 구조
{
  "request_id": "rtbf_20250101_abc123",
  "data_subject_hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
  "deletion_proof": {
    "before_hash": "a1b2c3d4e5f6...",
    "after_hash": "0000000000000...",
    "algorithm": "SHA-256",
    "salt": "random_salt_xyz"
  },
  "timestamp": "2025-01-30T15:30:00Z",
  "executor": "0x1234567890abcdef...",
  "systems_affected": [
    {
      "system": "customer_database",
      "records_deleted": 1,
      "hash": "db_hash_abc..."
    },
    {
      "system": "analytics_platform",
      "records_deleted": 245,
      "hash": "analytics_hash_def..."
    }
  ],
  "transaction_hash": "0xabcdef123456...",
  "block_number": 15678912
}

검증 프로세스

누구나 다음 단계로 삭제를 검증할 수 있습니다:

// 1. 블록체인에서 레코드 조회
const record = await blockchain.getTransaction(transaction_hash);

// 2. 삭제 증명 검증
const isValid = verifyDeletionProof(record.deletion_proof);

// 3. 타임스탬프 확인
const deletedWithinDeadline = record.timestamp <= deadline;

// 4. 완전성 확인
const allSystemsProcessed = record.systems_affected.length === expected_systems;

6.3 스마트 컨트랙트

삭제 증명을 자동화하고 무결성을 보장하기 위해 스마트 컨트랙트를 사용합니다.

Solidity 스마트 컨트랙트 예시

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

contract WIA_LEG_009_RightToBeForgotten {

    struct DeletionRecord {
        string requestId;
        bytes32 dataSubjectHash;
        bytes32 beforeHash;
        bytes32 afterHash;
        uint256 timestamp;
        address executor;
        string[] systemsAffected;
        bool verified;
    }

    mapping(string => DeletionRecord) public deletionRecords;
    mapping(bytes32 => bool) public deletedDataSubjects;

    event DeletionRecorded(
        string indexed requestId,
        bytes32 indexed dataSubjectHash,
        uint256 timestamp
    );

    event DeletionVerified(
        string indexed requestId,
        address indexed verifier
    );

    modifier onlyAuthorized() {
        require(
            isAuthorizedExecutor(msg.sender),
            "Not authorized"
        );
        _;
    }

    function recordDeletion(
        string memory requestId,
        bytes32 dataSubjectHash,
        bytes32 beforeHash,
        bytes32 afterHash,
        string[] memory systemsAffected
    ) public onlyAuthorized {
        require(
            deletionRecords[requestId].timestamp == 0,
            "Record already exists"
        );

        deletionRecords[requestId] = DeletionRecord({
            requestId: requestId,
            dataSubjectHash: dataSubjectHash,
            beforeHash: beforeHash,
            afterHash: afterHash,
            timestamp: block.timestamp,
            executor: msg.sender,
            systemsAffected: systemsAffected,
            verified: false
        });

        deletedDataSubjects[dataSubjectHash] = true;

        emit DeletionRecorded(requestId, dataSubjectHash, block.timestamp);
    }

    function verifyDeletion(
        string memory requestId
    ) public view returns (bool) {
        DeletionRecord memory record = deletionRecords[requestId];

        // 검증 로직
        require(record.timestamp > 0, "Record not found");
        require(record.afterHash != bytes32(0), "Invalid after hash");

        return true;
    }

    function getDeletionRecord(
        string memory requestId
    ) public view returns (DeletionRecord memory) {
        return deletionRecords[requestId];
    }

    function isDataSubjectDeleted(
        bytes32 dataSubjectHash
    ) public view returns (bool) {
        return deletedDataSubjects[dataSubjectHash];
    }

    function isAuthorizedExecutor(
        address executor
    ) internal view returns (bool) {
        // WIA 인증된 조직만 허용
        // 실제 구현에서는 화이트리스트 또는 NFT 기반 인증 사용
        return true; // 간소화된 예시
    }
}

스마트 컨트랙트 호출

import { ethers } from 'ethers';

const contract = new ethers.Contract(
  contractAddress,
  contractABI,
  signer
);

// 삭제 기록
const tx = await contract.recordDeletion(
  "rtbf_20250101_abc123",
  ethers.utils.keccak256(ethers.utils.toUtf8Bytes("user@example.com")),
  beforeHash,
  afterHash,
  ["customer_database", "analytics_platform"]
);

await tx.wait();
console.log(`Deletion recorded in block ${tx.blockNumber}`);

6.4 블록체인 선택 가이드

블록체인 장점 단점 권장 사용
Ethereum • 가장 큰 생태계
• 성숙한 스마트 컨트랙트
• 높은 탈중앙화
• 높은 가스비
• 낮은 처리량 (15 TPS)
고가치 거래, 최대 보안
Polygon • 낮은 가스비
• Ethereum 호환
• 빠른 처리 (7000 TPS)
• Ethereum보다 낮은 탈중앙화 대량 요청 처리, 비용 중시
Hyperledger Fabric • 프라이빗 체인
• 권한 관리
• 가스비 없음
• 퍼블릭 검증 불가
• 복잡한 설정
기업 내부, 컨소시엄
Solana • 매우 빠름 (65,000 TPS)
• 낮은 비용
• 작은 생태계
• 중앙화 논란
초고속 처리 필요 시

WIA 권장: Polygon (레이어2)

WIA-LEG-009는 Polygon을 기본 권장합니다:

  • 가스비 $0.001 미만 (Ethereum의 1/1000)
  • 2초 이내 블록 확정
  • Ethereum과 동일한 보안 모델
  • 기존 Ethereum 도구 사용 가능

6.5 불변 시스템에서의 삭제: GDPR 역설 해결

문제: 블록체인은 데이터를 영구 보존하는데, GDPR은 삭제를 요구합니다. 어떻게 이 모순을 해결할까요?

1. 해시만 저장 (권장)

개인정보 자체는 저장하지 않고, 암호학적 해시만 저장합니다. 해시는 개인정보로 간주되지 않으므로 GDPR 위반이 아닙니다.

2. 암호학적 삭제 (Cryptographic Erasure)

데이터를 암호화하여 저장하고, 삭제 시 암호화 키를 파기합니다. 암호문은 블록체인에 남지만, 키가 없으면 복호화 불가능합니다.

// 저장 시
const encrypted = AES.encrypt(personalData, encryptionKey);
blockchain.store(encrypted);

// 삭제 시
securelyDeleteKey(encryptionKey);
// 이제 encrypted는 복호화 불가능 = 사실상 삭제됨

3. Off-Chain 저장 + On-Chain 해시

개인정보는 IPFS나 일반 데이터베이스에 저장하고, 해시만 블록체인에 기록합니다. 삭제 시 원본만 삭제합니다.

// 저장
const ipfsHash = await ipfs.add(personalData);
const blockchainHash = SHA256(ipfsHash);
blockchain.store(blockchainHash);

// 삭제
await ipfs.remove(ipfsHash);
// 블록체인에는 해시만 남음 (원본 복원 불가)

6.6 분산 감사 추적

블록체인을 사용한 완전한 감사 추적 시스템:

타임라인 기록

// 블록체인에 기록되는 전체 타임라인
[
  {
    "event": "request_created",
    "timestamp": "2025-01-01T10:30:00Z",
    "block": 15678900,
    "tx": "0xabc123..."
  },
  {
    "event": "identity_verified",
    "timestamp": "2025-01-01T10:35:00Z",
    "block": 15678920,
    "tx": "0xdef456...",
    "verification_method": "email_otp"
  },
  {
    "event": "legal_review_completed",
    "timestamp": "2025-01-02T09:00:00Z",
    "block": 15680000,
    "tx": "0xghi789...",
    "decision": "approved"
  },
  {
    "event": "deletion_started",
    "timestamp": "2025-01-02T10:00:00Z",
    "block": 15680100,
    "tx": "0xjkl012..."
  },
  {
    "event": "system_deleted",
    "timestamp": "2025-01-02T10:15:00Z",
    "block": 15680150,
    "tx": "0xmno345...",
    "system": "customer_database",
    "records_deleted": 1
  },
  {
    "event": "deletion_completed",
    "timestamp": "2025-01-02T11:00:00Z",
    "block": 15680300,
    "tx": "0xpqr678...",
    "total_records": 246,
    "total_systems": 5
  }
]

규제 기관 검증

규제 기관(예: ICO, CNIL, ANPD)은 블록체인 탐색기를 통해 독립적으로 삭제 기록을 검증할 수 있습니다:

// 공개 검증 API
GET https://blockchain-explorer.wia.org/deletion/{request_id}

Response:
{
  "request_id": "rtbf_20250101_abc123",
  "status": "completed",
  "blockchain_proofs": [
    {
      "network": "polygon",
      "transaction": "0xabcdef...",
      "block": 15680300,
      "confirmations": 1000000,
      "verified": true
    }
  ],
  "timeline": [...],
  "certificate_ipfs": "QmXyz..."
}

6.7 비용 및 확장성

가스비 추정 (Polygon 기준)

작업 가스 사용량 비용 (MATIC = $0.50)
삭제 기록 (recordDeletion) ~100,000 gas $0.0005
검증 (verifyDeletion) ~50,000 gas (읽기 전용) 무료 (읽기)
타임라인 이벤트 기록 ~30,000 gas $0.0002

월간 10,000건 요청 시 예상 비용:
10,000 × $0.0005 = $5/월 (매우 저렴!)

확장성 전략

  • 배치 처리: 여러 삭제 기록을 하나의 트랜잭션으로 묶기
  • 레이어2 사용: Polygon, Optimism, Arbitrum 등
  • State Channels: 대량 업데이트 후 최종 상태만 기록
  • Rollups: 수천 개의 트랜잭션을 하나로 압축

6.8 구현 예시: 전체 플로우

// 1. 삭제 실행 (백엔드)
async function executeDeletion(requestId) {
  // 1.1 데이터 삭제 전 해시 계산
  const userData = await db.getUserData(userId);
  const beforeHash = sha256(JSON.stringify(userData));

  // 1.2 실제 삭제 수행
  const deletionResults = await Promise.all([
    db.deleteUser(userId),
    analytics.deleteUserData(userId),
    backups.purgeUserBackups(userId)
  ]);

  // 1.3 삭제 후 해시 계산
  const afterHash = sha256(`DELETED_${requestId}_${Date.now()}`);

  // 1.4 블록체인에 기록
  const tx = await contract.recordDeletion(
    requestId,
    sha256(userEmail),
    beforeHash,
    afterHash,
    ["database", "analytics", "backups"]
  );

  await tx.wait();

  return {
    success: true,
    blockchainTx: tx.hash,
    blockNumber: tx.blockNumber
  };
}

// 2. 검증 (프론트엔드 또는 제3자)
async function verifyDeletion(requestId) {
  const record = await contract.getDeletionRecord(requestId);

  if (!record || record.timestamp === 0) {
    throw new Error("Deletion record not found");
  }

  // 블록체인 확인
  const blockConfirmations = await getConfirmations(record.transactionHash);

  return {
    verified: true,
    timestamp: new Date(record.timestamp * 1000),
    systemsAffected: record.systemsAffected,
    executor: record.executor,
    confirmations: blockConfirmations,
    blockExplorer: `https://polygonscan.com/tx/${record.transactionHash}`
  };
}

6.9 다음 단계

이 장에서는 블록체인 기반의 검증 가능한 삭제 시스템을 살펴보았습니다. 다음 장에서는 WIA 생태계의 다른 표준들과의 통합인 Phase 4를 다룹니다.