用户数据删除与账号注销

本文属于《从 0 到 1 AI 产品出海知识库》中的「合规、安全与风控」章节。

账号注销不是可选功能,是法律要求。很多出海产品在早期版本中把账号注销藏到设置页的第三层子菜单,甚至干脆不提供——这种做法在 GDPR 覆盖的欧洲市场、CCPA 覆盖的加州市场,以及中国《个人信息保护法》的管辖范围内,都可能带来行政处罚和法律风险。

数据删除和账号注销看似是一个简单的「删数据」操作,实际上涉及法律合规、数据分类、技术实现、用户沟通等多个维度。你需要回答的问题包括:哪些数据必须删除?哪些数据可以保留?保留多久?备份系统中的数据怎么处理?第三方服务中的数据怎么同步删除?用户发起请求后多久必须完成?

本文将从法律要求出发,系统梳理数据删除的实现方法、保留策略、用户沟通流程和技术实现方案,给出可落地的对照表格和检查清单。

一、法律要求:不同市场的删除权规定

账号注销的法律基础是「数据删除权」,不同市场有不同的法规名称和具体要求。

1.1 GDPR 删除权(Right to Erasure)

GDPR 第 17 条明确规定了数据主体的「被遗忘权」(Right to be Forgotten)。用户在以下情形有权要求删除个人数据:

  • 数据对于收集目的已不再必要
  • 用户撤回同意(且无其他合法依据)
  • 用户反对数据处理,且控制者无压倒性的合法理由
  • 数据被非法处理
  • 删除是法律义务的要求

GDPR 要求数据控制者在收到删除请求后一个月内响应,特殊情况下可延长两个月。响应不仅是确认收到请求,还需要实际完成数据删除或给出合理的拒绝理由。

需要注意的是,GDPR 的删除权并非绝对。以下情形可以拒绝删除请求:

  • 行使言论自由和信息权
  • 履行法律义务(如税务记录保留)
  • 公共健康领域的公共利益
  • 建立、行使或辩护法律索赔

1.2 CCPA / CPRA(加州消费者隐私法)

CCPA 赋予消费者要求企业删除个人信息的权利,CPRA 进一步扩展了这一权利。核心要求包括:

  • 企业必须提供「不要出售或分享我的个人信息」的选项
  • 消费者提交删除请求后,企业必须在 45 天内响应(可延长 45 天)
  • 需要验证请求者身份,防止冒名删除
  • 删除义务同时适用于企业自身和第三方服务商(Service Provider)

CCPA 的例外情形与 GDPR 类似:法律义务、公共安全、法律索赔等。

1.3 中国《个人信息保护法》

中国《个人信息保护法》第 47 条规定了个人信息删除权。核心要求:

  • 处理目的已实现、无法实现或为实现处理目的不再必要
  • 个人信息处理者停止提供产品或服务,或保存期限已届满
  • 个人撤回同意
  • 个人信息处理者违反法律、行政法规或与个人的约定处理个人信息

响应时限为 15 个工作日内。中国的监管实践还特别关注:

  • 注销入口不能过于隐蔽(建议不超过 3 次点击可达)
  • 不得设置不合理的注销障碍条件
  • 注销反悔期应合理,不宜过长

1.4 其他市场

市场法规删除权响应时限特殊要求
欧盟/EEAGDPR30 天DPO 可能需要参与审查
加州CCPA/CPRA45 天需提供多种请求渠道(网站、电话)
中国个保法15 个工作日注销入口需清晰可达
巴西LGPD合理时间类似 GDPR,需指定代理人
日本APPI6 个月(通知)需通过指定窗口受理
韩国PIPA30 天严格的数据最小化原则

二、实现方法:三种删除策略对比

数据删除的技术实现不是简单的 DELETE FROM users WHERE id = ?。不同场景下需要采用不同的删除策略。

2.1 软删除(Soft Delete)

软删除是在数据记录上标记一个「已删除」状态字段,数据本身仍然保留在数据库中。

-- 软删除实现
ALTER TABLE users ADD COLUMN deleted_at TIMESTAMP DEFAULT NULL;
ALTER TABLE users ADD COLUMN deletion_requested_at TIMESTAMP DEFAULT NULL;
 
-- 标记删除
UPDATE users SET deleted_at = NOW() WHERE id = $1;
 
