앱에 기능 하나 넣었더니 개인정보 처리방침이 거짓말이 됐습니다
"모든 데이터는 기기에만 저장됩니다"라고 적어둔 방침이, 랭킹과 자동 백업을 붙이는 순간 사실과 반대가 됐습니다. 방침은 조용히 낡기 때문에 아무도 알려주지 않습니다. 제 앱 두 개에서 찾아낸 불일치와 점검 방법을 정리했습니다.
안녕하세요. Jay입니다!
며칠 전 제 앱 지원 페이지의 스크린샷을 새 버전으로 갈아 끼우고 있었습니다. 이미지만 바꾸면 끝나는 5분짜리 일이라고 생각했죠. 그런데 페이지 문구를 읽어보다가 이런 문장을 만났습니다.
도감·점수·레벨 등 모든 데이터는 기기에만 저장됩니다. 서버 없음, 계정 없음.
문제는 이 앱이 글로벌 랭킹과 자동 백업을 이미 쓰고 있었다는 겁니다. 저 문장은 틀린 정도가 아니라 정반대였습니다.
🕳 방침은 조용히 낡습니다
코드가 틀리면 앱이 죽습니다. 빌드가 깨지거나, 테스트가 빨개지거나, 사용자가 제보합니다. 어딘가에서 반드시 신호가 옵니다.
개인정보 처리방침은 그렇지 않습니다. 기능을 추가해도 방침은 아무 말 없이 그 자리에 있습니다. 심지어 틀린 채로도 페이지는 멀쩡히 열립니다. 그래서 낡았다는 걸 알아차릴 계기가 없습니다.
제 경우 시간 순서가 이랬습니다.
| 시점 | 앱에 일어난 일 | 방침 |
|---|---|---|
| 출시 | 완전 오프라인 | ✅ 맞음 |
| 몇 달 뒤 | 글로벌 랭킹 추가 | 그대로 |
| 그 다음 | 자동 세이브 백업 추가 | 그대로 |
| 그 다음 | 익명 이용 통계 추가 | 그대로 |
출시 당시엔 정확한 문장이었습니다. 그게 이 문제의 핵심입니다. 처음부터 틀리게 쓴 게 아니라, 앱만 움직이고 문서는 가만히 있었던 겁니다.
🔍 두 앱에서 찾은 것
의심이 들어 제 앱들의 방침을 전부 다시 읽었습니다. 두 건이 나왔습니다.
첫 번째 앱 — 지원 페이지가 "서버 없음, 계정 없음"이라고 안내하는데 실제로는 서버 엔드포인트 세 개를 쓰고 있었습니다. 랭킹, 자동 백업, 익명 통계. FAQ에도 "데이터가 서버에 저장되나요? → 아니요" 라고 적혀 있었고요.
두 번째 앱 — 이쪽이 더 나빴습니다. 방침에 "Firebase Analytics 등 자체 분석 도구를 사용하지 않으며, 광고 SDK 외에 데이터를 수집하는 제3자 SDK는 포함되어 있지 않습니다" 라고 적혀 있었는데, 다음 버전에서 Firebase Analytics와 Crashlytics를 붙이는 중이었습니다.
두 번째가 더 위험한 이유는 "없다"고 단정한 문장이기 때문입니다. 빠뜨린 게 아니라 적극적으로 부정한 것이라, 그대로 두면 방침이 사용자에게 거짓을 말하는 셈이 됩니다.
💣 가장 고약한 형태 — "수집하지 않는 정보"에 적혀 있을 때
첫 번째 앱의 개인정보 처리방침에는 이런 절이 있었습니다.
2. 수집하지 않는 정보
• 도감·레벨·별가루 등 게임 진행 데이터 → 모두 기기 로컬에만 저장
그런데 코드를 열어보니 자동 백업이 올리는 항목이 정확히 도감·레벨·별가루였습니다. 앱이 백그라운드로 갈 때마다 조용히 서버로 갑니다.
"수집하지 않는다"고 명시한 바로 그 데이터를 수집하고 있었던 겁니다. 단순 누락보다 나쁩니다. 누락은 "안 적었다"지만 이건 "안 한다고 적었다"니까요.
⚠️ 왜 그냥 넘어가면 안 되는가
세 가지 이유가 있습니다.
첫째, 심사에서 걸립니다. 스토어는 방침 페이지만 보는 게 아니라 콘솔 설문과 대조합니다. Play Console의 「데이터 보안」, App Store Connect의 「앱 개인정보 보호」에 답한 내용과 방침 문구가 어긋나면 반려 사유가 됩니다. 특히 ATT 권한을 요청하면서 "기기 ID를 추적에 사용하지 않는다"고 답하면 그 자체로 모순입니다.
둘째, 방침은 사용자와의 약속입니다. 심사를 통과하느냐와 별개로, 안 보낸다고 적어놓고 보내는 건 그냥 사실이 아닙니다.
셋째, 신뢰가 한 번에 무너집니다. 방침 한 줄이 틀린 걸 발견한 사용자는 나머지 문장도 믿지 않게 됩니다.
✅ 어떻게 점검하나
거창한 절차는 필요 없었습니다. 제가 쓴 방법은 이렇습니다.
1. 앱이 실제로 어디로 통신하는지부터 확인합니다. 코드에서 HTTP 호출을 전부 찾는 게 가장 빠릅니다.
grep -rn "https://" lib/ --include=*.dart
엔드포인트 목록이 나오면 그게 방침에 반드시 적혀 있어야 할 항목입니다. 저는 이걸로 세 개를 찾았고, 그중 방침에 있던 건 하나뿐이었습니다.
2. 광고·분석 SDK를 셉니다. 의존성 파일(pubspec.yaml, build.gradle, Podfile)에서 서드파티 SDK를 확인합니다. 방침의 "제3자 서비스" 절과 개수가 맞아야 합니다.
3. 방침에서 단정하는 문장을 찾습니다. 이게 제일 중요합니다.
- 「~하지 않습니다」
- 「~없습니다」
- 「모든 데이터는 ~」
이런 문장이 시한폭탄입니다. 지금은 맞아도 기능 하나만 붙으면 바로 거짓이 됩니다. 저는 모든이라는 단어를 검색해서 게임 진행 데이터는 처럼 범위를 한정하는 표현으로 바꿨습니다. 같은 사실을 말하면서도 나중에 틀릴 여지가 훨씬 적어집니다.
4. 고쳤으면 스토어 콘솔도 같이 바꿉니다. 순서가 있습니다.
① 방침 페이지 라이브 → ② 스토어 설문 갱신 → ③ 빌드 제출
②를 건너뛰고 빌드를 먼저 올리면 방침과 설문이 어긋난 상태로 심사에 들어갑니다.
💡 Jay의 정리 — 릴리스 체크리스트에 한 줄
이번에 배운 건 점검 방법보다 언제 점검해야 하는가였습니다.
방침을 주기적으로 들여다보는 건 잘 안 됩니다. 계기가 없으니까요. 대신 "서버로 뭔가를 보내는 코드를 새로 넣었는가" 를 릴리스 체크리스트에 한 줄 넣어두면 놓칠 일이 거의 없습니다. 네트워크 호출이 늘어난 릴리스에서만 방침을 열면 되니까요.
그리고 방침을 쓸 때는 미래에 틀릴 문장을 피하는 게 나중의 나를 살립니다. "서버 없음"이라고 쓰는 대신 "게임 진행 데이터는 기기에 저장됩니다"라고 쓰면, 나중에 랭킹을 붙여도 그 문장은 여전히 참입니다.
저는 이걸 스크린샷 갈아 끼우다가 우연히 발견했습니다. 우연이 아니었으면 다음 심사 때까지 몰랐을 겁니다.
결론
개인정보 처리방침은 한 번 쓰고 끝나는 문서가 아니라 코드와 함께 낡는 문서입니다. 그런데 코드와 달리 낡았다고 알려주는 신호가 없습니다.
지금 운영 중인 앱이 있다면 방침을 한 번만 다시 읽어보세요. 특히 「~하지 않습니다」로 끝나는 문장을요. 출시 이후에 기능을 하나라도 추가했다면, 그 문장이 아직도 참인지 확인할 가치가 있습니다.
다음에도 유익한 포스팅으로 찾아오겠습니다. 감사합니다!