CHAPTER 06

๐Ÿท๏ธ Data Classification & Tagging

๋ฐ์ดํ„ฐ ๋ถ„๋ฅ˜, PII ํƒ์ง€, ํƒœ๊ทธ ์ „๋žต

6.1 ๋ฐ์ดํ„ฐ ๋ถ„๋ฅ˜๋ž€?

Data Classification(๋ฐ์ดํ„ฐ ๋ถ„๋ฅ˜)๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด์•ˆ ์ˆ˜์ค€, ๊ทœ์ œ ์š”๊ตฌ์‚ฌํ•ญ, ๋น„์ฆˆ๋‹ˆ์Šค ์ค‘์š”๋„์— ๋”ฐ๋ผ ๋ฒ”์ฃผํ™”ํ•˜๋Š” ํ”„๋กœ์„ธ์Šค์ž…๋‹ˆ๋‹ค.

๐Ÿ’ก ๋ถ„๋ฅ˜์˜ ๋ชฉ์ 
  • ๋ณด์•ˆ: ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ์— ์ ์ ˆํ•œ ๋ณดํ˜ธ ์กฐ์น˜ ์ ์šฉ
  • ๊ทœ์ œ ์ค€์ˆ˜: GDPR, CCPA ๋“ฑ ๋ฒ•์  ์š”๊ตฌ์‚ฌํ•ญ ์ถฉ์กฑ
  • ๋ฆฌ์Šคํฌ ๊ด€๋ฆฌ: ๋ฐ์ดํ„ฐ ์œ ์ถœ ์‹œ ์˜ํ–ฅ๋„ ํ‰๊ฐ€
  • ์ ‘๊ทผ ์ œ์–ด: ๋ˆ„๊ฐ€ ์–ด๋–ค ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๊ฒฐ์ •

6.2 ๋ฐ์ดํ„ฐ ๋ถ„๋ฅ˜ ์ฒด๊ณ„

๋ถ„๋ฅ˜ ์„ค๋ช… ์˜ˆ์‹œ ๋ณด์•ˆ ์ˆ˜์ค€
PUBLIC ๊ณต๊ฐœ ๋ฐ์ดํ„ฐ ํšŒ์‚ฌ ์†Œ๊ฐœ, ๊ณต๊ฐœ API ๋ฌธ์„œ ๋‚ฎ์Œ
INTERNAL ๋‚ด๋ถ€ ์‚ฌ์šฉ ๋ฐ์ดํ„ฐ ์กฐ์ง๋„, ๋‚ด๋ถ€ ์œ„ํ‚ค ์ค‘๊ฐ„
CONFIDENTIAL ๊ธฐ๋ฐ€ ๋ฐ์ดํ„ฐ ๋งค์ถœ ๋ฐ์ดํ„ฐ, ์ „๋žต ๊ณ„ํš ๋†’์Œ
RESTRICTED ์ œํ•œ ๋ฐ์ดํ„ฐ ๊ฐœ์ธ์ •๋ณด, ๊ธˆ์œต ์ •๋ณด ๋งค์šฐ ๋†’์Œ

6.3 ์ฃผ์š” ๋ฐ์ดํ„ฐ ๋ถ„๋ฅ˜ ์œ ํ˜•

1) PII (Personally Identifiable Information)

๊ฐœ์ธ์„ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๋Š” ์ •๋ณด

2) Financial Data

๊ธˆ์œต ๊ด€๋ จ ๋ฏผ๊ฐ ์ •๋ณด

3) PHI (Protected Health Information)

๊ฑด๊ฐ• ๊ด€๋ จ ๋ณดํ˜ธ ์ •๋ณด (HIPAA ๊ทœ์ œ)

4) Business Critical

๋น„์ฆˆ๋‹ˆ์Šค ํ•ต์‹ฌ ์ •๋ณด

6.4 ์ž๋™ ๋ถ„๋ฅ˜ (Auto-Classification)

๋ถ„๋ฅ˜ ๊ทœ์น™ ๊ธฐ๋ฐ˜

PII ํƒ์ง€ ๊ทœ์น™ ์˜ˆ์‹œ:
{
  "classification": "PII",
  "rules": [
    {
      "rule_type": "COLUMN_NAME_PATTERN",
      "patterns": ["email", "phone", "ssn", "address", "name", "birth"],
      "confidence": 0.8
    },
    {
      "rule_type": "DATA_PATTERN",
      "pattern": "\\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Z|a-z]{2,}\\b",
      "description": "Email pattern",
      "confidence": 0.95
    },
    {
      "rule_type": "DATA_PATTERN",
      "pattern": "\\d{3}-\\d{4}-\\d{4}",
      "description": "Korean phone number",
      "confidence": 0.9
    }
  ]
}

ML ๊ธฐ๋ฐ˜ ๋ถ„๋ฅ˜

