DEV Community

Cover image for 앱스토어 심사 거부: 계정 삭제 기능 누락과 Firebase 앱 개발자의 해결 기록
바람의평온
바람의평온

Posted on

앱스토어 심사 거부: 계정 삭제 기능 누락과 Firebase 앱 개발자의 해결 기록

앱스토어 심사 거부: 계정 삭제 기능 누락과 Firebase 앱 개발자의 해결 기록

앱스토어 심사 거부: 계정 삭제 기능 누락과 Firebase 앱 개발자의 해결 기록

오랜만에 아이가 좋아하는 게임 앱을 만들어 앱스토어에 제출했는데, 예상치 못한 심사 거부 메일을 받았습니다. 젊은 친구들이야 이런 일을 겪으며 금방 익숙해지겠지만, 저처럼 조금 연륜 있는 개발자에게는 이런 플랫폼 정책 변경이 때론 당황스럽게 다가오기도 합니다. 이번에 제가 마주한 문제는 바로 앱스토어 심사 지침 5.1.1(v) 조항, 즉 '계정 삭제 기능'의 부재였습니다. 사용자 계정 기능을 제공하는 앱은 반드시 앱 내에서 계정을 삭제할 수 있는 기능을 제공해야 한다는 내용이었지요. 처음에는 단순히 계정 생성과 로그인 기능만 잘 작동하면 된다고 생각했던 제 착각이 부른 결과였습니다. 결국 이 문제를 해결하고 무사히 앱을 출시하기까지의 과정을 차분히 기록으로 남겨봅니다.

대상: App Store에 앱을 제출하려는 Flutter 개발자, Firebase를 사용하는 앱 개발자
난이도: 중급

예상치 못했던 앱스토어 심사 거부와 5.1.1(v) 조항

앱스토어 심사 과정은 늘 긴장의 연속입니다만, 이번에는 그 긴장감이 조금 다른 형태로 찾아왔습니다. 열심히 만든 앱이 반려되었다는 메일을 받았을 때, 처음엔 어디서 문제가 생겼는지 감을 잡기 어려웠습니다. 메일에는 'Guideline 5.1.1(v) - Data Collection and Storage'라는 문구가 선명하게 찍혀 있었지요. 내용인즉, 앱이 계정 생성을 지원한다면, 앱 내에서 사용자가 직접 계정을 삭제하고 관련된 모든 데이터를 지울 수 있는 기능을 제공해야 한다는 것이었습니다. 저도 나이가 있다 보니, 이런 최신 지침에 대한 업데이트가 조금 늦었나 하는 생각이 들더군요. 아이들이 '아빠, 이것도 몰랐어?' 할까 봐 괜히 머쓱해지기도 했습니다.

이 지침은 사용자의 개인 정보 보호와 데이터 주권을 강화하기 위한 애플의 노력이 담겨 있는 것이었습니다. 사용자에게 계정 생성의 자유를 주는 만큼, 삭제의 자유도 보장하라는 의미로 이해했습니다. 문제는 제가 이 부분을 완전히 간과했다는 점입니다. 앱 개발에 몰두하며 기능 구현에만 집중했고, 사용자가 앱을 떠날 때의 절차에 대해서는 깊이 고민하지 못했던 것이지요. 앱 심사팀에서는 앱 내에 계정 삭제 버튼이나 관련 기능이 전혀 없음을 지적하며, 이 부분이 수정되기 전까지는 앱을 승인할 수 없다는 단호한 입장을 전해왔습니다.

메일을 받고 나서야 부랴부랴 해당 지침을 찾아 자세히 읽어보았습니다. 단순히 계정 삭제 버튼만 추가하는 것을 넘어, 계정 삭제 시 사용자의 모든 관련 데이터가 함께 삭제되어야 한다는 점, 그리고 그 과정이 명확하게 안내되어야 한다는 점을 알게 되었습니다. 단순히 Firebase Auth에서 계정을 지우는 것을 넘어, Firestore나 다른 백엔드 서비스에 저장된 사용자 관련 데이터까지 모두 정리해야 한다는 의미였습니다. 이 지침을 충족시키지 못하면 앱이 영영 출시되지 못할 수도 있다는 생각에 마음이 조급해졌습니다.

간과했던 사용자 계정 삭제 기능의 중요성

