Реализация журнала обработки персональных данных в мобильном приложении
GDPR требует не только получить согласие на обработку данных, но и документировать каждую операцию обработки (Article 30 — Records of Processing Activities). Для B2C мобильных приложений с аудиторией в EU это означает: хранить машиночитаемый журнал того, какие данные, когда, для каких целей и на каком основании обрабатывались.
Что журналировать
Операции обработки, которые нужно логировать:
- Сбор данных при регистрации: поля, timestamp, правовое основание (consent/contract/legitimate interest)
- Передача третьим лицам: отправка email в Mailchimp, аналитика в Firebase, реклама в AdMob — каждая передача с указанием получателя и цели
- Изменение данных: обновление профиля, email, телефона
- Удаление: по запросу пользователя или по истечении retention period
- Доступ: когда и кем из сотрудников просматривались данные (для корпоративных приложений)
Схема журнала
data_processing_logs:
id UUID PK
user_id UUID FK NULLABLE -- null для анонимных операций
operation_type VARCHAR -- 'collect', 'transfer', 'update', 'delete', 'access'
data_categories TEXT[] -- ['email', 'location', 'purchase_history']
purpose VARCHAR -- 'analytics', 'marketing', 'service_provision'
legal_basis VARCHAR -- 'consent', 'contract', 'legitimate_interest'
third_party VARCHAR NULLABLE -- 'firebase', 'mailchimp', null
actor_type VARCHAR -- 'user', 'system', 'staff'
actor_id UUID NULLABLE -- ID сотрудника при actor_type='staff'
ip_address INET NULLABLE
metadata JSONB -- доп. контекст
created_at TIMESTAMPTZ DEFAULT NOW()
Журнал — append-only. Записи не редактируются и не удаляются (удаление записей журнала само по себе нарушение). Retention журнала — минимум 3 года.
Автоматическое журналирование на сервере
Удобнее всего реализовать через middleware/аспекты, а не вручную в каждом сервисе:
# Django middleware пример
class DataProcessingLogMiddleware:
LOGGED_ENDPOINTS = {
'POST /api/auth/register': ('collect', ['email', 'name'], 'contract'),
'PUT /api/user/profile': ('update', ['profile_data'], 'contract'),
'DELETE /api/user': ('delete', ['all_user_data'], 'legal_obligation'),
}
def process_response(self, request, response):
key = f"{request.method} {request.path}"
if key in self.LOGGED_ENDPOINTS and response.status_code < 400:
op_type, categories, basis = self.LOGGED_ENDPOINTS[key]
DataProcessingLog.objects.create(
user_id=request.user.id if request.user.is_authenticated else None,
operation_type=op_type,
data_categories=categories,
legal_basis=basis,
ip_address=get_client_ip(request)
)
return response
Клиентская часть: «Мои данные»
Пользователь по GDPR имеет право увидеть, как обрабатывались его данные. В приложении — раздел «Настройки → Приватность → История обработки данных». Показываем отфильтрованный журнал: только записи с user_id текущего пользователя, без технических деталей, с понятными описаниями операций.
struct DataProcessingEntry: Identifiable, Decodable {
let id: UUID
let operationDescription: String // "Ваши данные переданы аналитическому сервису"
let date: Date
let dataCategories: [String]
let purpose: String
}
Третьи стороны указываем по официальным названиям (Google Analytics, Meta Pixel) — пользователь должен узнать сервис.
Интеграция с consent management
При отзыве согласия на конкретную цель (например, маркетинг) — создаём запись в журнале operation_type='consent_revoked' и прекращаем передачу данных соответствующим третьим лицам. Это документирует момент отзыва — важно при аудите DPA.
Сроки — 1–3 дня: схема журнала, middleware для автоматического логирования ключевых операций, API для чтения истории, клиентский UI.