-- 查询时排除已删除用户
SELECT * FROM users WHERE deleted_at IS NULL;

优点

  • 可恢复,用户可以在反悔期内撤销注销
  • 不会破坏外键约束和关联数据的完整性
  • 可以保留业务统计数据的完整性

缺点

  • 数据仍然占用存储空间
  • 如果忘记在查询中过滤 deleted_at,可能泄露「已删除」用户的数据
  • 不满足 GDPR 的实质删除要求(数据仍然存在)

2.2 硬删除(Hard Delete)

硬删除是从数据库中物理删除数据记录,不可恢复。

-- 硬删除用户记录
DELETE FROM users WHERE id = $1;
 
-- 级联删除关联数据
DELETE FROM user_sessions WHERE user_id = $1;
DELETE FROM user_preferences WHERE user_id = $1;
DELETE FROM user_content WHERE user_id = $1;

优点

  • 彻底删除,满足 GDPR 的实质要求
  • 释放存储空间
  • 不存在数据泄露风险

缺点

  • 不可恢复
  • 可能破坏外键约束——需要处理级联关系
  • 可能影响业务统计数据的完整性
  • 备份系统中的数据无法立即删除

2.3 延迟删除(Delayed Deletion)

延迟删除是软删除和硬删除的组合:先标记为「待删除」状态,经过一段等待期后再执行物理删除。

-- 第一阶段:标记删除(立即生效)
UPDATE users
SET deleted_at = NOW(),
    deletion_scheduled_at = NOW() + INTERVAL '30 days',
    status = 'pending_deletion'
WHERE id = $1;
 
-- 第二阶段:定时任务执行物理删除
-- 由 cron job 或后台 worker 定期执行
DELETE FROM users
WHERE deletion_scheduled_at <= NOW()
  AND status = 'pending_deletion';

优点

  • 给用户留出反悔期
  • 可以完成数据导出请求(用户可能在删除前要求数据可携带)
  • 业务上有缓冲时间处理关联关系

缺点

  • 实现复杂度最高
  • 需要维护两套删除逻辑
  • 等待期内数据仍然存在,需要限制访问

2.4 删除策略对比

维度软删除硬删除延迟删除
数据可恢复性可恢复不可恢复等待期内可恢复
GDPR 合规性不满足(数据仍存在)满足等待期内不满足
实现复杂度
外键约束处理无需处理需要级联处理需要级联处理
业务数据影响可保留统计完整性可能影响统计等待期内保留
推荐场景内部系统、数据审计简单系统、无关联数据面向消费者的 SaaS

对于出海 SaaS 产品,推荐采用「延迟删除」方案:先软删除并禁用账号,经过等待期后再执行物理删除。这样既满足法律合规要求,又给用户留出反悔空间。

三、数据保留策略:哪些必须保留、保留多久

账号注销不意味着所有数据都必须立即删除。有些数据因法律义务需要保留,有些数据因业务需要可以匿名化后保留。

3.1 必须保留的数据

以下数据因法律义务或合法利益,在用户注销后仍然需要保留一段时间:

数据类别保留原因建议保留期限法律依据
交易和支付记录税务、审计要求5-7 年各国税法差异
合同和协议记录法律索赔防护合同终止后 3-6 年诉讼时效规定
反洗钱记录合规要求5 年AML 法规
安全日志(登录 IP、操作记录)安全审计、入侵检测6 个月-2 年合法利益
客服沟通记录争议解决1-3 年合法利益

3.2 可以匿名化后保留的数据

以下数据在匿名化处理后(去除个人标识信息)可以保留用于业务分析:

  • 产品使用统计:功能使用频率、用户活跃度趋势——去除用户标识后保留聚合数据
  • AI 模型训练数据:用户生成的内容(如果用户协议允许)——去除个人关联后用于模型改进
  • 性能指标:API 调用量、响应时间——按时间窗口聚合后保留
  • 错误日志:异常堆栈、错误类型——去除用户标识和输入内容后保留

匿名化必须是不可逆的。如果只是将用户名替换为「已注销用户」,这属于假名化(Pseudonymization),不算真正的匿名化,仍然受数据保护法规约束。

3.3 必须删除的数据