솔직히 말씀드리자면, 처음 앱을 기획하고 개발할 때는 사용자 계정 삭제 기능의 중요성을 크게 인지하지 못했습니다. Firebase Auth를 이용해 간편하게 계정 생성과 로그인을 구현하고 나면, 나머지는 백엔드에서 알아서 잘 처리해줄 것이라는 막연한 기대가 있었던 것 같습니다. 게임 앱이다 보니, 사용자가 계정을 만들어서 리더보드에 점수를 올리고 친구들과 경쟁하는 재미를 주는 것이 주 목적이었으니까요. 계정 삭제는 사용자가 아주 드물게 요청할 때나 고려할 만한 부수적인 기능이라고 생각했었습니다.

하지만 앱스토어 심사 지침을 통해 이러한 생각이 얼마나 안일했는지 깨닫게 되었습니다. 사용자 데이터는 단순히 '생성'되는 것이 아니라, '관리'되고 '삭제'될 권리까지 포함한다는 것을 말입니다. 특히 개인 정보 보호에 대한 사회적 인식이 높아지면서, 플랫폼 사업자들도 이 부분을 매우 엄격하게 다루기 시작했다는 것을 몸으로 체감하는 순간이었습니다. Firebase 자체는 계정 관리 기능을 제공하지만, 그 기능을 앱 내에서 사용자에게 직접 제공하는 것은 오롯이 개발자의 몫이더군요.

제가 개발했던 앱은 Firebase Auth로 사용자 계정을 관리하고, Firestore에는 게임 점수나 프로필 같은 연관 데이터를 저장하고 있었습니다. 앱 내에 계정 삭제 기능이 없었으니, 사용자가 계정을 지우고 싶어도 직접 할 수 있는 방법이 전혀 없었습니다. 고객센터로 문의하거나 개발자에게 직접 연락해야만 가능한 구조였던 것이지요. 이는 명백히 앱스토어의 5.1.1(v) 지침에 위배되는 상황이었습니다. 이제 와서 생각해 보니, 계정 생성 기능을 만들 때부터 삭제 기능도 함께 고려했어야 했다는 뒤늦은 후회가 밀려오더군요.

앱 내 계정 삭제 기능 구현의 첫걸음과 재인증

문제를 확인했으니, 이제 해결에 나설 차례였습니다. 가장 먼저 해야 할 일은 앱 내에 사용자가 직접 계정을 삭제할 수 있는 UI를 만드는 것이었습니다. 설정 화면 어딘가에 '계정 삭제' 버튼을 눈에 띄게 배치하고, 이 버튼을 누르면 일련의 절차를 거쳐 계정이 삭제되도록 해야 했습니다. 단순히 버튼만 만들면 되는 것이 아니었습니다. 사용자에게 계정 삭제의 영향을 명확히 안내하고, 정말 삭제할 것인지 최종 확인하는 과정을 거치는 것이 중요하다고 판단했습니다. 실수로 누르거나 오해로 인해 소중한 데이터를 잃는 일이 없도록 말이지요.

여기서 중요한 부분이 바로 '재인증'입니다. Firebase Auth는 보안상의 이유로 계정을 삭제하거나 민감한 정보를 변경할 때 사용자의 재인증을 요구하는 경우가 많습니다. 특히 일정 시간 이상 로그인 상태가 유지되었을 경우, 계정 삭제와 같은 중요한 작업은 다시 한번 비밀번호를 입력하거나 다른 인증 방법을 통해 본인임을 확인해야 합니다. 이는 악의적인 접근으로부터 사용자 계정을 보호하기 위한 필수적인 절차이므로, 앱 내 계정 삭제 흐름에 반드시 포함해야 했습니다.

따라서 저는 계정 삭제 버튼을 누르면 사용자에게 '정말 계정을 삭제하시겠습니까? 이 작업은 되돌릴 수 없습니다.'와 같은 경고 메시지를 보여주고, 이어서 현재 로그인 방식에 맞는 재인증 절차를 거치도록 구현했습니다. 예를 들어 비밀번호 기반 로그인 사용자라면 비밀번호를 다시 입력하게 하고, 구글이나 애플 로그인 사용자라면 해당 소셜 로그인 절차를 다시 한번 거치게 하는 방식입니다. 이 과정을 통해 사용자가 충분히 인지하고 동의한 상태에서 계정 삭제가 진행되도록 안전장치를 마련한 것입니다.

