WIA-LEG-009 · Phase 1 · 데이터 형식

제4장: 1단계 데이터 형식

JSON Schema, 요청 유형, 그리고 검증 메커니즘

4.1 Phase 1 개요

WIA-LEG-009의 첫 번째 단계는 표준화된 데이터 형식을 정의합니다. 모든 잊힐 권리 요청은 동일한 JSON 구조를 따르며, 이는 시스템 간 상호운용성의 기초가 됩니다.

Phase 1의 목표

  • 전 세계 어디서나 이해할 수 있는 공통 데이터 언어 확립
  • 수동 처리에서도 사용 가능한 명확한 구조 제공
  • 자동 검증이 가능한 JSON Schema 정의
  • 미래 확장을 위한 유연성 확보

구현 난이도

Phase 1은 가장 낮은 진입 장벽을 가집니다. 기존 시스템을 최소한으로 수정하면서 표준을 채택할 수 있으며, 수동 프로세스에도 적용 가능합니다.

4.2 기본 요청 구조

모든 삭제 요청은 다음의 최상위 필드를 포함합니다:

{
  "wia_standard": "WIA-LEG-009",
  "version": "1.0",
  "request_id": "rtbf_20250101_abc123def456",
  "request_type": "deletion",
  "timestamp": "2025-01-01T10:30:00Z",
  "data_subject": { ... },
  "legal_basis": "GDPR_Article_17_1a",
  "scope": { ... },
  "verification": { ... },
  "metadata": { ... }
}

필드 설명

필드 타입 필수 설명
wia_standard string 필수 항상 "WIA-LEG-009"
version string 필수 표준 버전 (현재 "1.0")
request_id string 필수 고유 요청 식별자 (UUID 권장)
request_type enum 필수 "deletion", "rectification", "restriction"
timestamp string 필수 ISO 8601 형식의 요청 시간
data_subject object 필수 데이터 주체 정보
legal_basis string 필수 법적 근거 (GDPR, CCPA 등)
scope object 필수 삭제 범위 정의
verification object 선택 신원 확인 정보
metadata object 선택 추가 메타데이터

4.3 데이터 주체 (Data Subject)

data_subject 객체는 삭제를 요청하는 개인을 식별합니다.

{
  "data_subject": {
    "email": "john.doe@example.com",
    "identifiers": [
      {
        "type": "user_id",
        "value": "user_12345"
      },
      {
        "type": "customer_id",
        "value": "CUST-67890"
      }
    ],
    "name": {
      "given_name": "John",
      "family_name": "Doe"
    },
    "phone": "+1-555-123-4567",
    "address": {
      "country": "US",
      "region": "CA",
      "postal_code": "94102"
    },
    "date_of_birth": "1985-03-15"
  }
}

식별자 (Identifiers)

identifiers 배열은 시스템 내에서 사용자를 찾기 위한 다양한 식별자를 포함합니다. 일반적인 식별자 유형:

  • user_id: 내부 사용자 ID
  • customer_id: 고객 번호
  • account_number: 계좌 번호
  • social_security_number: 주민등록번호/사회보장번호
  • passport_number: 여권 번호
  • license_number: 면허 번호

개인정보 최소화 원칙

데이터 주체 정보는 식별에 필요한 최소한만 포함해야 합니다. 예를 들어, 이메일만으로 충분히 식별 가능하다면 주소나 생년월일은 제공하지 않는 것이 좋습니다.

4.4 법적 근거 (Legal Basis)

legal_basis 필드는 삭제 요청의 법적 근거를 명시합니다. 표준화된 코드를 사용하여 자동 처리를 가능하게 합니다.

GDPR 법적 근거 코드

코드 Article 설명
GDPR_Article_17_1a 17(1)(a) 목적 달성 - 데이터가 더 이상 필요하지 않음
GDPR_Article_17_1b 17(1)(b) 동의 철회 - 처리 근거 소멸
GDPR_Article_17_1c 17(1)(c) 정당한 반대 - 처리에 대한 이의 제기
GDPR_Article_17_1d 17(1)(d) 불법 처리 - 위법하게 처리됨
GDPR_Article_17_1e 17(1)(e) 법적 의무 - 법률 준수를 위한 삭제
GDPR_Article_17_1f 17(1)(f) 아동 정보 - 정보사회 서비스 관련 수집

