적정성 결정
Adequacy Decision
제3국의 개인정보 보호 수준이 적정한지 판단하는 결정. GDPR 제45조에 따라 EU 집행위원회가 평가.
Adequacy Decision
제3국의 개인정보 보호 수준이 적정한지 판단하는 결정. GDPR 제45조에 따라 EU 집행위원회가 평가.
적정성 결정(Adequacy Decision)은 GDPR 제45조에 따라 EU 집행위원회가 제3국(EU/EEA 외 국가)의 개인정보 보호 수준이 EU와 동등하다고 인정하는 공식 결정입니다. 적정성 결정을 받은 국가로의 데이터 이전은 별도의 보호조치 없이 자유롭게 허용됩니다. 2024년 기준 한국을 포함하여 안도라, 아르헨티나, 캐나다(상업부문), 영국, 일본 등 14개 국가/지역이 적정성 결정을 받았습니다.
EU 집행위원회는 적정성 결정 시 GDPR 제45조 제2항에서 정한 평가 기준을 적용합니다. 법의 지배, 인권 존중, 독립적인 감독기관 존재, 국제 협약 가입 여부 등을 종합 검토합니다. 특히 해당 국가의 개인정보 보호법이 목적 제한, 최소 수집, 보관 기간 제한, 보안 조치, 제3자 이전 제한, 정보주체 권리 보장 등 GDPR의 핵심 원칙을 반영하는지 평가합니다.
한국은 2021년 12월 17일 EU 집행위원회로부터 적정성 결정을 획득했습니다. 개인정보보호법의 2020년 개정으로 독립적인 개인정보보호위원회 설립, 정보주체 권리 강화, 처리 원칙 명확화 등이 반영되어 인정받았습니다. 이로써 한국 기업은 EU 시민의 개인정보를 추가적인 보호장치(SCC, BCR 등) 없이 직접 이전받을 수 있게 되었습니다.
적정성 결정은 영구적이지 않으며, EU 집행위원회는 최소 4년마다 정기 검토를 수행합니다(GDPR 제45조 제3항). 해당 국가의 법률 변경이나 관행 변화로 보호 수준이 저하되면 결정이 수정, 정지, 또는 철회될 수 있습니다. 미국의 경우 Safe Harbor(2015년 무효화), Privacy Shield(2020년 무효화)를 거쳐 2023년 EU-US Data Privacy Framework로 세 번째 적정성 결정을 받았습니다.
"""
GDPR Article 45 Adequacy Decision 기반 국외 데이터 이전 검증 시스템
EU 집행위원회의 적정성 결정 현황(2024년 기준)을 반영한 구현
"""
from dataclasses import dataclass
from datetime import datetime
from enum import Enum
from typing import Optional
class TransferMechanism(Enum):
"""GDPR Chapter V 데이터 이전 메커니즘"""
ADEQUACY_DECISION = "adequacy_decision" # Art 45: 적정성 결정
SCC = "standard_contractual_clauses" # Art 46(2)(c): 표준계약조항
BCR = "binding_corporate_rules" # Art 47: 구속력 있는 기업규칙
DEROGATION = "specific_derogation" # Art 49: 특정 상황 예외
@dataclass
class AdequacyDecision:
"""EU 집행위원회 적정성 결정 정보"""
country: str
decision_date: datetime
scope: str # "full" or "partial"
sector_limitation: Optional[str]
review_due: datetime
class GDPRTransferValidator:
"""
GDPR Chapter V 국외 이전 검증기
적정성 결정 국가 목록은 2024년 EU 집행위원회 공식 목록 기준
"""
# Art 45(1): 적정성 결정을 받은 국가/지역 (2024년 기준)
ADEQUACY_COUNTRIES = {
"KR": AdequacyDecision(
country="Republic of Korea",
decision_date=datetime(2021, 12, 17),
scope="full",
sector_limitation=None,
review_due=datetime(2025, 12, 17)
),
"JP": AdequacyDecision(
country="Japan",
decision_date=datetime(2019, 1, 23),
scope="full",
sector_limitation=None,
review_due=datetime(2023, 1, 23) # 검토 완료
),
"GB": AdequacyDecision(
country="United Kingdom",
decision_date=datetime(2021, 6, 28),
scope="full",
sector_limitation=None,
review_due=datetime(2025, 6, 27)
),
"US": AdequacyDecision(
country="United States",
decision_date=datetime(2023, 7, 10),
scope="partial",
sector_limitation="DPF_certified_organizations",
review_due=datetime(2024, 7, 10)
),
"CA": AdequacyDecision(
country="Canada",
decision_date=datetime(2001, 12, 20),
scope="partial",
sector_limitation="PIPEDA_covered_commercial",
review_due=datetime(2024, 12, 20)
),
"CH": AdequacyDecision(
country="Switzerland",
decision_date=datetime(2000, 8, 26),
scope="full",
sector_limitation=None,
review_due=datetime(2024, 8, 26)
),
"NZ": AdequacyDecision(
country="New Zealand",
decision_date=datetime(2012, 12, 19),
scope="full",
sector_limitation=None,
review_due=datetime(2024, 12, 19)
),
"IL": AdequacyDecision(
country="Israel",
decision_date=datetime(2011, 1, 31),
scope="full",
sector_limitation=None,
review_due=datetime(2024, 1, 31)
),
"AR": AdequacyDecision(
country="Argentina",
decision_date=datetime(2003, 6, 30),
scope="full",
sector_limitation=None,
review_due=datetime(2024, 6, 30)
),
}
# EEA 국가 (GDPR 직접 적용)
EEA_COUNTRIES = {
"AT", "BE", "BG", "HR", "CY", "CZ", "DK", "EE", "FI", "FR",
"DE", "GR", "HU", "IE", "IT", "LV", "LT", "LU", "MT", "NL",
"PL", "PT", "RO", "SK", "SI", "ES", "SE", # EU 27
"IS", "LI", "NO" # EEA (비EU)
}
def validate_transfer(
self,
source_country: str,
destination_country: str,
data_categories: list[str],
recipient_type: str = "controller"
) -> dict:
"""
GDPR Chapter V에 따른 데이터 이전 적법성 검증
Args:
source_country: 데이터 출발국 (ISO 3166-1 alpha-2)
destination_country: 데이터 도착국
data_categories: 이전되는 개인정보 유형
recipient_type: 수신자 유형 (controller/processor)
"""
result = {
"transfer_allowed": False,
"mechanism": None,
"conditions": [],
"warnings": [],
"legal_basis": None
}
# EEA 내 이전: 자유 이동 보장
if destination_country in self.EEA_COUNTRIES:
result["transfer_allowed"] = True
result["mechanism"] = "EEA_internal"
result["legal_basis"] = "GDPR Art 1(3): 자유로운 개인정보 이동"
return result
# 적정성 결정 국가 확인
if destination_country in self.ADEQUACY_COUNTRIES:
adequacy = self.ADEQUACY_COUNTRIES[destination_country]
# 부분 적정성 결정 검증 (미국, 캐나다)
if adequacy.scope == "partial":
result["conditions"].append(
f"이전 대상이 {adequacy.sector_limitation} 요건을 충족해야 함"
)
if destination_country == "US":
result["conditions"].append(
"수신자가 Data Privacy Framework 인증을 받았는지 확인 필요"
)
# 검토 기한 경고
if adequacy.review_due < datetime.now():
result["warnings"].append(
f"적정성 결정 정기 검토 기한({adequacy.review_due.strftime('%Y-%m-%d')}) 경과"
)
result["transfer_allowed"] = True
result["mechanism"] = TransferMechanism.ADEQUACY_DECISION.value
result["legal_basis"] = (
f"GDPR Art 45(1): {adequacy.country} 적정성 결정 "
f"({adequacy.decision_date.strftime('%Y-%m-%d')})"
)
return result
# 적정성 결정 없는 국가: 대안 메커니즘 필요
result["transfer_allowed"] = False
result["mechanism"] = "additional_safeguards_required"
result["legal_basis"] = "GDPR Art 46: 적절한 보호조치 필요"
result["conditions"] = [
"표준계약조항(SCC) 체결 필요 (Art 46(2)(c))",
"구속력 있는 기업규칙(BCR) 승인 필요 (Art 47)",
"또는 제49조 예외 사유 확인 필요"
]
# 민감정보 이전 시 추가 경고
sensitive_categories = {"health", "biometric", "genetic", "racial", "political"}
if any(cat in data_categories for cat in sensitive_categories):
result["warnings"].append(
"특수범주 개인정보(Art 9) 이전 시 이전영향평가(TIA) 필수"
)
return result
def get_transfer_impact_assessment_requirements(
self,
destination_country: str
) -> list[str]:
"""
Schrems II 판결에 따른 이전영향평가(TIA) 요건
적정성 결정 없는 국가로 이전 시 필수
"""
if destination_country in self.EEA_COUNTRIES:
return []
if destination_country in self.ADEQUACY_COUNTRIES:
return ["적정성 결정으로 TIA 면제 (단, 지속적 모니터링 권고)"]
return [
"1. 이전 대상 개인정보 유형 및 민감도 분석",
"2. 수신국 법률 환경 평가 (정보기관 접근권 등)",
"3. 계약적 보호조치 실효성 검토",
"4. 추가 기술적 보호조치 필요성 판단 (암호화 등)",
"5. 정기적 재평가 일정 수립"
]
# 사용 예시
if __name__ == "__main__":
validator = GDPRTransferValidator()
# 한국으로의 데이터 이전 검증
result = validator.validate_transfer(
source_country="DE",
destination_country="KR",
data_categories=["contact", "purchase_history"],
recipient_type="processor"
)
print(f"이전 허용: {result['transfer_allowed']}")
print(f"법적 근거: {result['legal_basis']}")
# 출력: 이전 허용: True
# 출력: 법적 근거: GDPR Art 45(1): Republic of Korea 적정성 결정 (2021-12-17)