d3ro-voice/docs/v3/play/02-data-safety-draft.md
2026-08-29 18:33:45 +09:00

27 KiB

Data safety 초안

제출 원칙

이 문서는 현재 Android 코드와 공개 개인정보처리방침을 바탕으로 만든 보수적 초안이다. Google Play의 Data safety는 특정 사용자 한 명의 기본 흐름이 아니라 Play에서 배포하는 모든 활성 버전·지역·연령의 데이터 처리를 합산해 답해야 한다. release AAB의 최종 SDK/manifest, 운영 provider 설정, 계약상 service-provider 지위와 실제 네트워크 흐름을 확인하기 전에는 제출하지 않는다.

상태 기준:

  • 확정: 코드 또는 Google SDK 공식 disclosure로 데이터 흐름이 확인됨
  • 후보: 현재 정보로 선택할 답변안
  • 검증 필요: 실제 release/provider 증거에 따라 답이 바뀔 수 있음
  • 보수적 fallback: 검증을 끝내지 못했다면 더 넓게 공개할 답

Console 상위 질문

질문 답변안 상태·근거
앱이 필수 사용자 데이터 유형을 수집하거나 공유하는가? 확정. 계정·콘텐츠·광고·결제·기기 등록이 존재
전송 중 데이터가 암호화되는가? 후보. release는 cleartext를 막음(apps/mobile-rn/android/app/build.gradle:372-379). 실제 release endpoint와 provider 전체가 HTTPS인지 재검증
사용자가 데이터 삭제를 요청할 수 있는가? 확정. 앱 내 삭제와 외부 요청 경로 존재
계정 생성 기능이 있는가? 확정. 이메일/OAuth 가입 제공
독립적인 보안 검토를 받았는가? 아니요 인증된 독립 보안 표준·배지가 실제로 생기기 전에는 선택 금지
Families 정책을 따르기로 약정하는가? 아니요/해당 없음 타깃 연령 후보는 18세 이상이며 아동 대상 앱이 아님

데이터 유형별 입력 초안

공유는 단순히 외부 서버로 전송하는지와 다르다. Google이 인정하는 service-provider, 사용자 주도 전송 등 예외가 성립하는지는 계약과 실제 사용 목적을 증명해야 한다. 아래에서 아니요*는 그 예외가 입증될 때만 유효하다.

Google Play 데이터 유형 수집 공유 목적 후보 선택/필수 일시 처리 판단·증거
대략적 위치 광고, 분석, 사기 방지·보안 필수(광고가 활성인 Free 흐름) 아니요 확정. Google Mobile Ads SDK가 IP 주소를 자동 수집·공유하고 일반 위치 추정에 사용할 수 있음
정확한 위치 아니요 아니요 위치 permission과 기능이 없음. release merged manifest 재확인
이름 아니요* 앱 기능, 계정 관리, 팀 협업 필수(가입 프로필) 아니요 가입 표시 이름·프로필. Supabase service-provider 예외와 팀원에게 보이는 사용자 주도 공유 범위 검증
이메일 주소 아니요* 앱 기능, 계정 관리, 팀 초대, 보안 필수(계정) 아니요 이메일 로그인/OAuth와 팀 초대. 인증·메일 provider 계약 검증
사용자 ID 아니요* 앱 기능, 계정 관리, 사기 방지·보안 필수 아니요 Supabase user UUID, 팀/결제/보상/기기 owner ID
기타 개인정보 아니요* 앱 기능, 개인화, 계정 관리 필수/일부 선택 아니요 locale, 테마, 모델 선호, tier, 팀 역할 등. Console 질문에서 이 범주 적용 여부 최종 대조
주소·전화번호·인종/민족·정치/종교·성적 지향 아니요 아니요 현재 모바일 기능에서 요청하지 않음. reviewer/support 폼과 provider가 추가 수집하지 않는지 확인
사용자 결제 정보 아니요 아니요 카드 번호는 앱이 수집·저장하지 않고 Google Play 결제 UI가 처리. Android 앱에서 별도 결제 수단을 추가하면 재평가
구매 내역 아니요* 앱 기능, 계정 관리, 사기 방지·보안 선택(구매 사용자) 아니요 상품 ID, purchase token, 거래/구독 상태를 서버 검증·보관. Google Play와의 전송이 공유 예외인지 최종 대조
건강·피트니스 정보 아니요 아니요 관련 기능/permission 없음
이메일 또는 문자 메시지 아니요 아니요 사람 간 메신저가 없음. 팀 초대 주소와 내용이 이 유형에 해당하는지 Console 정의를 다시 확인
사진 아니요 아니요 사진 선택·업로드 기능 없음
동영상 아니요* 앱 기능 선택 아니요 video/mp4 가져오기를 지원하고 전사에 사용. STT provider service-provider 지위에 따라 공유를 로 바꿀 수 있음
오디오 파일 아니요* 앱 기능 선택 아니요 녹음/가져오기, 클라우드 전사·동기화. 기기 내 fallback만 사용한 경우와 클라우드 경로를 모두 합산해야 함
파일 및 문서 아니요* 앱 기능 선택 아니요 knowledge 파일, 내보내기/복원, 생성 문서. storage·embedding provider 계약 검증
기타 사용자 제작 콘텐츠 아니요* 앱 기능, 개인화, 사기 방지·보안 선택 아니요 전사문, 메모, 프롬프트, AI 대화, 템플릿, 회의·팀 데이터. AI 신고 시 사용자가 화면에서 확인하고 제출한 AI 응답 snapshot(최대 4,000자), 사유와 선택 comment(최대 500자)를 moderation 증거로 보관. pending/reviewing 증거는 해결 전 유지하고, dismissed/actioned 증거는 최종 처리 180일 후 purge 대상이다. AI provider 전송과 초대 팀원 공유에 예외가 성립하지 않으면 공유: 예
앱 상호작용 앱 기능, 광고, 분석, 사기 방지·보안 필수(광고 활성 Free 흐름) 아니요 Google Mobile Ads SDK가 앱 실행·탭·동영상 조회 등 product interaction을 자동 수집·공유. 자체 기능 사용 기록도 존재
인앱 검색 기록 아니요* 앱 기능 선택 검증 필요 knowledge query가 서버 검색 경로로 전송됨. 서버/provider log에 남지 않는 것이 입증돼야 일시 처리: 예 가능; 현재 fallback은 아니요
기타 사용자 활동/작업 아니요* 앱 기능, 사기 방지·보안 선택 아니요 사용자가 실행한 action history와 처리 상태. 계정 로컬/서버 저장 범위를 재확인
웹 탐색 기록·설치된 앱 아니요 아니요 관련 permission·기능 없음
비정상 종료 로그 아니요(후보) 아니요(후보) 전용 crash SDK는 현재 의존성에서 확인되지 않음. release SDK graph와 Google/Firebase 설정에서 자동 수집 여부 재확인
진단 분석, 사기 방지·보안 필수(광고 활성 Free 흐름) 아니요 Google Mobile Ads SDK가 앱/SDK 성능 정보를 자동 수집·공유. 자체 제한 로그·오류 상태도 처리
기기 또는 기타 ID 앱 기능, 광고, 분석, 사기 방지·보안 필수(광고/푸시 활성 흐름) 아니요 광고 ID·app set ID는 Google Mobile Ads SDK, FCM push token과 설치 등록 ID는 알림 기능에서 사용