以下数据在用户注销后必须删除(或匿名化):

  • 个人身份信息(PII):姓名、邮箱、手机号、头像
  • 账号凭证:密码哈希、API Key、OAuth Token
  • 个人偏好设置:主题、语言、通知设置
  • 个人内容:用户上传的文件、创建的 AI 作品、对话历史
  • 第三方关联:OAuth 绑定的第三方账号信息

3.4 数据保留策略设计原则

设计数据保留策略时遵循以下原则:

  1. 数据分类先行:按数据类别制定不同的保留规则,不要一刀切
  2. 最短保留原则:只保留实现目的所必需的最短时间
  3. 自动化执行:保留期限到期后自动删除,不依赖人工操作
  4. 文档化:将保留策略写成书面文件,定期审查和更新
  5. 透明告知:在隐私政策中明确告知用户各类数据的保留期限

四、用户沟通:流程设计和确认机制

账号注销的用户沟通不仅影响用户体验,也是法律合规的重要证据。GDPR 和中国《个保法》都要求注销流程清晰、便捷。

4.1 注销流程设计

一个合规的账号注销流程应该包含以下步骤:

适读画布 · 130%
Mermaid 流程图加载中...

流程设计要点:

  • 入口清晰可达:从主页面不超过 3 次点击可以到达注销入口。中国监管实践明确要求「设置→账号与安全→注销账号」的路径不超过三次点击
  • 注销前告知:清晰说明注销后的影响——数据将被删除、无法恢复、服务将终止。不要用模糊的法律用语,用用户能理解的语言
  • 注销原因收集:提供一个可选的原因选择器,帮助产品改进。但不要将填写原因设置为强制条件
  • 身份验证:注销前要求重新验证身份(输入密码、验证码或二次验证),防止账号被盗后恶意注销
  • 未完成事项检查:检查用户是否有未完成的订单、未到期的订阅、未结清的款项。如果有,明确告知处理方式
  • 二次确认:在最后一步要求用户明确确认。可以使用输入「CONFIRM」或「我确认注销」的方式,避免误操作

4.2 确认机制

确认方式安全级别用户体验适用场景
简单弹窗确认低风险操作
输入密码确认一般账号操作
短信/邮箱验证码涉及敏感数据的操作
输入特定文字确认防止误操作的最终确认
多因素组合最高高价值账号

推荐方案是「密码确认 + 邮箱验证码 + 输入确认文字」的三重组合。密码确认防止他人操作,邮箱验证码确认账号归属,输入确认文字防止误操作。

4.3 等待期沟通

如果采用延迟删除方案(推荐 30 天等待期),需要在以下时间点与用户沟通:

  1. 注销申请时:告知等待期的存在和时长,说明等待期内可以撤销
  2. 等待期内:如果用户重新登录,提示账号处于「待注销」状态,提供撤销选项
  3. 删除执行后:发送最终确认邮件,告知数据已删除(发送到注销前预留的联系邮箱)

4.4 数据删除证明

GDPR 下,数据控制者需要能够证明删除操作已经完成。建议提供以下证据:

  • 删除操作日志:记录删除时间、执行方式、影响的数据范围
  • 自动化报告:定期生成数据删除合规报告
  • 用户可查询的状态:在等待期内用户可以查询自己的删除进度

五、技术实现:数据库设计和备份处理

5.1 数据库设计

以下是一个面向出海 SaaS 的账号注销数据模型设计:

-- 用户账号状态机
CREATE TYPE user_status AS ENUM (
    'active',               -- 正常使用
    'pending_deletion',     -- 等待删除(等待期内)
    'deleted',              -- 已删除(物理删除完成)
    'deactivated'           -- 已停用(软删除,可恢复)
);
 
-- 用户表增加注销相关字段
ALTER TABLE users ADD COLUMN status user_status DEFAULT 'active';
ALTER TABLE users ADD COLUMN deletion_requested_at TIMESTAMP;
ALTER TABLE users ADD COLUMN deletion_scheduled_at TIMESTAMP;
ALTER TABLE users ADD COLUMN deletion_completed_at TIMESTAMP;
ALTER TABLE users ADD COLUMN deletion_reason TEXT;
ALTER TABLE users ADD COLUMN anonymized_at TIMESTAMP;
 