기타 규정 법적 근거

  • CCPA_Section_1798.105: CCPA 삭제권
  • CPRA_Section_1798.105: CPRA 개정 삭제권
  • LGPD_Article_18_VI: LGPD 삭제권
  • PIPA_Article_36: 한국 개인정보 보호법
  • APPI_Article_29: 일본 개인정보 보호법
{
  "legal_basis": "GDPR_Article_17_1a",
  "jurisdiction": "EU",
  "regulation_reference": {
    "name": "General Data Protection Regulation",
    "article": "17(1)(a)",
    "url": "https://gdpr.eu/article-17-right-to-be-forgotten/"
  }
}

4.5 삭제 범위 (Scope)

scope 객체는 삭제할 데이터의 범위를 정의합니다.

{
  "scope": {
    "data_categories": [
      "personal_data",
      "transaction_history",
      "communication_records"
    ],
    "systems": [
      "customer_database",
      "analytics_platform",
      "email_marketing"
    ],
    "time_range": {
      "start": "2020-01-01T00:00:00Z",
      "end": "2025-01-01T00:00:00Z"
    },
    "exceptions": [
      {
        "category": "financial_records",
        "reason": "legal_retention_requirement",
        "retention_until": "2030-12-31T23:59:59Z"
      }
    ],
    "include_backups": true,
    "include_logs": true,
    "include_third_parties": true
  }
}

데이터 카테고리

표준 데이터 카테고리 분류:

  • personal_data: 이름, 주소, 연락처 등 기본 개인정보
  • sensitive_data: 민감 정보 (건강, 종교, 성적 취향 등)
  • financial_data: 금융 거래, 카드 정보, 계좌
  • transaction_history: 구매 내역, 서비스 이용 기록
  • communication_records: 이메일, 채팅, 통화 기록
  • behavioral_data: 브라우징 히스토리, 클릭 패턴
  • location_data: GPS 위치, IP 주소
  • biometric_data: 지문, 얼굴 인식 데이터
  • user_generated_content: 게시글, 댓글, 리뷰

삭제 예외 (Exceptions)

법적 의무, 공익, 또는 계약상 이유로 삭제할 수 없는 데이터를 명시합니다. 투명성을 위해 예외 사유와 보관 기간을 명확히 기록해야 합니다.

4.6 신원 확인 (Verification)

데이터 주체의 신원을 확인하기 위한 정보를 포함합니다.

{
  "verification": {
    "method": "email_otp",
    "token": "123456",
    "verified_at": "2025-01-01T10:25:00Z",
    "ip_address": "192.168.1.100",
    "user_agent": "Mozilla/5.0 ...",
    "additional_factors": [
      {
        "type": "sms_otp",
        "verified_at": "2025-01-01T10:26:00Z"
      }
    ],
    "identity_document": {
      "type": "passport",
      "document_number": "A12345678",
      "issuing_country": "US",
      "verification_method": "manual_review"
    }
  }
}

검증 방법

  • email_otp: 이메일로 전송된 OTP 코드
  • sms_otp: SMS로 전송된 OTP 코드
  • oauth: OAuth 2.0 인증
  • identity_document: 신분증 확인
  • biometric: 생체 인증
  • knowledge_based: 질문-응답 기반 인증
  • certified_mail: 우편 인증

다중 인증 (MFA) 권장

민감한 데이터나 대량의 데이터를 삭제하는 경우, 다중 인증(Multi-Factor Authentication)을 사용하여 요청자의 신원을 더 강력하게 확인해야 합니다.

4.7 JSON Schema 정의