Firebase 연동 및 연관 데이터 정리 상세 과정

재인증 과정을 거쳐 사용자의 의사를 최종 확인했다면, 이제 실제 Firebase에서 계정을 삭제하고 연관 데이터를 정리하는 작업을 수행해야 합니다. Firebase를 사용한다면 firebase_auth 패키지를 통해 현재 로그인된 사용자 객체에 접근할 수 있습니다. 먼저 Flutter 앱에서 firebase_auth 패키지를 임포트해야 합니다.

import 'package:firebase_auth/firebase_auth.dart';
Enter fullscreen mode Exit fullscreen mode

이후 실제 계정을 삭제하는 코드는 다음과 같습니다. currentUser 객체를 통해 현재 로그인된 사용자 정보를 가져온 다음, delete() 메서드를 호출하는 방식입니다.

final user = FirebaseAuth.instance.currentUser;
if (user != null) {
  // 재인증이 필요한 경우 (예: 비밀번호 기반 로그인)
  // await user.reauthenticateWithCredential(credential);
  await user.delete().then((_) {
    // 계정 삭제 성공 후 추가 데이터 정리 로직 구현 (예: Firestore 문서 삭제)
  }).catchError((error) {
    // 에러 처리
  });
}
Enter fullscreen mode Exit fullscreen mode

주석으로 표시된 것처럼, reauthenticateWithCredential() 메서드를 통해 재인증을 먼저 수행해야 할 수 있습니다. 이 과정이 성공하면 user.delete()를 호출하여 Firebase Auth의 사용자 계정을 삭제하게 됩니다. 여기서 중요한 것은 계정 삭제만으로 끝나는 것이 아니라는 점입니다. Firestore 같은 다른 Firebase 서비스나 자체 백엔드에 저장된 사용자의 개인 데이터, 예를 들어 게임 점수, 프로필 정보, 친구 목록 등도 함께 삭제해야 합니다. 저는 delete() 호출이 성공한 후, Firestore에서 해당 userId를 기준으로 저장된 모든 문서를 찾아 삭제하는 로직을 추가했습니다. 이 과정에서 한두 개의 문서만 지우는 것이 아니라, 사용자와 연결된 모든 컬렉션과 문서들을 재귀적으로 삭제하는 방식을 고민했습니다. 혹시라도 남아있는 데이터가 발생할까 봐 여러 번 확인하며 꼼꼼하게 처리했습니다. 이 부분이 바로 5.1.1(v) 지침을 완전히 준수하는 핵심이었습니다.

사용자 안내를 위한 웹 페이지 마련

앱 내에서 계정 삭제 기능을 구현하는 것 외에도, 앱스토어 심사 지침은 사용자가 계정 삭제 정책에 대해 명확하게 인지할 수 있도록 하는 것을 요구합니다. 단순히 '계정 삭제' 버튼만 달랑 두는 것이 아니라, 어떤 데이터가 삭제되는지, 삭제 후에는 어떤 변화가 생기는지 등을 상세히 안내하는 페이지를 제공하는 것이 좋습니다. 이를 위해 저는 별도의 웹 페이지를 만들어 앱 내에서 해당 페이지로 연결하는 방식을 택했습니다. 앱 내에서 모든 정책을 장황하게 설명하기보다는, 외부 웹 페이지를 통해 더 풍부하고 업데이트 가능한 정보를 제공하는 것이 효율적이라고 판단했습니다.

이 웹 페이지에는 계정 삭제 시 어떤 정보가 영구적으로 삭제되는지, 삭제 후에는 앱 서비스 이용이 불가능해지는지, 그리고 재가입 시 기존 데이터는 복구되지 않는다는 점 등을 명확하게 기재했습니다. 또한, 삭제 과정에서 발생할 수 있는 문의 사항에 대한 FAQ도 포함하여 사용자의 궁금증을 해소하고자 노력했습니다. 이러한 정보 제공은 사용자의 알 권리를 충족시키는 동시에, 심사 과정에서도 애플 측에 우리가 사용자 데이터 관리에 충분히 신경 쓰고 있음을 보여주는 좋은 근거가 됩니다.