공유: 아니요*를 확정하기 위한 증거

다음 조건을 하나라도 충족하지 못하면 해당 데이터 유형은 보수적으로 공유: 예로 제출한다.

  1. Supabase, STT, LLM/embedding, 알림·메일 provider가 개발자 지시에 따라서만 데이터를 처리하는 service provider인지 최신 계약/DPA로 확인한다.
  2. provider가 자기 광고, 독립 분석, 모델 학습 또는 별도 제품 개선 목적으로 데이터를 사용하지 않도록 운영 설정과 계약을 확인한다.
  3. 팀원에게 콘텐츠를 보여주는 흐름이 사용자의 명시적 초대와 선택에 의한 것인지 확인한다. 공개 피드나 자동 공개가 생기면 재분류한다.
  4. 운영 로그에 prompt, transcript, audio URL, 이메일 또는 purchase token 원문이 들어가지 않는지 검증한다.
  5. 신고 sheet가 첨부될 AI 응답을 사용자에게 미리 보여주고, 사용자가 제출한 해당 응답 snapshot·사유·선택 comment만 전송하는지 확인한다. 음성, 전체 대화와 원래 prompt는 자동 첨부하지 않는다. 30일 generation receipt, 해결 전 보관, 해결 후 180일 evidence, 계정 삭제 시 identity unlink와 purge 기준을 privacy 문서에 반영한다.

SDK/provider 대조표

구성요소 예상 데이터 현재 근거 제출 전 확인
Supabase Auth/DB/Storage/Edge 이메일, user ID, 프로필, 사용자 콘텐츠, 파일, entitlement, 기기 등록 apps/mobile-rn/src/lib/supabase.ts와 각 feature service production project의 region, retention, logs, DPA, subprocessor, 삭제 cascade
Google Mobile Ads + UMP IP 기반 대략적 위치, 앱 상호작용, 진단, 광고/계정 ID, 동의 상태 react-native-google-mobile-ads 16.3.4; mobile-ads-context.tsx 공식 SDK disclosure, 실제 SDK 버전, UMP 메시지 게시 상태
Firebase Cloud Messaging FCM token/설치·기기 식별 정보, allowlisted 알림 event manifest의 messaging service, notification-service.ts Firebase disclosure, production google-services.json, provider retention
Google Play Billing 상품·구매 token, 거래·구독 상태, 계정 연결용 hash billing-context.tsx, iap-verify, RTDN release dependency graph, 상품/base plan, Play Developer API와 RTDN 운영 설정
STT provider 선택한 음성/동영상과 언어, 전사 결과 audio-transcription-service.ts, stt-proxy 실제 production provider, ZDR/학습 opt-out, 로그·보관, 실패 fallback
LLM/embedding provider prompt, transcript/문서 일부, AI 결과, safety identifier llm-proxy, embed-chunks, search-knowledge production model/provider, ZDR/학습 opt-out, abuse log와 보관, 신고 반영
자체 신고 원장 reporter ID, generation receipt/target, reason, optional comment, reporter-selected AI output snapshot, status·review audit metadata 20260824000029_content_reporting.sql, content-report Edge Function, ContentReportSheet.tsx source·service-only purge RPC와 local SQL/HTTP/Deno 검증은 GREEN. production migration/function 배포, purge scheduler·운영 담당, 개인정보처리방침과 E2E가 아직 필요

