개인정보는 애플리케이션 로그에 숨어 있습니다
앱 로그는 엔지니어링에서 가장 간과되는 GDPR 접점 중 하나입니다. 엔지니어들이 법을 무시해서가 아닙니다. 사용자 정보가 로그 파일에 우연히 들어가기 때문입니다.
단일 JSON 요청 로그에 네 개의 개인정보 필드가 있을 수 있습니다:
{
"timestamp": "2025-11-14T09:22:13Z",
"level": "ERROR",
"endpoint": "/api/users/profile",
"user_email": "sarah.johnson@company.com",
"client_ip": "82.123.45.67",
"user_agent": "Mozilla/5.0",
"error": "ValidationError: phone format",
"input_value": "+49 176 1234 5678"
}
이 단일 항목에는 이메일, IP, 전화번호가 있습니다. 하루 수백만 건의 API 호출에 걸쳐 곱하면 결과는 대규모 개인정보 처리 활동입니다. 법적 근거, 제한, 통제가 필요합니다.
제3자 로그 공유는 GDPR 위험을 높입니다
팀들은 항상 로그 파일을 외부 당사자와 공유합니다:
- 펜 테스트 회사가 앱 동작 매핑을 위한 기록을 받습니다
- 외부 컨설턴트가 느린 지점 파악을 위해 로그 샘플을 사용합니다
- 로그 플랫폼 (Elastic, Datadog, Splunk)이 전체 출력 스트림을 수신합니다
- SRE 계약업체가 사고 중 기록에 접근합니다
- 다른 법인의 개발 팀이 디버깅을 위해 파일을 받습니다
각 공유는 GDPR 제28조 질문을 제기합니다. 수신자가 처리자입니까? 데이터 처리 계약이 있습니까? 해당 파일의 사용자 세부 정보를 볼 법적 근거가 있습니까?
로그 플랫폼은 일반적인 공백입니다. 실제 사용자 이메일과 IP가 포함된 출력을 Elastic Cloud나 Datadog에 전송하면 처리 연결이 생성됩니다. 그 연결에는 DPA, 표준 조항, 플랫폼이 EU 외부에 있는 경우 이전 수단이 필요합니다. 각각 시간과 법적 검토가 필요합니다.
더 간단한 방법: 파일이 시스템을 떠나기 전에 사용자 세부 정보를 제거하세요. 전체 제28조 규칙은 컴플라이언스 개요를 참조하세요.
JSON 구조가 탐지를 어렵게 만드는 이유
JSON 로그 파일의 구조는 다양합니다. 일반 텍스트 스캔으로는 충분하지 않습니다.
중첩 깊이: 사용자 세부 정보가 어느 깊이에나 나타납니다. request.headers.x-forwarded-for 필드가 IP 주소를 보유합니다. response.body.errors[0].field_value 필드가 사용자 입력을 포함할 수 있습니다. 평면 텍스트 스캔은 중첩된 경로에 묻힌 필드를 놓칩니다.
일관성 없는 스키마: 각 API 엔드포인트는 자체 출력 형태를 생성합니다. 인증 파일은 결제 파일과 다르게 생겼습니다. 프로필 업데이트 파일은 둘 다와 다릅니다. 고정 경로 접근 방식은 오류 맥락에서 이상한 경로에 나타나는 사용자 세부 정보를 놓칩니다.
개인정보와 혼합된 기술 값: 스택 추적, 오류 코드, 타임스탬프는 그대로 있어야 합니다. 무분별한 제거는 필요한 필드를 지우고 파일을 쓸모없게 만듭니다.
올바른 접근 방식은 콘텐츠 기반 탐지입니다. 사용자 세부 정보를 위치가 아닌 그 자체로 찾습니다 — 이메일 패턴, IP 형식, 명명된 엔터티. 엔드포인트별 설정 없이 가변 스키마를 처리합니다.
일관된 교체가 로그를 유용하게 유지합니다
핵심 요구 사항은 참조 무결성입니다. sarah.johnson@company.com이 요청 체인 전체에서 47개 항목에 나타나면 47개 모두 같은 값으로 매핑되어야 합니다.
매핑 규칙:
sarah.johnson@company.com→user1@example.com(파일 전체에서 같은 값)82.123.45.67→192.0.2.1(RFC 5737 문서용 IP — 명백히 실제가 아님)+49 176 1234 5678→+49 XXX XXX XXXX(마스킹)
이 매핑으로 개발자는 47개 항목에서 user1@example.com을 추적하고, 요청 체인을 재구성하고, 버그를 수정할 수 있습니다 — 실제 사용자 세부 정보를 보지 않고.
이 메타데이터 필드는 변경되지 않습니다:
- 타임스탬프 (사용자 데이터 아님)
- 오류 코드 및 유형 (사용자 데이터 아님)
- 스택 추적 (기술 ID를 포함할 수 있음, 사용자 데이터 아님)
- HTTP 메서드, 경로, 상태 코드 (사용자 데이터 아님)
- 메트릭 값 및 지연 수치 (사용자 데이터 아님)
결과는 디버그 작업에 사용할 수 있는 파일입니다. 실제 사용자 세부 정보가 없습니다. GDPR 하에서 익명화와 가명 처리의 차이는 용어집을 참조하세요.
사용 사례: 펜 테스트 로그 공유
SaaS 회사가 외부 펜 테스트 팀과 분기별 보안 검토를 진행했습니다. 범위에는 인증 흐름 매핑과 오류 패턴 분석을 위해 90일간의 프로덕션 API 출력이 필요했습니다.
원시 규모: 180MB의 JSON 파일. 개인정보 수: 4,200개의 고유 사용자 이메일, 1,800개의 고유 IP, 오류 맥락에서 340개의 부분 계좌 번호.
사용자 세부 정보를 먼저 제거하지 않고 해당 파일을 공유하면 필요한 것:
- 펜 테스트 회사와의 DPA
- GDPR 제46조 이전 수단 (회사가 EU 외부에 있음)
- 정보 주체 통지 검토
각각 법적 작업과 시간을 추가합니다.
개인정보 제거 적용 후:
- 처리 시간: 180MB에 25분
- 출력: 구조적으로 동일한 180MB 파일, 모든 이메일과 IP가 안전한 값으로 교체
- 결과: 펜 테스트 팀이 전체 컨텍스트를 받음; 실제 사용자 세부 정보가 도달하지 않음
- GDPR 결과: DPA 불필요 — 제거된 출력은 GDPR 하에서 사용자 데이터가 아님
GDPR 하에서 무엇이 익명에 해당하는지에 관한 일반적인 질문은 FAQ를 참조하세요.
CI/CD에 개인정보 제거 통합하기
정기적으로 출력을 공유하는 팀의 경우 이 단계는 기존 파이프라인 내에서 실행할 수 있습니다.
로그 순환:
- 순환 스크립트가 매일 밤 실행됩니다
- 제거 단계가 아카이브 또는 로그 플랫폼 전송 전에 실행됩니다
- 제거된 파일이 외부 시스템으로 전송됩니다
- 원본 파일이 전체 보존으로 내부에 유지됩니다
공유 전 스크립트:
- 엔지니어가 계약업체와 샘플을 공유해야 합니다
- 스크립트 실행:
input=raw-logs/ output=clean-logs/ clean-logs/폴더 공유- 수동 개인정보 검토 불필요
사이드카 접근 방식:
- 사이드카가 전달 전 출력 스트림을 제거합니다
- 실시간 제거가 로그 분석의 유용성을 유지합니다
- 플랫폼이 실제 사용자 세부 정보를 받지 않습니다
보존 정책 통합
GDPR 제5조(1)(e)는 저장 제한을 요구합니다. 개인정보 제거가 모든 보존 정책에 맞습니다.
- 원시 출력 7일 보관 (일상적인 디버그 작업용)
- 제거된 버전 90일 보관 (추세 분석 및 사고 검토용)
- 제거 단계가 7일차에 실행됩니다
이것이 저장 제한을 충족합니다. 장기간 원시 출력 보관의 위험을 제거합니다.