๋จธ์‹ ๋Ÿฌ๋‹ ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ ๋‚ด์šฉ์„ ๋ถ„์„ํ•˜๊ณ  ์ž๋™์œผ๋กœ ๋ถ„๋ฅ˜ํ•ฉ๋‹ˆ๋‹ค.

  1. ๋ฐ์ดํ„ฐ ํ”„๋กœํŒŒ์ผ๋ง: ์ƒ˜ํ”Œ ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘ ๋ฐ ๋ถ„์„
  2. ํŒจํ„ด ํ•™์Šต: ์ด๋ฏธ ๋ถ„๋ฅ˜๋œ ๋ฐ์ดํ„ฐ๋กœ ๋ชจ๋ธ ํ•™์Šต
  3. ์ž๋™ ์ถ”๋ก : ์ƒˆ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด ๋ถ„๋ฅ˜ ์˜ˆ์ธก
  4. ์‹ ๋ขฐ๋„ ํ‰๊ฐ€: ๋ถ„๋ฅ˜ ์ •ํ™•๋„ ์ ์ˆ˜ ์ œ๊ณต
๐Ÿ’ก ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์ ‘๊ทผ
  • ๊ทœ์น™ ๊ธฐ๋ฐ˜: ๋ช…ํ™•ํ•œ ํŒจํ„ด (์ด๋ฉ”์ผ, ์ „ํ™”๋ฒˆํ˜ธ)
  • ML ๊ธฐ๋ฐ˜: ์• ๋งคํ•œ ๊ฒฝ์šฐ (์ž์œ  ํ…์ŠคํŠธ, ๋ณต์žกํ•œ ํŒจํ„ด)
  • ์‚ฌ๋žŒ ๊ฒ€์ฆ: ์‹ ๋ขฐ๋„ ๋‚ฎ์€ ๊ฒฝ์šฐ ๋ฆฌ๋ทฐ ์š”์ฒญ

6.5 ํƒœ๊น… ์ „๋žต

ํƒœ๊ทธ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์œ ์—ฐํ•˜๊ฒŒ ๋ถ„๋ฅ˜ํ•˜๊ณ  ์กฐ์งํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

ํƒœ๊ทธ ์นดํ…Œ๊ณ ๋ฆฌ

์นดํ…Œ๊ณ ๋ฆฌ ๋ชฉ์  ์˜ˆ์‹œ
Domain ๋น„์ฆˆ๋‹ˆ์Šค ๋„๋ฉ”์ธ customer, product, sales, marketing
Team ์†Œ์œ  ํŒ€ data-team, analytics-team, eng-team
Quality ๋ฐ์ดํ„ฐ ํ’ˆ์งˆ gold, silver, bronze
Compliance ๊ทœ์ œ ์ค€์ˆ˜ gdpr, ccpa, pci-dss, hipaa
Environment ํ™˜๊ฒฝ prod, staging, dev
Usage ์‚ฌ์šฉ ๋ชฉ์  analytics, reporting, ml-training

ํƒœ๊ทธ ๋ช…๋ช… ๊ทœ์น™

ํƒœ๊ทธ ํ‘œ์ค€:
โœ… ์ข‹์€ ์˜ˆ:
- customer-domain
- data-team
- gdpr-compliant
- high-quality

โŒ ๋‚˜์œ ์˜ˆ:
- Customer Domain (๊ณต๋ฐฑ ํฌํ•จ)
- DataTeam (CamelCase)
- GDPR_COMPLIANT (์–ธ๋”์Šค์ฝ”์–ด, ๋Œ€๋ฌธ์ž)
- high quality (๊ณต๋ฐฑ)

6.6 PII ์ž๋™ ํƒ์ง€

Python ์˜ˆ์‹œ ์ฝ”๋“œ

import re
from typing import List, Dict

def detect_pii(column_name: str, sample_values: List[str]) -> Dict:
    """
    ์ปฌ๋Ÿผ๋ช…๊ณผ ์ƒ˜ํ”Œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„์„ํ•˜์—ฌ PII๋ฅผ ํƒ์ง€ํ•ฉ๋‹ˆ๋‹ค.
    """
    pii_patterns = {
        'email': r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b',
        'phone': r'\d{3}-\d{4}-\d{4}',
        'ssn': r'\d{6}-\d{7}',
        'credit_card': r'\d{4}-\d{4}-\d{4}-\d{4}'
    }

    # ์ปฌ๋Ÿผ๋ช… ์ฒดํฌ
    pii_keywords = ['email', 'phone', 'ssn', 'address', 'name', 'birth']
    column_match = any(keyword in column_name.lower() for keyword in pii_keywords)

    # ๋ฐ์ดํ„ฐ ํŒจํ„ด ์ฒดํฌ
    pattern_matches = {}
    for pii_type, pattern in pii_patterns.items():
        matches = sum(1 for value in sample_values if re.search(pattern, str(value)))
        if matches > 0:
            pattern_matches[pii_type] = matches / len(sample_values)

    is_pii = column_match or len(pattern_matches) > 0

    return {
        'is_pii': is_pii,
        'column_match': column_match,
        'pattern_matches': pattern_matches,
        'confidence': calculate_confidence(column_match, pattern_matches)
    }