신고 데이터 contract:

  • AI 요청은 X-D3RO-Generation-Purposetalk_response, command_response, action_response 중 하나를 보내고 성공 응답에서 서버 발급 X-D3RO-Generation-Id UUID를 받는다.
  • generation receipt는 user ID, purpose, model과 생성/만료 시각만 30일 동안 유지하며 raw prompt나 전체 AI 생성 결과를 저장하지 않는다.
  • 신고는 UUID Idempotency-Key, ai_output, 동일 source type/generation ID, reason enum, 사용자가 확인해 제출한 snapshot 1..4,000자와 optional comment 1..500자를 처리한다.
  • pending/reviewing 증거는 해결 전 보관하고, dismissed/actioned 처리 시 180일 evidence_expires_at을 설정한다. 계정 삭제 시 reporter/reviewer identity는 NULL로 분리한다.
  • service-only purge RPC가 만료 receipt와 해결 후 180일이 지난 report를 삭제한다. 자동 scheduler와 운영 담당은 아직 production gate다.
  • Edge Function과 일반 audit log는 prompt, 전체 generation 또는 신고 snapshot 원문을 기록하지 않고 제한된 code/status metadata만 남긴다.

개인정보처리방침 정합성 게이트

현재 site/public/privacy/index.html:19-35는 계정, 사용자 콘텐츠, 기기·알림, 결제·광고 검증, 운영 로그와 AdMob을 폭넓게 고지한다. 그러나 Console 제출 전 다음 구체화가 필요하다.

  • AdMob 자동 데이터인 IP 기반 대략적 위치, 앱 상호작용, 진단, 광고/기기 식별자를 명시한다.
  • Google Mobile Ads가 광고·분석·사기 방지 목적으로 해당 데이터를 수집·공유할 수 있음을 명시한다.
  • AI·UGC 신고 시 수집하는 reporter/target/reason/optional comment/신고자가 선택한 AI 응답 snapshot/status, 검토 목적을 명시한다. generation receipt는 30일, 해결된 evidence는 180일 후 삭제 대상이며 계정 삭제 시 reporter/reviewer identity는 NULL로 분리된다는 기준도 명시한다.
  • production STT/AI/embedding provider의 실제 명칭 또는 범주, 국제 이전·보관·학습 사용 여부를 정확히 맞춘다.
  • 공개 방침의 수정일을 올리고 live URL의 본문·제목·HTTPS 200을 재검증한다.

최종 검증 절차

  1. production secrets로 bundleRelease를 실행해 app-release.aab를 만든다. debug/E2E 산출물을 사용하지 않는다.
  2. release merged manifest에서 AD_ID, Privacy Sandbox AdServices, Billing, FCM, microphone/notification/FGS permission을 기록한다.
  3. Gradle release dependency report와 Play SDK Index 경고를 보존하고 SDK 버전을 위 표와 맞춘다.
  4. Play internal track에 AAB를 업로드하고 Play가 서명·생성한 설치본으로 아래 흐름을 각각 확인한다.
    • 새 사용자/기존 사용자
    • Free + 동의 허용/거부/개인정보 옵션
    • Pro/Pro+ entitlement + 광고 요청 없음
    • 구매/복원/환불·취소 RTDN
    • 마이크 녹음, 파일/MP4 가져오기, cloud 성공·실패 후 local fallback
    • AI 대화/문서 생성과 신고
    • 팀 공유와 탈퇴/삭제
    • 계정 삭제 후 서버·로컬 데이터 경계
  5. Android Network Inspector, provider dashboard와 서버의 redacted audit log를 대조해 표에 없는 endpoint/데이터가 없는지 확인한다.
  6. provider 계약·운영 설정 증거와 release SHA/version/package/certificate를 함께 보관한다.
  7. purge_expired_content_reporting_data_v1()를 호출하는 인증된 자동 scheduler와 운영 담당을 연결하고, 만료 receipt와 해결 180일 경과 report가 실제 삭제되는 production 증거를 남긴다.
  8. Console preview를 개인정보처리방침과 한 줄씩 대조하고, 불명확한 항목은 보수적으로 공개한다.

Google 공식 기준