개인정보 보호 및 신고사항
목적
두 스토어에서 진실되고 일관된 개인정보 보호 답변을 코드 기반 증거로 뒷받침합니다. 대부분의 개인정보 보호 거부 사유는 불일치, 즉 정책에서는 한 가지를 말하고, 앱은 다른 행동을 하며, 양식은 또 다른 내용을 말하기 때문입니다.
필수 조건
- 소스 코드 액세스 (앱 및 백엔드) 및 잠금 파일 (
pubspec.lock,Podfile.lock, Gradle 의존성,package.json). - 현재 개인정보처리방침 및 이용약관.
- 사용자 데이터를 수신하는 모든 백엔드 엔드포인트 및 타사 서비스에 대한 지식.
1. 데이터 인벤토리 구축 (기억이 아닌 코드로부터)
리포지토리 루트에서 scripts/scan-sdks.mjs를 실행합니다. 잠금 파일에서 일반적으로 접촉하는 데이터 범주와 함께 알려진 SDK를 나열하고, required-reason API 사용, 권한 문자열, 광고 ID 및 추적 API를 grep합니다. 그런 다음 네트워크 계층과 백엔드를 읽어 인벤토리를 완성합니다:
| 데이터 | 출처 (화면 / SDK) | 기기 외부 전송? 누구에게? | 사용자와 연결? | 목적 | 보존 기간 | 선택 사항? |
|---|
규칙:
- "기기에서만 처리"는 자체 서버를 포함하여 절대 전송되지 않음을 의미합니다. 백엔드와 동기화되면 수집되는 것입니다.
- 귀하의 처리자(호스팅, 귀하의 지시에 따라 행동하는 AI 제공자, 결제 SDK)는 여전히 "수집"됩니다. 이것이 "공유"로 간주되는지 여부는 스토어마다 다릅니다(아래 참조).
- 익명 충돌 보고서 및 사용량 카운트는 여전히 수집됩니다(진단/사용 데이터). 일반적으로 "연결되지 않음"입니다.
인벤토리를 docs/privacy-inventory.md로 저장합니다. 아래의 모든 답변은 행을 인용합니다.
2. Apple App Privacy (App Store Connect › App Privacy)
- 각 인벤토리 행을 Apple의 범주(연락처 정보, 건강 및 피트니스, 사용자 콘텐츠, 식별자, 구매, 사용 데이터, 진단…), 목적, 연결됨 대 연결되지 않음, 추적에 매핑합니다.
- 추적 = 귀하의 데이터를 타겟 광고 또는 광고 측정을 위해 타사 데이터와 연결하거나 데이터 브로커와 공유하는 것입니다. 광고 SDK 및 데이터 브로커가 없으면 일반적으로 "추적 없음"이며 ATT 프롬프트가 필요하지 않습니다.
- 선택적 공개는 Apple의 조건이 모두 충족되는 경우에만 적용됩니다(드물고, 선택적이며, 사용자가 매번 시작하고, 추적/광고가 아님). 앱 기능에는 거의 적용되지 않습니다.
- 문서: App privacy details.
3. Google Play Data safety (정책 › 앱 콘텐츠 › 데이터 안전)
- 동일한 인벤토리, Play의 분류(개인 정보, 건강 및 피트니스, 사진 및 비디오, 메시지, 앱 활동, 앱 정보 및 성능, 기기 또는 기타 ID, 금융 정보…).
- 공유는 귀하를 대신하여 처리하는 서비스 제공업체로의 전송을 제외합니다. 교차 고객 광고 프로필을 구축하는 SDK는 공유입니다.
- 임시: 메모리에서만 처리되고 저장되지 않으며 실시간 요청에만 사용됩니다(예: 분석 후 폐기되는 사진).
- CSV 내보내기 / CSV 가져오기 사용: CSV를 리포지토리(
store/data-safety.csv)에 보관하여 변경 사항이 코드처럼 검토되도록 합니다. 가져오기는 모든 답변을 덮어씁니다. - 문서: Data safety.
4. 기타 Play 신고사항
- 건강 앱 신고: 모든 앱이 완료해야 하며, 건강 기능이 없어도 마찬가지입니다. 문서.
- Health Connect: 권한당 하나의 정당성; 보이는 기능이 사용하는 권한만 요청; 정책에 연결하는 근거 활동(
ACTION_SHOW_PERMISSIONS_RATIONALE). Play는 흐름의 화면 녹화를 요청할 수 있습니다. - 광고 ID: 사용 여부를 신고합니다. 광고/어트리뷰션 SDK가 없으면 "아니요"로 신고하고 어떤 의존성도
com.google.android.gms.permission.AD_ID를 추가하지 않는지 확인합니다(병합된 매니페스트 확인; 추가된 경우tools:node="remove"로 제거). - 타겟 대상, 콘텐츠 등급(IARC), 광고, 앱 액세스, 뉴스, 금융 기능, 정부: 인벤토리에서 답변합니다. 일부가 로그인 뒤에 있으면 App access에 검토자 자격 증명을 제공합니다.
- 계정 삭제: 섹션 8을 참조하세요.
5. 개인정보 매니페스트 (iOS)
- 앱 타겟에
PrivacyInfo.xcprivacy를 추가합니다(템플릿: templates/PrivacyInfo.xcprivacy). NSPrivacyTracking,NSPrivacyTrackingDomains,NSPrivacyCollectedDataTypes(App Privacy와 일관) 및 앱 자체 코드가 사용하는 각 required-reason API 범주에 대한NSPrivacyAccessedAPITypes를 선언합니다: 파일 타임스탬프, 시스템 부팅 시간, 디스크 공간, 활성 키보드, UserDefaults. Apple 목록에서 승인된 이유 코드를 선택합니다. Flutter 앱은shared_preferences와 같은 플러그인을 통해 UserDefaults를 사용합니다 — 각 플러그인이 자체 매니페스트를 제공하는지 확인하고, 코드와 매니페스트가 없는 플러그인이 사용하는 것을 추가합니다.- 빌드 후 App Store Connect 이메일 / 빌드 경고에서 누락된 매니페스트 이유를 검사합니다.
- 문서: Privacy manifest files, Required reason API.
6. 수출 규정 준수 (iOS)
- Info.plist의
ITSAppUsesNonExemptEncryption: 앱이 암호화를 사용하지 않거나 면제 암호화만 사용하는 경우(예: OS를 통한 HTTPS, 주 기능이 보안이 아닌 앱에서 사용자 자신의 데이터를 보호하기 위해서만 사용되는 표준 알고리즘)false가 적절합니다. 설정하면 빌드별 질문을 건너뜁니다. - 독점 암호화를 구현하거나 번들로 제공하거나 암호화가 주요 기능인 경우, 대신 질문에 답하고 문서 또는 연간 자체 분류 보고서가 적용되는지 확인합니다.
- 이는 법적 분류입니다. 확실하지 않은 경우 무역 규정 준수 자문관에게 문의하세요. 문서: Complying with encryption export regulations.
7. 연령 등급
- 현재 Apple 설문지 및 Play IARC 설문지에 건강/웰니스 주제, AI 채팅 또는 생성 콘텐츠, 사용자 생성 콘텐츠 및 제한 없는 웹 액세스에 대한 질문을 포함하여 진실되게 답변합니다.
- 등급을 귀하의 약관의 최소 연령 및 앱 내 연령 게이트와 일관되게 유지합니다. 설문지 결과가 약관의 최소 연령보다 낮으면 불일치를 남기는 대신 스토어의 옵션을 사용하여 더 높은 등급을 설정합니다.
8. 계정 삭제
- 앱 내: 사용자가 계정을 만들 수 있으면 앱 내에서(계정 설정) 삭제를 시작할 수 있습니다. 비활성화만으로는 충분하지 않습니다. 게스트/자동 생성 계정도 마찬가지입니다. 재인증 또는 확인은 허용되지만 불필요하게 어렵게 해서는 안 됩니다. Apple: Offering account deletion.
- 웹 URL(Play): 앱이나 로그인 없이 접근 가능한 페이지, 목록에 있는 앱 이름 지정, 삭제 요청 방법, 삭제되는 항목과 보존되는 항목(및 이유), 선행 단계(구독 취소)를 설명합니다. 문서: Play account deletion.
- 구독: 계정 삭제는 스토어 구독을 취소하지 않습니다. 삭제 시트에서 경고하고 스토어의 구독 관리로 링크를 제공합니다.
- Apple로 로그인: 삭제 시 Sign in with Apple REST API를 통해 사용자의 토큰을 취소합니다.
- 제3자: 처리자(예: RevenueCat 고객, 분석/충돌 식별자, 이메일 목록)에서도 사용자를 삭제합니다.
- 재인증 롤아웃: 삭제 엔드포인트에 재인증 요구 사항을 추가하는 경우, 새로운 응답을 처리하는 앱을 동시에 백엔드 변경 사항과 함께 출시하거나 이전 앱 버전에 대해 이전 동작을 유지합니다.
- 경로 전체(앱, 정책, 스토어 양식, 웹 페이지)에 대해 하나의 표현을 사용합니다(예: "프로필 › 계정 삭제").
9. AI 기능
- Apple 5.1.2(i): 개인 데이터가 타사( 타사 AI 포함)와 공유되는 곳을 공개하고 먼저 명시적 권한을 받습니다.
- AI 기능을 처음 사용하기 전: 제공자와 역할을 명명하는 짧은 동의 시트( "<AI 제공자>가 답변을 생성하기 위해 처리"), 전송되는 내용, 모델 훈련에 사용되지 않음(제공자의 약관이 귀하의 요금제에 대해 그렇게 명시하는 경우에만), 보존 기간(제공자 및 귀하의 것). 설정에서 철회할 수 있는 스위치.
- 정책 표현: AI 제공자는 귀하의 지시에 따라 처리자/서비스 제공자로 행동합니다. 위치 및 보존 기간과 함께 나열합니다.
- 스토어 양식: AI 입력(메시지, 사진, 텍스트)은 수집된 데이터(사용자 콘텐츠)입니다. 제공자가 처리자인 경우 Play에서 일반적으로 "공유"되지 않습니다.
- 고려 사항: 건강 또는 금융에 대한 AI 답변에 "전문가 조언이 아님" 문구, 위기 주제에 대해 정의된 안전한 응답.
10. 건강 데이터
- HealthKit / Health Connect 데이터를 AI 제공자 또는 기타 타사에 절대 보내지 마십시오. Apple(5.1.3)은 건강 데이터 사용 및 공개를 제한합니다. Health Connect의 정책도 전송을 제한합니다. 가장 간단한 규정 준수 설계: Apple Health / Health Connect에서 읽은 데이터는 기기에 남거나(또는 사용자 자신의 계정 저장소에만 공개된 대로) 있으며, AI를 호출하는 기능은 사용자가 앱에 입력한 데이터만 사용합니다.
- 건강 데이터를 광고 또는 마케팅에 사용하지 마십시오. iCloud에 저장하지 마십시오.
- Info.plist 사용 문자열(
NSHealthShareUsageDescription,NSHealthUpdateUsageDescription)은 실제 사용을 명시해야 합니다. 문자열이 "타사와 절대 공유되지 않음"이라고 말하면 코드가 이를 보장해야 합니다. - 코드에서 시행: AI 호출용 요청 빌더는 명시적인 허용 목록 필드를 사용합니다. 건강 출처 필드가 AI 페이로드에 나타나면 실패하는 테스트를 추가합니다.
인간 승인이 필요한 결정 지점
모든 양식의 최종 답변(계정 소유자는 법적 책임이 있음), 수출 규정 준수 분류, 연령 등급, AI 제공자 및 해당 데이터 약관, 건강 데이터가 기기를 떠나는 모든 변경.
검증
- 모든 양식 답변은 인벤토리 행을 인용합니다. 인벤토리는 코드를 인용합니다.
- 차이 확인: 개인정보처리방침 ↔ App Privacy ↔ Data safety CSV ↔ 앱 내 동의 텍스트 ↔ Info.plist 문자열. 모순 없음.
- 테스트: 테스트 계정 삭제; 백엔드 행, 처리자 레코드 및 인증 사용자가 사라졌는지 확인; 웹 삭제 페이지가 로그아웃 상태에서 접근 가능한지 확인.
- 빌드에 개인정보 매니페스트 경고가 없음.
일반적인 함정
- 정책에 "데이터가 기기를 떠나지 않음"이라고 쓰여 있지만 동기화 또는 AI 기능이 전송하는 경우.
- 양식에서 자체 익명 충돌/사용량 보고를 잊는 경우.
- 의존성이 자동으로 AD_ID 권한을 추가하는 경우.
- "우리가 아는 모든 것"을 포함하는 "컨텍스트" 빌더를 통해 건강 데이터가 AI 프롬프트로 흘러 들어가는 경우.
- 앱, 정책 및 스토어 양식에서 삭제 경로 이름이 다른 경우.
- 연령 등급이 4+인데 약관이 16+인 경우.