-- 注销请求日志表
CREATE TABLE deletion_requests (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    user_id UUID NOT NULL REFERENCES users(id),
    requested_at TIMESTAMP NOT NULL DEFAULT NOW(),
    reason TEXT,
    verification_method VARCHAR(50),
    status VARCHAR(20) NOT NULL DEFAULT 'pending',
    -- pending / confirmed / cancelled / completed
    cancelled_at TIMESTAMP,
    completed_at TIMESTAMP,
    completed_by VARCHAR(50)
    -- manual / scheduled_job
);
 
-- 数据保留规则表
CREATE TABLE data_retention_rules (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    data_category VARCHAR(100) NOT NULL,
    -- transaction / contract / security_log / personal_data / user_content
    legal_basis VARCHAR(100) NOT NULL,
    -- tax_law / contract_defense / legitimate_interest / consent
    retention_period INTERVAL NOT NULL,
    -- e.g. '7 years' / '180 days'
    action_after_expiry VARCHAR(20) NOT NULL
    -- delete / anonymize
);

5.2 注销执行 Worker

账号注销的数据删除通常涉及多个数据表和关联系统,不适合在请求中同步完成。推荐使用后台 Worker 异步执行:

// 阶段一:发起注销请求
async function requestDeletion(
  userId: string,
  reason: string,
  verificationMethod: string
) {
  const user = await db.users.findUnique({ where: { id: userId } })
  if (!user) throw new NotFoundError('用户不存在')
  if (user.status !== 'active') throw new BadRequestError('账号状态异常')
 
  // 创建注销请求记录
  const request = await db.deletionRequests.create({
    data: {
      userId,
      reason,
      verificationMethod,
      status: 'confirmed',
    },
  })
 
  // 更新用户状态为待删除,设定 30 天后执行
  await db.users.update({
    where: { id: userId },
    data: {
      status: 'pending_deletion',
      deletionRequestedAt: new Date(),
      deletionScheduledAt: addDays(new Date(), 30),
      deletionReason: reason,
    },
  })
 
  // 发送确认邮件
  await sendDeletionConfirmationEmail(user.email, request.id)
 
  return request
}
 
// 阶段二:定时任务执行物理删除
async function processScheduledDeletions() {
  const pendingUsers = await db.users.findMany({
    where: {
      status: 'pending_deletion',
      deletionScheduledAt: { lte: new Date() },
    },
  })
 
  for (const user of pendingUsers) {
    try {
      await executeUserDataDeletion(user.id)
      await db.users.update({
        where: { id: user.id },
        data: {
          status: 'deleted',
          deletionCompletedAt: new Date(),
        },
      })
      await db.deletionRequests.update({
        where: { userId: user.id, status: 'confirmed' },
        data: { status: 'completed', completedBy: 'scheduled_job' },
      })
    } catch (error) {
      // 记录错误,不标记完成,等待重试
      logger.error('数据删除失败', { userId: user.id, error })
    }
  }
}
 
// 阶段三:执行具体数据删除
async function executeUserDataDeletion(userId: string) {
  // 1. 删除用户个人数据
  await db.userProfiles.delete({ where: { userId } })
  await db.userPreferences.delete({ where: { userId } })
  await db.userSessions.deleteMany({ where: { userId } })
  await db.oauthConnections.deleteMany({ where: { userId } })
 
  // 2. 处理用户内容——区分可删除和需匿名化的部分
  await db.userContents.deleteMany({ where: { authorId: userId } })
 
  // 3. 匿名化不能删除但需去除个人关联的数据
  await db.auditLogs.updateMany({
    where: { userId },
    data: {
      userId: null,
      userIdentifier: 'deleted_user',
      ipAddress: '0.0.0.0',
    },
  })
 
  // 4. 通知第三方服务删除数据
  await notifyThirdPartyDataDeletion(userId)
 
  // 5. 从搜索索引、缓存中清除
  await invalidateUserCache(userId)
  await removeFromSearchIndex(userId)
}

5.3 备份系统处理

备份系统中的用户数据是一个常见难题。定期备份(如每日快照)中可能包含已注销用户的数据。处理方案:

方案实现方式合规性成本
备份过期自动清除备份设置保留期限(如 90 天),到期后自动覆盖高(备份过期后数据自然消失)
备份中匿名化恢复备份时将已删除用户数据匿名化
加密删除(Crypto-shreddbing)用户数据用独立密钥加密,删除时销毁密钥高(数据变成不可读密文)
忽略备份中的数据不做特殊处理低(可能不合规)

