6.1 Phase 3 개요
Phase 3은 블록체인 기술을 활용하여 삭제 작업의 검증 가능성과 투명성을 극대화합니다. 블록체인의 불변성(immutability)을 이용해 삭제가 실제로 수행되었다는 암호학적 증명을 제공하고, 모든 프로세스를 감사 가능한 형태로 기록합니다.
블록체인이 해결하는 문제
- 신뢰 문제: "정말로 삭제했나요?" → 블록체인 증명으로 검증
- 감사 추적: 모든 삭제 작업의 변경 불가능한 기록
- 투명성: 규제 기관과 데이터 주체가 독립적으로 검증 가능
- 책임성: 누가, 언제, 무엇을 삭제했는지 명확히 기록
- 역사 보존: 삭제 기록은 영구 보존 (컴플라이언스 증명)
역설: 블록체인에 개인정보를 저장하지 않기
블록체인은 불변성을 가지므로, 개인정보 자체를 저장하면 절대 삭제할 수 없게 됩니다. 따라서 WIA-LEG-009는 개인정보의 암호학적 해시만 저장합니다. 해시는 원본 데이터를 복원할 수 없지만, 삭제를 증명하는 데는 충분합니다.
6.2 암호학적 삭제 증명
해시 기반 증명 메커니즘
삭제 증명은 다음 단계로 작동합니다:
-
삭제 전 해시 생성: 삭제할 데이터의 SHA-256 해시를 계산
before_hash = SHA256(user_data + salt + timestamp) - 삭제 실행: 실제 데이터베이스에서 데이터 삭제
-
삭제 후 해시 생성: 데이터가 없음을 나타내는 해시 생성
after_hash = SHA256("DELETED" + deletion_timestamp + request_id) - 블록체인 기록: 두 해시와 메타데이터를 블록체인에 기록
{
"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를 다룹니다.