Реалізація права на видалення даних (Right to Erasure) у мобільному додатку
Кнопка «Видалити аккаунт» — одна з найбільш недооцінених вимог. App Store з 2022 року зобов'язує всі додатки з аккаунтами надавати можливість видалення прямо з додатку (не через форму на сайті). Google Play — аналогічно. Й GDPR, й CCPA дають користувачу право на це видалення.
Технічно «видалити аккаунт» — це не одна SQL-команда. Це каскадний процес, який при неправильній реалізації або видаляє не все, або видаляє те, що видаляти не можна.
Що потрібно видалити, а що не можна
Дані діляться на три категорії:
Видалити негайно: профіль користувача (ім'я, email, фото), історія дій, контент, створений користувачем, маркери аутентифікації, push-маркери, дані аналітичних систем (через API цих систем).
Анонімізувати, не видаляти: агреговані метрики (кількість покупок впливає на бізнес-статистику), контент, з яким взаємодіяли інші користувачі (коментарі можна замінити на «Видалений користувач»).
Зберігати всупереч запиту: фінансові трансакції (вимоги податкового законодавства, зазвичай 5–7 років), дані по судових утриманнях, дані необхідні для розслідування шахрайства.
Архітектура процесу видалення
Видалення не повинно бути синхронним — особливо якщо дані розкидані по кількох сервісах. Правильна схема: запит → черга → асинхронне виконання → підтвердження.
class AccountDeletionService(
private val deletionQueue: DeletionQueue,
private val notificationService: NotificationService
) {
suspend fun requestDeletion(userId: String, reason: DeletionReason?) {
// 1. Негайно блокуємо аккаунт — ніяких нових даних
userRepository.setStatus(userId, UserStatus.PENDING_DELETION)
// 2. Відзиваємо всі активні маркери
authTokenRepository.revokeAll(userId)
// 3. Ставимо в чергу видалення по сервісах
deletionQueue.enqueue(
DeletionJob(
userId = userId,
requestedAt = System.currentTimeMillis(),
scheduledFor = System.currentTimeMillis() + GRACE_PERIOD_MS, // 30 днів
steps = listOf(
DeletionStep.PROFILE_DATA,
DeletionStep.ANALYTICS_EVENTS,
DeletionStep.THIRD_PARTY_SDKS,
DeletionStep.BACKUP_ANONYMIZATION,
DeletionStep.AUDIT_LOGS_RETENTION
)
)
)
// 4. Сповіщаємо користувача
notificationService.sendDeletionConfirmation(userId)
}
}
Grace period (30 днів) — це можливість відновити аккаунт, якщо користувач передумав. Протягом цього періоду дані заморожені, але не видалені. За істечення — автоматичне видалення.
Видалення з сторонніх систем
Кожен SDK, який отримував дані користувача, повинен їх видалити:
class ThirdPartyDeletionStep(private val userId: String) : DeletionStep {
override suspend fun execute(): DeletionResult {
val results = coroutineScope {
listOf(
async { deleteFromAmplitude(userId) },
async { deleteFromBraze(userId) },
async { deleteFromFirebaseAnalytics(userId) },
async { deleteFromIntercom(userId) }
).awaitAll()
}
return if (results.all { it.success }) {
DeletionResult.Success
} else {
DeletionResult.PartialFailure(results.filter { !it.success })
}
}
private suspend fun deleteFromAmplitude(userId: String): ServiceDeletionResult {
// Amplitude GDPR API
val response = amplitudeApi.deleteUser(
AmplitudeDeletionRequest(userId = userId, requesterEmail = "[email protected]")
)
return ServiceDeletionResult("amplitude", response.isSuccessful)
}
}
Важливо: у Firebase немає прямого API для видалення Analytics даних конкретного користувача — тільки через resetAnalyticsData() на пристрої + запит через Firebase Console/API для серверних даних. Це обмеження потрібно враховувати при GDPR оцінці Firebase як субпроцессора.
Мобільний клієнт: що відбувається на пристрої
При підтвердженні видалення — негайна очищення на пристрої, не очікування серверного grace period:
func performLocalDeletion() {
// Keychain
let query: [String: Any] = [kSecClass as String: kSecClassGenericPassword]
SecItemDelete(query as CFDictionary)
// UserDefaults
UserDefaults.standard.removePersistentDomain(forName: Bundle.main.bundleIdentifier!)
// Core Data / SQLite
try? FileManager.default.removeItem(at: coreDataURL)
try? FileManager.default.removeItem(at: sqliteURL)
// Кеші
URLCache.shared.removeAllCachedResponses()
// Йдемо на екран входу
coordinator.navigateToLanding()
}
Після локального видалення додаток ведеться як при першій встановленні. Дані на сервері видаляються за розписанням.
Верифікація перед видаленням
Не можна допустити, що зловмисник видалить дані чужого аккаунту через перехоплений запит. Перед виконанням:
- Re-аутентифікація (пароль або біометрія)
- Підтвердження наміру (не pop-up з двома кнопками одинакового розміру)
- Email з кодом підтвердження для чутливих аккаунтів
Підтвердження завершення
За GDPR: відповідь на запит на видалення — протягом 30 днів. Користувач повинен отримати підтвердження, що видалення виконано. Якщо повне видалення неможливе по юридичним основам — пояснення, що саме та чому зберігається.
Терміни: базова реалізація (UI + локальне видалення + серверна черга): 1–2 дні. З видаленням з усіх субпроцессорів та задокументованим процесом для GDPR: 2–3 дні.







