feat(release): prepare 1.1.0 candidate
This commit is contained in:
parent
5a34f66981
commit
5205dcdfa9
736 changed files with 115667 additions and 12203 deletions
121
docs/v3/play/02-data-safety-draft.md
Normal file
121
docs/v3/play/02-data-safety-draft.md
Normal file
|
|
@ -0,0 +1,121 @@
|
|||
# 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](https://developers.google.com/admob/android/privacy/play-data-disclosure), 실제 SDK 버전, UMP 메시지 게시 상태 |
|
||||
| Firebase Cloud Messaging | FCM token/설치·기기 식별 정보, allowlisted 알림 event | manifest의 messaging service, `notification-service.ts` | [Firebase disclosure](https://firebase.google.com/docs/android/play-data-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-Purpose`에 `talk_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 공식 기준
|
||||
|
||||
- [Data safety form 안내와 데이터 유형](https://support.google.com/googleplay/android-developer/answer/10787469?hl=en)
|
||||
- [Google Mobile Ads SDK data disclosure](https://developers.google.com/admob/android/privacy/play-data-disclosure)
|
||||
- [Firebase Android data disclosure](https://firebase.google.com/docs/android/play-data-disclosure)
|
||||
- [계정 삭제 요구사항](https://support.google.com/googleplay/android-developer/answer/13327111?hl=en)
|
||||
- [Advertising ID 정책](https://support.google.com/googleplay/android-developer/answer/6048248?hl=en)
|
||||
Loading…
Add table
Add a link
Reference in a new issue