推荐使用「备份过期自动清除 + 加密删除」的组合方案。对用户个人数据使用独立加密密钥,用户注销时销毁密钥,数据变为不可恢复的密文。同时设置合理的备份保留期限(建议不超过 90 天),过期备份自动清理。

5.4 第三方服务数据同步

SaaS 产品通常会将用户数据同步到多个第三方服务(邮件服务商、分析工具、CDN、日志服务等)。用户注销时需要通知这些服务同步删除:

  • 邮件服务商(SendGrid、Mailgun):删除联系人记录和邮件地址
  • 分析工具(Mixpanel、Amplitude):删除用户标识和关联行为数据
  • 日志服务(Datadog、Loggly):清除包含用户 PII 的日志条目
  • CDN / 对象存储(S3、CloudFront):删除用户上传的文件
  • 支付服务(Stripe):保留必要的交易记录,删除个人信息

六、案例分析

案例一:AI 写作工具的账号注销实现

某 AI 写作工具面向欧美市场,用户注册后会生成大量 AI 写作内容。用户请求注销时面临以下挑战:

数据分类挑战

  • 用户个人身份信息(邮箱、头像)→ 必须删除
  • 用户创建的 AI 写作内容 → 区分个人创作和团队协作内容
  • AI 模型训练数据(如果用户协议允许使用用户内容训练)→ 需要评估是否已纳入训练数据集
  • 协作空间中的内容 → 其他成员的内容不能因一个用户注销而删除

解决方案

  1. 用户创建的个人内容(私有文档)→ 直接删除
  2. 协作空间中的内容 → 将作者标识替换为「已注销用户」,保留内容本身
  3. 已纳入 AI 训练数据集的内容 → 无法从已训练的模型中「撤回」,在隐私政策中提前告知用户这一点,并提供注销前手动退出的选项
  4. 交易记录 → 匿名化处理,保留金额和时间戳用于财务统计,去除用户个人信息

技术实现要点

  • 使用延迟删除方案,设置 30 天等待期
  • 等待期内用户重新登录时提示「您的账号正在注销中,是否撤销?」
  • 物理删除分三步执行:删除个人数据 → 匿名化协作内容 → 清理缓存和索引
  • 备份采用加密删除方案,用户数据使用独立密钥加密

案例二:中国出海社交应用的注销合规

某社交应用同时面向中国国内和东南亚市场,需要同时满足中国《个保法》和目标市场的数据保护要求。

合规挑战

  • 中国要求 15 个工作日内响应注销请求
  • 部分东南亚国家有本地数据保留要求(如越南要求部分数据本地存储)
  • 社交应用中用户发布的内容涉及其他用户的隐私

解决方案

  1. 注销入口设在「设置→账号与安全→注销账号」,3 次点击可达
  2. 注销前检查:未完成的订单、未到期的会员、关联的第三方登录
  3. 设置 15 天等待期(满足中国市场要求,同时给东南亚市场留出响应时间)
  4. 用户发布的内容处理:
    • 纯文字内容 → 保留但标注「该用户已注销」
    • 图片/视频 → 删除(这些内容包含用户的个人形象)
    • 私信记录 → 发送方内容标记为「已注销用户发送」,接收方保留可见
  5. 跨国数据删除:通过数据映射工具确认用户数据存储的所有位置(主库、从库、搜索引擎、缓存、日志),确保所有位置同步清除

关键教训

  • 早期版本将注销入口放在「帮助与反馈」页面下,收到用户投诉和监管问询后移至「账号与安全」
  • 等待期从 7 天调整为 15 天,因为部分用户在 7 天内无法完成数据导出
  • 建立了数据地图(Data Map),明确记录每类数据的存储位置、保留期限和删除方式,便于合规审查

七、对比表格汇总

7.1 删除策略对比

维度软删除硬删除延迟删除加密删除
数据可恢复性完全可恢复不可恢复等待期内可恢复不可恢复(密钥销毁后)
GDPR 合规不满足满足等待期内不满足满足
外键影响需要处理级联需要处理级联无(数据变为密文)
备份处理无特殊需求需清理备份等待期内备份保留销毁密钥即可
实现复杂度中高
推荐场景内部系统简单系统面向消费者的 SaaS大规模数据系统