자동 검증을 위한 완전한 JSON Schema:

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "$id": "https://wia.org/schemas/rtbf/v1.0/request.json",
  "title": "WIA-LEG-009 Right to Be Forgotten Request",
  "type": "object",
  "required": [
    "wia_standard",
    "version",
    "request_id",
    "request_type",
    "timestamp",
    "data_subject",
    "legal_basis",
    "scope"
  ],
  "properties": {
    "wia_standard": {
      "type": "string",
      "const": "WIA-LEG-009"
    },
    "version": {
      "type": "string",
      "pattern": "^\\d+\\.\\d+(\\.\\d+)?$"
    },
    "request_id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 100
    },
    "request_type": {
      "type": "string",
      "enum": ["deletion", "rectification", "restriction"]
    },
    "timestamp": {
      "type": "string",
      "format": "date-time"
    },
    "data_subject": {
      "type": "object",
      "required": ["email"],
      "properties": {
        "email": {
          "type": "string",
          "format": "email"
        },
        "identifiers": {
          "type": "array",
          "items": {
            "type": "object",
            "required": ["type", "value"],
            "properties": {
              "type": {"type": "string"},
              "value": {"type": "string"}
            }
          }
        }
      }
    },
    "legal_basis": {
      "type": "string",
      "pattern": "^(GDPR|CCPA|CPRA|LGPD|PIPA|APPI)_.*$"
    },
    "scope": {
      "type": "object",
      "required": ["data_categories"],
      "properties": {
        "data_categories": {
          "type": "array",
          "items": {"type": "string"},
          "minItems": 1
        },
        "systems": {
          "type": "array",
          "items": {"type": "string"}
        }
      }
    }
  }
}

Schema 사용 예시 (TypeScript)

import Ajv from 'ajv';
import addFormats from 'ajv-formats';
import schema from './rtbf-schema.json';

const ajv = new Ajv();
addFormats(ajv);

const validate = ajv.compile(schema);

const request = {
  wia_standard: "WIA-LEG-009",
  version: "1.0",
  request_id: "rtbf_20250101_abc123",
  // ... 나머지 필드
};

const valid = validate(request);
if (!valid) {
  console.error(validate.errors);
}

4.8 요청 유형

WIA-LEG-009는 세 가지 주요 요청 유형을 지원합니다:

1. Deletion (삭제)

완전한 데이터 제거. 가장 일반적인 잊힐 권리 요청.

{
  "request_type": "deletion",
  "deletion_method": "hard_delete",  // "hard_delete" 또는 "anonymize"
  "cascade_delete": true  // 연관 데이터도 삭제할지 여부
}

2. Rectification (정정)

부정확한 데이터를 수정. GDPR Article 16에 근거.

{
  "request_type": "rectification",
  "corrections": [
    {
      "field": "email",
      "current_value": "old@example.com",
      "new_value": "new@example.com"
    }
  ]
}

3. Restriction (처리 제한)

삭제 대신 데이터 처리를 제한. GDPR Article 18에 근거.

{
  "request_type": "restriction",
  "restriction_type": "freeze",  // "freeze" 또는 "archive"
  "restriction_reason": "dispute_accuracy",
  "restriction_duration": "pending_verification"
}

4.9 완전한 요청 예시

완전한 예시{
  "wia_standard": "WIA-LEG-009",
  "version": "1.0",
  "request_id": "rtbf_20250101_abc123def456",
  "request_type": "deletion",
  "timestamp": "2025-01-01T10:30:00Z",

  "data_subject": {
    "email": "john.doe@example.com",
    "identifiers": [
      {"type": "user_id", "value": "user_12345"},
      {"type": "customer_id", "value": "CUST-67890"}
    ],
    "name": {
      "given_name": "John",
      "family_name": "Doe"
    }
  },

  "legal_basis": "GDPR_Article_17_1a",
  "jurisdiction": "EU",

  "scope": {
    "data_categories": [
      "personal_data",
      "transaction_history",
      "communication_records"
    ],
    "systems": ["customer_database", "analytics_platform"],
    "include_backups": true,
    "include_logs": true,
    "include_third_parties": true,
    "exceptions": [
      {
        "category": "financial_records",
        "reason": "legal_retention_requirement",
        "retention_until": "2030-12-31T23:59:59Z"
      }
    ]
  },

  "verification": {
    "method": "email_otp",
    "verified_at": "2025-01-01T10:25:00Z",
    "ip_address": "192.168.1.100"
  },

  "metadata": {
    "user_locale": "en-US",
    "user_timezone": "America/Los_Angeles",
    "submission_channel": "web_portal"
  }
}

4.10 다음 단계

이 장에서는 WIA-LEG-009 Phase 1의 데이터 형식 표준을 상세히 살펴보았습니다. 다음 장에서는 이 데이터 형식을 HTTP API를 통해 프로그래밍 방식으로 처리하는 Phase 2를 다룹니다.