열람권
Right of Access
자신의 개인정보 처리 현황을 열람할 권리. GDPR 제15조, 개인정보보호법 제35조에서 보장.
Right of Access
자신의 개인정보 처리 현황을 열람할 권리. GDPR 제15조, 개인정보보호법 제35조에서 보장.
열람권(Right of Access)은 정보주체가 자신의 개인정보가 어떻게 처리되고 있는지 확인할 수 있는 기본적인 권리입니다. GDPR 제15조는 정보주체가 컨트롤러에게 자신의 개인정보 처리 여부와 처리 목적, 개인정보 유형, 수령인 정보, 보유 기간, 권리 행사 방법 등을 요청하고 무료로 사본을 받을 수 있다고 규정합니다. 한국 개인정보보호법 제35조 역시 동일한 권리를 보장합니다.
열람 요청 시 제공해야 하는 정보의 범위는 상당히 넓습니다. 처리 목적, 개인정보 범주, 제3자 제공 현황, 예정된 보유 기간, 정정/삭제/처리제한 요청권 안내, 감독기관 민원 제기 권리, 자동화된 의사결정 및 프로파일링 여부와 그 논리 등이 포함됩니다. 특히 AI 시스템이 자동화된 의사결정에 사용되는 경우, 그 논리와 정보주체에 대한 예상 결과를 "유의미한 정보"로 제공해야 합니다.
컨트롤러는 열람 요청을 받은 후 지체 없이, 늦어도 1개월 이내에 응답해야 합니다. 요청이 복잡하거나 건수가 많은 경우 2개월까지 연장 가능하나, 연장 사유를 1개월 내에 통지해야 합니다. 전자적 수단으로 요청받은 경우 일반적으로 사용되는 전자 형식(예: PDF, CSV)으로 제공해야 하며, 추가 사본 요청 시에는 합리적인 수수료를 부과할 수 있습니다.
열람권 행사 거부는 매우 제한적인 경우에만 가능합니다. 타인의 권리와 자유에 부정적 영향을 미치는 경우(예: 영업비밀, 제3자 개인정보 포함), 명백히 근거 없거나 과도한 요청의 경우에 한합니다. GDPR 위반 시 최대 2,000만 유로 또는 전 세계 매출의 4% 과징금이 부과될 수 있으며, 2024년 Meta는 열람권 요청 처리 지연으로 9,100만 유로 과징금을 부과받은 바 있습니다.
# 열람권(Subject Access Request) 처리 시스템 구현 예제
# GDPR Article 15 및 개인정보보호법 제35조 준수
from datetime import datetime, timedelta
from dataclasses import dataclass
from typing import Optional, List, Dict
import json
@dataclass
class AccessRequest:
"""열람 요청 데이터 구조"""
request_id: str
data_subject_id: str
request_date: datetime
requested_info: List[str] # 요청 정보 유형
status: str # pending, processing, completed, extended, rejected
due_date: datetime
extension_reason: Optional[str] = None
completed_date: Optional[datetime] = None
class SubjectAccessRequestHandler:
"""정보주체 열람권 요청 처리 시스템"""
STANDARD_DEADLINE_DAYS = 30 # GDPR 1개월
MAX_EXTENSION_DAYS = 60 # 최대 연장 시 총 2개월
def __init__(self, db_connection):
self.db = db_connection
def create_request(self, data_subject_id: str,
requested_info: List[str]) -> AccessRequest:
"""열람 요청 접수"""
request = AccessRequest(
request_id=f"SAR-{datetime.now().strftime('%Y%m%d%H%M%S')}",
data_subject_id=data_subject_id,
request_date=datetime.now(),
requested_info=requested_info,
status="pending",
due_date=datetime.now() + timedelta(days=self.STANDARD_DEADLINE_DAYS)
)
# 접수 확인 이메일 발송 (생략)
print(f"✅ 열람 요청 접수: {request.request_id}")
print(f" 응답 기한: {request.due_date.strftime('%Y-%m-%d')}")
return request
def gather_personal_data(self, data_subject_id: str) -> Dict:
"""정보주체의 모든 개인정보 수집 (GDPR Article 15 요건)"""
# 실제 구현 시 각 시스템에서 데이터 수집
personal_data = {
"기본정보": {
"처리 여부": True,
"처리 목적": ["서비스 제공", "고객 지원", "마케팅(동의 시)"],
"개인정보 범주": ["식별정보", "연락처", "거래내역", "서비스 이용기록"],
"보유 기간": "계약 종료 후 5년 (법적 의무)",
},
"수령인_정보": {
"제3자 제공": ["결제대행사(PG)", "배송업체", "클라우드 서비스(AWS)"],
"국외 이전": {
"여부": True,
"이전 국가": "미국(AWS)",
"안전장치": "표준계약조항(SCC) 체결"
}
},
"자동화된_의사결정": {
"사용 여부": True,
"적용 영역": "신용평가, 개인화 추천",
"논리 설명": "거래 이력과 행동 패턴을 분석하여 신용도 점수 산출",
"예상 영향": "신용 등급에 따라 할부 한도 차등 적용",
"이의제기_권리": "인간 담당자 검토 요청 가능"
},
"권리_안내": {
"정정권": "부정확한 정보 정정 요청 가능",
"삭제권": "특정 조건 하 삭제 요청 가능",
"처리제한권": "처리 일시 중단 요청 가능",
"이동권": "구조화된 형식으로 데이터 수령/이전 가능",
"감독기관_민원": "개인정보보호위원회에 민원 제기 가능"
},
"실제_데이터": {
"이름": "홍길동",
"이메일": "hong@example.com",
"전화번호": "010-1234-5678",
"가입일": "2022-03-15",
"최근_로그인": "2026-01-25",
"거래_건수": 47,
"마케팅_동의": False
}
}
return personal_data
def process_request(self, request: AccessRequest) -> Dict:
"""열람 요청 처리 및 응답 생성"""
request.status = "processing"
# 본인 확인 (생략 - 실제 구현 필요)
# 개인정보 수집
personal_data = self.gather_personal_data(request.data_subject_id)
# 응답 문서 생성
response = {
"요청_번호": request.request_id,
"요청일": request.request_date.isoformat(),
"응답일": datetime.now().isoformat(),
"정보주체_확인": "본인 확인 완료",
"개인정보_처리현황": personal_data,
"추가_사본_요청": "추가 사본 요청 시 1건당 1,000원 수수료 발생",
"문의처": "privacy@company.com"
}
request.status = "completed"
request.completed_date = datetime.now()
return response
def export_response(self, response: Dict, format: str = "json") -> str:
"""응답을 전자 형식으로 내보내기"""
if format == "json":
return json.dumps(response, ensure_ascii=False, indent=2)
# PDF, CSV 등 추가 형식 지원 가능
return json.dumps(response, ensure_ascii=False, indent=2)
# 사용 예시
handler = SubjectAccessRequestHandler(db_connection=None)
# 1. 열람 요청 접수
request = handler.create_request(
data_subject_id="user-12345",
requested_info=["기본정보", "자동화된_의사결정", "제3자_제공"]
)
# 2. 요청 처리
response = handler.process_request(request)
# 3. 결과 출력
print("\n" + "="*60)
print("📋 개인정보 열람 결과 (GDPR Article 15)")
print("="*60)
print(handler.export_response(response))
법무팀: "이번 달 SAR(Subject Access Request)이 급증했습니다. 30일 내 응답 기한을 맞추기 어려운 상황입니다."
개인정보 담당자: "GDPR에 따르면 복잡한 요청의 경우 2개월까지 연장 가능합니다. 단, 1개월 내에 연장 사유를 정보주체에게 통지해야 해요. 자동화된 SAR 처리 시스템 도입을 검토해야 할 것 같습니다."
법무팀: "AI 추천 시스템 관련 열람 요청이 많은데, 어디까지 공개해야 하나요?"
개인정보 담당자: "자동화된 의사결정에 사용된 논리를 '유의미한 정보'로 제공해야 합니다. 알고리즘 전체가 아니라 '어떤 데이터가 사용되고, 결과가 어떻게 영향을 미치는지' 수준이면 됩니다."
면접관: "열람권 요청을 거부할 수 있는 경우는 언제인가요?"
지원자: "매우 제한적입니다. 첫째, 타인의 권리와 자유에 부정적 영향을 미치는 경우입니다. 예를 들어 응답에 제3자의 개인정보가 포함되어 그 사람의 프라이버시를 침해할 때입니다. 둘째, 명백히 근거 없거나 과도한 요청, 예를 들어 동일인이 반복적으로 같은 요청을 하는 경우입니다. 다만 거부 시에도 그 사유를 정보주체에게 알리고, 감독기관에 민원 제기할 수 있음을 안내해야 합니다."
시니어: "SAR 응답에 로그인 기록이 포함되어 있는데, IP 주소도 개인정보라서 같이 제공해야 해요."
주니어: "IP 주소를 마스킹하면 안 되나요?"
시니어: "아뇨, 열람권은 정보주체 본인의 데이터를 있는 그대로 제공하는 것이에요. 단, 다른 사람의 IP가 섞여 있으면 그 부분은 익명화해야 합니다. 타인의 권리 보호와 본인 권리 보장의 균형이 중요해요."