# ์‚ฌ์šฉ ์˜ˆ์‹œ
result = detect_pii(
    'customer_email',
    ['john@example.com', 'jane@company.com', 'alice@domain.com']
)

print(result)
# {'is_pii': True, 'column_match': True,
#  'pattern_matches': {'email': 1.0}, 'confidence': 0.95}

6.7 ๋ณด์•ˆ ์ •์ฑ… ์ ์šฉ

๋ถ„๋ฅ˜๋ณ„ ์ž๋™ ์กฐ์น˜

๋ถ„๋ฅ˜ ์ž๋™ ์กฐ์น˜
PII - ์•”ํ˜ธํ™” ํ•„์ˆ˜
- ์ ‘๊ทผ ๋กœ๊ทธ ํ™œ์„ฑํ™”
- ๋งˆ์Šคํ‚น ์ ์šฉ (๋น„ํ”„๋กœ๋•์…˜)
FINANCIAL - ๊ฐ์‚ฌ ์ถ”์  ํ™œ์„ฑํ™”
- ์ œํ•œ๋œ ์ ‘๊ทผ ๊ถŒํ•œ
- ๋ฐ์ดํ„ฐ ๋ณด์กด ์ •์ฑ… ์ ์šฉ
PUBLIC - ์ œํ•œ ์—†์Œ
โš ๏ธ ์ฃผ์˜์‚ฌํ•ญ
  • ์ž๋™ ๋ถ„๋ฅ˜์˜ ์ •ํ™•๋„๋Š” 100%๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค
  • ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ๋Š” ๋ฐ˜๋“œ์‹œ ์‚ฌ๋žŒ์ด ๊ฒ€์ฆํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค
  • ๊ณผ๋„ํ•œ ๋ถ„๋ฅ˜๋Š” ์—…๋ฌด ํšจ์œจ์„ ์ €ํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค
  • ์ •๊ธฐ์ ์ธ ๋ถ„๋ฅ˜ ์žฌ๊ฒ€ํ† ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค

6.8 ๊ทœ์ œ ์ค€์ˆ˜

GDPR ์ค€์ˆ˜

CCPA (California Consumer Privacy Act)

6.9 ์‹ค์ „ ๊ตฌํ˜„

์ž๋™ ๋ถ„๋ฅ˜ ํŒŒ์ดํ”„๋ผ์ธ:
1. ์Šค์บ” ๋‹จ๊ณ„
   - ์ƒˆ ํ…Œ์ด๋ธ”/์ปฌ๋Ÿผ ๊ฐ์ง€
   - ์ƒ˜ํ”Œ ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘ (์ƒ์œ„ 1000ํ–‰)

2. ๋ถ„์„ ๋‹จ๊ณ„
   - ์ปฌ๋Ÿผ๋ช… ํŒจํ„ด ๋งค์นญ
   - ๋ฐ์ดํ„ฐ ํŒจํ„ด ๋ถ„์„
   - ML ๋ชจ๋ธ ์ถ”๋ก 

3. ๋ถ„๋ฅ˜ ๋‹จ๊ณ„
   - ์‹ ๋ขฐ๋„ >= 90%: ์ž๋™ ๋ถ„๋ฅ˜
   - ์‹ ๋ขฐ๋„ 70-89%: ๋ฆฌ๋ทฐ ํ์— ์ถ”๊ฐ€
   - ์‹ ๋ขฐ๋„ < 70%: ์ˆ˜๋™ ๋ถ„๋ฅ˜ ์š”์ฒญ

4. ์ ์šฉ ๋‹จ๊ณ„
   - ๋ถ„๋ฅ˜ ํƒœ๊ทธ ๋ถ€์—ฌ
   - ๋ณด์•ˆ ์ •์ฑ… ์ ์šฉ
   - ์•Œ๋ฆผ ๋ฐœ์†ก

5. ๋ชจ๋‹ˆํ„ฐ๋ง
   - ๋ถ„๋ฅ˜ ์ •ํ™•๋„ ์ถ”์ 
   - ํ”ผ๋“œ๋ฐฑ ์ˆ˜์ง‘
   - ๋ชจ๋ธ ์žฌํ•™์Šต

6.10 ๋‹ค์Œ ์žฅ ์˜ˆ๊ณ 

๋‹ค์Œ ์žฅ์—์„œ๋Š” ํ”Œ๋žซํผ๋ณ„ ํ™œ์šฉ๋ฒ•์„ ๋‹ค๋ฃน๋‹ˆ๋‹ค. Apache Atlas, DataHub, Collibra ๋“ฑ ์ฃผ์š” ๋ฐ์ดํ„ฐ ์นดํƒˆ๋กœ๊ทธ ํ”Œ๋žซํผ์˜ ํŠน์ง•๊ณผ ํ™œ์šฉ๋ฒ•์„ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค.