Экспорт данных по GDPR (ст. 15/20)
Коротко: Право получить в структурированном виде все персональные данные, которые компания хранит о вас, — право доступа (ст. 15 GDPR) и право на переносимость данных (ст. 20 GDPR).
Подробнее: На практике обычно реализуется как кнопка «экспортировать данные» в собственном аккаунте, которая собирает на сервере все записи, связанные с вошедшим пользователем, и предлагает их для загрузки, например в виде файла JSON. Важно осознанное решение о том, ЧТО входит в экспорт: чисто технические/связанные с безопасностью поля (хэш пароля, push-подписка) и персональные данные ТРЕТЬИХ лиц (например, кто ещё участвовал в общем обращении в поддержку) сюда не относятся.
Наш контекст: В Emzett app/utils/gdprExport.ts (exportUserData) собирает для вошедшего пользователя данные аккаунта, заказы, историю баллов, обращения в поддержку, сообщения чата и т. д. — намеренно БЕЗ passwordHash и pushSubscription. Проходит через общую проверку лимита запросов, так как полный экспорт данных — сравнительно дорогая операция.
Подробности
Ст. 15 GDPR (право доступа) и ст. 20 GDPR (право на переносимость данных) на практике часто реализуются вместе как «экспорт данных», но юридически различаются по объёму: ст. 15 обязывает предоставить информацию обо всех обрабатываемых персональных данных, включая цели обработки, получателей и срок хранения — независимо от того, как данные собраны. Ст. 20 уже: она применяется только к данным, которые субъект данных сам предоставил компании (например, данные профиля, загруженный контент) и обработка которых основана на согласии или договоре — но не к данным, которые компания сама получила или вычислила (например, внутренне рассчитанный показатель ценности клиента).
Распространённое правовое требование — срок ответа: на запрос доступа нужно ответить «без неоправданной задержки и в любом случае в течение одного месяца» (ст. 12(3) GDPR), с возможностью продлить его ещё на два месяца для сложных запросов. Автоматический самообслуживаемый экспорт в области аккаунта с самого начала укладывается в этот срок, потому что пользователи могут получить данные сразу сами, вместо того чтобы подавать ручной запрос и ждать обработки, — что одновременно значительно снижает нагрузку на поддержку у компании.
Технически особенно сложна работа со связанными данными, затрагивающими других людей. История чата или общее обращение в поддержку обычно содержит сообщения нескольких участников — наивный экспорт «всех записей с моим ID пользователя» невольно раскрыл бы и персональные данные третьих лиц, что само по себе может быть нарушением GDPR. Распространённые подходы — экспортировать в ветке только собственные сообщения, анонимизировать вклад других (например, «Другой пользователь» вместо настоящего имени) или включать целые ветки только если запрашивающий — единственный или основной ответственный участник.
// Упрощённый шаблон экспорта данных по GDPR
async function exportUserData(userId: string) {
const [account, orders, tickets] = await Promise.all([
db.query.users.findFirst({ where: eq(users.id, userId) }),
db.query.orders.findMany({ where: eq(orders.userId, userId) }),
db.query.tickets.findMany({ where: eq(tickets.userId, userId) }),
]);
// Намеренно исключаем поля, связанные с безопасностью
const { passwordHash, pushSubscription, ...safeAccount } = account;
return { account: safeAccount, orders, tickets };
}См. также: Правило малого предприятия (§ 19 UStG), Право отказа при цифровом контенте (§ 356(5) BGB), Удаление аккаунта с периодом возражения (мягкое удаление + анонимизация), GDPR, Журнал аудита