7.2 各市场法律要求对比

维度GDPR(欧盟)CCPA/CPRA(加州)个保法(中国)LGPD(巴西)
删除权条款第 17 条Section 1798.105第 47 条第 18 条
响应时限30 天45 天15 个工作日合理时间
可拒绝情形言论自由、法律义务、公共利益法律义务、公共安全法律义务、公共利益法律义务、研究
请求渠道至少一种网站 + 电话至少一种至少一种
第三方通知需通知数据处理者需通知 Service Provider需通知受托处理者需通知处理者
违规处罚最高 2000 万欧元或全球营收 4%每次违规最高 7500 美元最高 5000 万元或上年营收 5%最高营收 2%

7.3 技术实现方案对比

组件方案 A(简单)方案 B(推荐)方案 C(企业级)
删除策略硬删除延迟删除延迟删除 + 加密删除
等待期30 天30-90 天
数据分类全部删除按类别分别处理按类别处理 + 匿名化管道
备份处理等备份自然过期备份中匿名化加密删除 + 备份匿名化
第三方通知手动处理API 自动通知API + 异步队列 + 重试
审计日志基础日志完整审计链 + 合规报告
用户通知删除后一封邮件注销申请 + 等待期 + 完成通知全链路通知 + 数据导出提醒

7.4 用户沟通方案对比

维度基础方案标准方案高安全方案
注销入口设置页深层设置→账号安全设置→账号安全 + 帮助页入口
身份验证密码确认密码 + 邮箱/短信验证码
注销前告知简单提示详细风险说明 + 数据导出入口详细风险说明 + 数据导出 + 等待期说明
确认方式简单弹窗输入确认文字密码 + 验证码 + 确认文字
等待期通知申请时 + 完成时申请时 + 等待期中 + 完成时
注销后确认邮件确认邮件 + 站内信 + 短信确认

八、检查清单

完成账号注销和数据删除功能前,逐项检查以下内容:

法律合规

  • 已识别所有适用市场的数据删除权要求(GDPR、CCPA、个保法等)
  • 响应时限满足各市场要求(GDPR 30 天、CCPA 45 天、个保法 15 工作日)
  • 隐私政策中明确说明了注销流程和数据保留策略
  • 已记录哪些数据因法律义务需要保留,以及保留期限
  • 拒绝删除请求时有合法理由,并能向用户说明

流程设计

  • 注销入口清晰可达,不超过 3 次点击
  • 注销前充分告知用户注销的影响和数据处理方式
  • 提供注销原因收集(可选,不强制)
  • 有身份验证环节防止冒名注销
  • 有未完成事项检查(订单、订阅、余额)
  • 有二次确认机制防止误操作

技术实现

  • 采用延迟删除方案,给予用户合理等待期
  • 数据删除覆盖所有存储位置(主库、缓存、搜索引擎、日志)
  • 备份系统有明确的数据清除策略
  • 第三方服务有同步删除机制或 API 对接
  • 删除操作有完整审计日志
  • 数据分类处理:个人数据删除、协作内容匿名化、法定数据保留

用户沟通

  • 注销申请时发送确认通知
  • 等待期内用户重新登录有明确提示
  • 删除完成后发送最终确认通知
  • 提供数据导出功能(满足数据可携带权)

持续运营

  • 定期审查数据保留规则是否仍然合理
  • 监控删除任务的执行成功率
  • 保留注销请求和处理记录作为合规证据
  • 团队成员了解注销流程和数据删除规范

参考资料

  1. GDPR 第 17 条 — 删除权(被遗忘权)
  2. ICO — Right to Erasure 官方指南
  3. GDPR.eu — 被遗忘权完整指南
  4. Building GDPR-Compliant User Deletion: A Full-Stack Approach
  5. Best Practices for GDPR-Compliant Data Deletion — Reform.app
  6. How to Handle SaaS Data Deletion Requests — Waldo Security
  7. 汇业律师事务所 — 账户注销及用户信息删除的合规实务问答
  8. 安全内参 — 《个保法》实施:用户行使个人信息删除权的现状调研
  9. Create a Deletion Concept in Accordance with the GDPR — ISiCO
  10. GDPR Data Retention Periods: Rules & Best Practices — heyData