해당 웹 페이지의 URL은 앱 내 '계정 삭제' 버튼 주변이나 설정 메뉴의 '개인정보처리방침' 섹션 등에서 접근할 수 있도록 링크를 연결했습니다. 예를 들어, 다음과 같은 형태로 웹 페이지 주소를 만들 수 있습니다.

https://your-domain.com/account-deletion
Enter fullscreen mode Exit fullscreen mode

이 웹 페이지는 앱의 업데이트 없이도 내용을 수정할 수 있다는 장점도 있습니다. 앞으로도 개인 정보 관련 정책이나 플랫폼 지침이 변경될 경우, 이 페이지를 통해 빠르게 사용자에게 최신 정보를 제공할 수 있게 되었습니다. 단순히 심사 통과를 위한 것이 아니라, 사용자와의 신뢰를 구축하는 데에도 중요한 역할을 한다고 생각합니다.

재심사 통과와 얻게 된 교훈

계정 삭제 기능 구현과 웹 페이지 마련까지 모든 작업을 마친 후, 저는 업데이트된 앱을 다시 앱스토어에 제출했습니다. 솔직히 한 번 반려되었던 경험 때문에 이번에도 혹시나 하는 불안감이 없지 않았습니다. 심사팀에서 또 다른 문제를 지적할까 봐 노심초사하며 기다렸던 기억이 생생합니다. 다행히 며칠 후, 앱이 성공적으로 심사를 통과하여 앱스토어에 게시되었다는 기쁜 소식을 받을 수 있었습니다. 그제야 비로소 안도의 한숨을 내쉬었지요. 이 과정을 통해 저는 여러 가지 중요한 교훈을 얻을 수 있었습니다.

가장 큰 교훈은 앱 개발 시 단순히 기능 구현에만 집중할 것이 아니라, 플랫폼별 심사 지침과 사용자 개인 정보 보호 규정을 사전에 충분히 검토해야 한다는 점입니다. 특히 앱스토어와 같은 주요 플랫폼의 지침은 주기적으로 변경되고 강화되므로, 개발자는 항상 최신 정보를 파악하고 반영하려는 노력이 필요하다는 것을 깨달았습니다. 젊은 개발자 친구들은 이런 변화에 더 민감하게 반응하고 빠르게 적용하는 것 같더군요. 저도 이제는 '옛날 방식'에만 머물지 않고, 꾸준히 새로운 정보를 습득해야겠다고 다짐했습니다.

이번 경험은 저에게 단순한 기술적 문제를 넘어, 사용자의 데이터를 대하는 개발자의 자세에 대해 다시 한번 생각하게 만드는 계기가 되었습니다. 사용자의 계정은 단순히 앱 이용을 위한 수단이 아니라, 소중한 개인 정보의 집합이라는 것을 잊지 말아야겠습니다. 앞으로는 새로운 앱을 기획할 때부터 계정 생성과 함께 삭제 기능을 필수적으로 고려하고, 관련 정책 안내에도 더욱 신경 쓸 생각입니다. 한 번의 시행착오를 통해 더 나은 개발자가 될 수 있었다는 점에서, 이번 경험은 저에게 값진 기록으로 남을 것입니다.

이번에 정리한 내용

  • App Store 심사 지침 5.1.1(v)의 중요성
  • Firebase Auth 환경에서 사용자 계정 삭제 기능 구현 방법
  • 계정 삭제 시 사용자 데이터 정리 및 재인증 처리
  • 계정 삭제 정책 안내 웹 페이지의 필요성과 구성
  • 플랫폼별 심사 지침을 사전에 검토해야 하는 이유

마치며

이번 앱스토어 심사 거부와 계정 삭제 기능 구현 경험은 저에게 중요한 이정표가 되었습니다. 기술적인 구현 자체는 어렵지 않았지만, 그 배경에 깔린 플랫폼 정책과 사용자 개인 정보 보호라는 더 큰 맥락을 이해하는 데 시간이 필요했네요. 앞으로는 어떤 앱을 만들더라도, 사용자 경험의 시작부터 끝까지, 심지어는 앱을 떠나는 순간까지도 개발자가 책임감을 가지고 설계해야 한다는 것을 잊지 않겠습니다. 최신 트렌드와 규정을 늘 확인하며 개발에 임하는 것이 저 같은 연륜 있는 개발자에게도 꼭 필요한 자세라는 것을 다시 한번 깨달았습니다.

Top comments (0)