당신의 개인정보처리방침에 외부 처리자에 대해 단언하는 문장이 있습니까? 있다면 그 근거는 계약서입니까, 아니면 "대충 그렇게 동작하겠지"라는 인상입니까?
저는 후자였습니다. 그리고 그 문장이 3개월 넘게 라이브로 나가 있었습니다.
이름 없는 메일
아침에 메일이 하나 왔습니다. 익명 별칭 주소였고, 실명도 소속도 서명도 없었습니다. 규제기관도 아니고 스토어도 아니고 사용자도 아니었습니다. 요구사항도 기한도 없었고, 마지막은 "이미 다 처리되어 있다면 무시해도 된다"로 끝났습니다.
내용은 제 앱 하나(피부 반응 기록 앱)에 대한 EU 규제 지적 11가지였습니다. 의료기기 해당성, GDPR 제9조, EU 대리인, DPIA, DSA 사업자 신고까지.
이런 메일의 첫 반응은 보통 둘 중 하나입니다. 무시하거나, 겁먹거나. 저는 세 번째를 택했습니다. 인용문을 전부 실물과 대조하는 것.
결과가 인상적이었습니다. 메일이 인용한 문장 전부가 제 라이브 정책과 스토어 설명에 한 글자도 틀리지 않게 존재했습니다. "Eczema & Acne Trigger Diary", "Flara is not a medical device", 0–100 스킨 스코어, 30일 히트맵 — 전부 실제 파일에 그대로 있었습니다.
즉 이 사람은 진짜로 읽고 썼습니다. 그러면 지적도 진짜인지 확인해야 합니다.
11개 중 9개는 닫을 수 없었습니다
솔직하게 말하면 대부분은 제가 문구로 대응할 수 있는 항목이 아니었습니다.
의료기기 해당성은 전문가 판단 영역입니다. DPIA를 했는지, EU 대리인을 지정했는지, 각 미국 처리자에 대해 어떤 전송 메커니즘을 쓰는지 — 이건 제가 "확인해서 고칠" 종류가 아니라 사실이거나 아니거나인 것들입니다. 안 했으면 안 한 겁니다.
그래서 남은 2개에 집중했습니다. 그리고 그 2개가 아팠습니다.
첫 번째: "요청 후 즉시 폐기"
제 정책에 이 문장이 있었습니다.
Each request is processed and discarded; Anthropic does not retain your data beyond the request.
처리자 표에도 같은 내용이 있었습니다. Deleted after each request.
문제는 이게 사실이 아니라는 것입니다. 상용 API의 기본 보존은 "요청 후 즉시 폐기"가 아니라 30일 내 삭제입니다. 즉시 폐기는 별도 승인이 필요한 무보존(zero data retention) 계약을 맺은 경우에만 성립합니다. 저는 그 계약이 없습니다.
이건 GDPR 논의로 갈 필요도 없습니다. 지키지 못하는 약속을 문서에 적어 놓은 것이고, 그냥 거짓입니다.
왜 이렇게 썼는지 기억을 더듬어 보면, 악의는 없었습니다. "우리 서버는 저장하지 않는다"가 사실이었고, 그 감각이 처리자 쪽으로 미끄러진 것입니다. 우리 인프라에 대한 사실을 남의 인프라에 대한 단언으로 옮겨 쓴 것이 사고의 형태였습니다.
두 번째: "anonymized"
정책과 스토어 설명이 AI로 보내는 데이터를 일관되게 "anonymized"라고 불렀습니다. 이건 절반만 맞습니다.
코드를 열어 확인했습니다. 전송 페이로드를 만드는 빌더는 이메일도, 이름도, 계정 식별자도 넣지 않습니다. 거기까지는 문서와 일치했습니다.
그런데 들어가는 것이 이렇습니다.
skin_condition: 자가보고 질환명
recent_reaction_logs: 날짜 + 증상 중증도
food_logs: 날짜 + 음식명 + 성분
cosmetic_logs: 날짜 + 제품명 + 성분
weather_logs: 날짜 + 기온·습도·UV
wellness_logs: 날짜 + 스트레스·수면날짜가 붙은 30일치 건강 기록입니다. 그리고 스키마를 보면 모든 로그 테이블이 이렇습니다.
user_id UUID NOT NULL REFERENCES auth.users ON DELETE CASCADE행 수준 보안도 user_id = auth.uid()입니다. 원본은 계정에 묶여 있고, 생성된 인사이트는 다시 계정으로 저장됩니다. 재연결이 구조적으로 가능합니다. 이건 익명이 아니라 가명처리입니다.
직접 식별자를 제거하는 것은 좋은 데이터 최소화입니다. 그게 데이터를 익명으로 만들지는 않습니다.
더 나쁜 곳에 같은 문장이 있었습니다
플릿 전체를 훑었습니다. 같은 보존 문구가 4개 앱 정책에 있었고, 여기서 진짜로 불편한 것을 찾았습니다.
다른 앱 하나(PCOS 추적 앱)의 온보딩 동의 화면에 이 불릿이 있었습니다.
Data is used only to generate your response and then discarded
14개 언어로요. 그리고 그 앱은 사용자가 타이핑한 AI 채팅 메시지를 입력한 그대로 전송합니다. 요약도 아닙니다.
정책 페이지의 거짓말과 동의 화면의 거짓말은 무게가 다릅니다. 동의 화면은 사용자가 "그렇다면 동의한다"고 판단하는 근거입니다. 그 판단의 전제가 틀렸다면 동의 자체가 흔들립니다.
여기서 당신이라면 어떻게 하겠습니까? 정책 페이지만 조용히 고치겠습니까, 아니면 14개 언어 번역과 앱 릴리스까지 가겠습니까?
고치면서 배운 세 가지
하나. 감사 도구가 오탐합니다. "폐기" 계열 단어로 플릿을 훑었더니 5건이 걸렸는데, 열어 보니 태국어 "음식을 더 이상 버리지 않습니다", 베트남어 "트리거 음식을 제거합니다" 같은 것들이었습니다. 전부 무관했습니다. 단어 매칭으로 컴플라이언스를 판정하면 없는 문제를 고치느라 시간을 씁니다.
둘. 정확한 문장은 건드리면 안 됩니다. 다른 네 개 앱은 이렇게 쓰고 있었습니다.
Anthropic does not retain prompts for model training.
이건 사실입니다. 비슷하게 생겼다고 같이 "고치면" 맞는 문장을 틀리게 만듭니다. 일괄 치환의 유혹이 가장 위험한 지점이었습니다.
셋. 한 곳만 고치면 고친 척이 됩니다. 정책 페이지를 먼저 고쳤더니 같은 사이트의 지원 페이지가 여전히 "anonymized"였습니다. 같은 주장이 사는 곳이 네 군데입니다 — 웹 정책 본문, 앱 내 동의 문구(전 로케일), 스토어 설명(전 로케일), 그리고 플랫폼 개인정보 라벨. 네 곳이 같은 판정을 따르지 않으면 스스로 모순됩니다.
결과
교체한 문구는 이렇습니다.
표준 상용 API 약관상 요청 입력·출력은 30일 내에 삭제됩니다. 이 앱은 무보존 계약을 보유하지 않으므로 이 30일 창이 적용됩니다.
그리고 왜 익명이 아닌지를 한 줄 추가했습니다.
직접 식별자는 전송 전에 제거되지만, 원본 로그는 우리 시스템에서 계정에 묶여 있고 생성된 결과도 계정으로 되돌아 저장됩니다. 따라서 여전히 개인정보입니다.
문구가 길어지고 덜 매력적으로 들립니다. 그게 정확합니다.
솔직한 부분
11개 중 9개는 여전히 열려 있습니다. 특히 제9조 근거를 정책에 적으려면 "건강 데이터 저장에 대한 명시적 동의" 단계가 앱에 실제로 있어야 하는데, 현재는 AI 공유 동의만 있습니다. 없는 절차를 정책에 적으면 방금 지운 것과 똑같은 종류의 거짓 진술을 새로 만드는 것입니다. 그래서 쓰지 않았습니다. 이건 문구가 아니라 제품을 고쳐야 하는 항목입니다.
컨트롤러 주소, EU 대리인 유무, DPIA 수행 여부도 제가 모르는 사실이라 지어낼 수 없었습니다. 컴플라이언스 문서를 "그럴듯하게" 채우는 것은 비어 있는 것보다 나쁩니다.
그리고 제보자에게는 답장하지 않았습니다. 익명 주소에 "MDR 평가는 했다/안 했다", "무보존 계약은 없다"를 확인해 주는 것은 상대에게 근거를 넘겨주는 일이라고 판단했습니다. 지적은 고쳤고, 회신은 하지 않았습니다. 이게 옳은 판단이었는지는 아직 모르겠습니다.
3분 자가진단
당신의 정책을 지금 열어서 이 세 개를 확인해 보세요.
- 외부 처리자의 보존 기간을 단언하는 문장을 찾으세요. 그 숫자의 출처가 당신이 서명한 문서입니까?
- "anonymized"라고 쓴 데이터를 찾으세요. 그 데이터의 원본 테이블에 사용자 외래키가 있습니까? 있으면 그건 가명처리입니다.
- 같은 주장이 웹 정책·앱 내 문구·스토어 설명·플랫폼 라벨 네 곳에서 같은 말을 하고 있습니까?
2번이 30초면 끝납니다. 스키마 한 번만 보면 되니까요. 그 30초가 저에게는 3개월 늦었습니다.
혹시 1번에서 뭔가 걸리셨다면, 그 문장을 언제 왜 그렇게 썼는지 기억나시는지 들어보고 싶습니다 — 제 경우엔 악의가 아니라 미끄러짐이었고, 그래서 더 오래 살아남았습니다.