⚖️ 合规:隐私政策 / TOS / GDPR / 数据保护

合规不是可选的——一次数据泄露或 GDPR 罚款可以让你的 SaaS 关门。提前做好,比事后补救便宜 100 倍
📋 目录

合规概览

🇪🇺
GDPR
欧盟/欧洲经济区

最严格的数据保护法。影响任何处理欧盟居民数据的公司,无论公司在哪里。

🇺🇸
CCPA/CPRA
美国加利福尼亚州

美国最严格的隐私法。赋予加州居民数据权利,年收入 >$25M 或 5 万+消费者数据的企业适用。

🇨🇳
PIPL / 数据安全法
中国

个人信息保护法 + 数据安全法 + 网络安全法。数据出境需要安全评估,ICP 备案等。

⚠️ 重要:本文是技术视角的合规参考,不构成法律建议。正式发布前请咨询专业律师。尤其是 GDPR 罚款可达全球营业额的 4% 或 €20M(取高者),值得认真对待。

GDPR 详解

GDPR 核心原则

原则 含义 SaaS 实践
合法、公平、透明 有合法基础处理数据,对用户诚实 隐私政策清晰说明数据处理
目的限制 只为声明的目的处理数据 不把用户数据用于未说明的用途
数据最小化 只收集必要的数据 注册不要问出生日期(除非必要)
准确性 保持数据准确、及时更新 允许用户更新个人信息
存储限制 不保留超过必要时间的数据 设置数据保留策略(如日志 90 天)
完整性和保密性 确保数据安全 加密存储、访问控制、审计日志
可问责性 能证明你遵守了以上原则 文档化所有数据处理活动

GDPR 数据主体权利

📋 用户权利(你必须支持)
  • 访问权 — 用户可要求查看其所有数据
  • 更正权 — 修正不准确的数据
  • 删除权(被遗忘权) — 要求删除其个人数据
  • 限制处理权 — 要求暂停处理其数据
  • 数据可携带权 — 以机器可读格式导出数据
  • 反对权 — 反对基于合法利益的处理
🔧 技术实现要点
  • 数据导出 API(JSON/CSV 格式)
  • 用户数据删除功能(硬删除,不是软删除)
  • 数据处理的合法基础记录
  • 同意管理(Consent Management)
  • Cookie 同意弹窗(如果用 Cookie)
  • 数据处理活动记录(ROPA)

数据删除实现

// GDPR 数据删除端点
app.post('/api/privacy/delete', requireAuth, async (req, res) => {
  const userId = req.user.id;

  // 1. 验证请求(可选:要求二次确认)
  // 2. 匿名化或删除用户数据
  await db.$transaction(async (tx) => {
    // 删除关联数据
    await tx.analyticsEvents.deleteMany({ where: { userId } });
    await tx.activityLog.deleteMany({ where: { userId } });
    await tx.sessions.deleteMany({ where: { userId } });

    // 匿名化需要保留的数据(如账单记录)
    await tx.invoices.updateMany({
      where: { userId },
      data: {
        userEmail: 'deleted@privacy.request',
        userName: '[Deleted]',
        userAddress: null,
      }
    });

    // 删除第三方服务中的数据
    await posthog.deleteUser(userId);
    await stripe.customers.del(user.stripeCustomerId);

    // 最后删除用户记录
    await tx.users.delete({ where: { id: userId } });
  });

  // 3. 发送确认邮件
  await emailService.send('data_deletion_confirmed', {
    to: req.user.email, // 发送后再删除
  });

  res.json({ message: 'Data deletion completed within 30 days' });
});

// 数据导出端点
app.get('/api/privacy/export', requireAuth, async (req, res) => {
  const userData = await db.users.findUnique({
    where: { id: req.user.id },
    include: {
      projects: true,
      invoices: true,
      activityLog: { take: 1000 },
    }
  });

  res.setHeader('Content-Type', 'application/json');
  res.setHeader('Content-Disposition', 'attachment; filename=user-data.json');
  res.json(userData);
});

数据处理协议(DPA)

如果你使用第三方服务处理用户数据(几乎一定有),你需要与它们签署数据处理协议(Data Processing Agreement)。

📋 常见第三方服务的 DPA 状态

CCPA / 美国隐私法

CCPA(加州消费者隐私法)和 CPRA(加州隐私权法)是美国最严格的隐私法规。

维度 GDPR CCPA/CPRA
适用范围 处理欧盟居民数据的所有公司 年收入 >$25M / 10万+消费者 / 50%+收入来自卖数据
同意模式 Opt-in(默认不处理,同意后才处理) Opt-out(默认可处理,用户可拒绝)
"Do Not Sell" 无此概念 必须提供"Do Not Sell My Info"链接
罚款 最高全球营收 4% 或 €20M $2,500/次无意违规,$7,500/次有意违规
数据删除 被遗忘权 删除请求权

中国数据法规

如果你的 SaaS 在中国运营或有中国用户,需要了解三部法律:

🔒 网络安全法
  • ICP 备案(网站必须)
  • 网络安全等级保护
  • 关键信息基础设施运营者要求
📊 数据安全法
  • 数据分类分级保护
  • 重要数据出境安全评估
  • 数据安全风险评估
👤 个人信息保护法(PIPL)
  • 类似 GDPR 的个人数据保护
  • 数据出境需要安全评估/认证/标准合同
  • 个人信息影响评估
⚠️ 中国 SaaS 特别注意:

隐私政策

隐私政策是法律要求,也是用户信任的基石。

隐私政策必备内容

📋 隐私政策检查清单

隐私政策模板

// 用工具生成隐私政策,不要从零写
// 推荐工具:
// 1. Termly (free generator) — https://termly.io/
// 2. Iubenda — https://www.iubenda.com/
// 3. PrivacyPolicies.com — https://www.privacypolicies.com/
// 4. GetTerms — https://getterms.io/

// 自动更新隐私政策中的第三方列表
const thirdParties = [
  { name: 'Amazon Web Services', purpose: 'Hosting', data: 'All data', dpa: true },
  { name: 'Stripe', purpose: 'Payment processing', data: 'Payment info', dpa: true },
  { name: 'PostHog', purpose: 'Product analytics', data: 'Usage events', dpa: true },
  { name: 'Resend', purpose: 'Email delivery', data: 'Email address', dpa: true },
  { name: 'Cloudflare', purpose: 'CDN & DNS', data: 'IP address', dpa: true },
]

服务条款(Terms of Service)

服务条款定义了你和用户之间的法律关系。它保护你的公司,也设定了用户预期。

核心条款

条款 要点
服务描述 清楚说明你提供什么服务
账户条款 注册要求、账户安全责任、可拒绝服务
可接受使用 禁止的行为:违法、侵权、滥用
用户内容 用户保留内容版权,授予你使用许可
知识产权 你的品牌、代码、设计的归属
付费和退款 定价、付款方式、自动续费、退款政策
服务级别 不保证 100% 可用性(SLA 另议)
责任限制 限制你的最大责任(通常为 12 个月付款额)
终止 双方终止条件、终止后数据处理
争议解决 仲裁条款、管辖法院
💡 快速起步:GetTerms.ioTermly 生成初版,然后找律师审核。不要直接抄竞品的条款——他们的业务和你的不同。

数据保护影响评估(DPIA)

当你的数据处理可能对用户权利造成高风险时,GDPR 要求进行 DPIA。

📋 何时需要 DPIA

大多数标准 SaaS(CRM、项目管理、协作工具)不需要 DPIA。但如果涉及 AI 用户画像或大规模个人数据分析,就需要评估。

合规技术实现

Cookie 同意管理

// 简单的 Cookie 同意组件
function CookieConsent() {
  const [consent, setConsent] = useLocalStorage('cookie_consent', null)

  useEffect(() => {
    if (consent === 'granted') {
      // 启用分析
      analytics.init()
    } else if (consent === 'denied') {
      // 只启用严格必要的功能
    }
  }, [consent])

  if (consent) return null

  return (
    <div className="cookie-banner">
      <p>We use cookies for analytics. Read our <a href="/privacy">Privacy Policy</a>.</p>
      <button onClick={() => setConsent('granted')}>Accept</button>
      <button onClick={() => setConsent('denied')}>Reject</button>
      <a href="/privacy#cookies">Manage preferences</a>
    </div>
  )
}

数据保留策略

// 自动数据清理(定时任务)
// cron: 每天凌晨执行

async function cleanupExpiredData() {
  const thirtyDaysAgo = new Date(Date.now() - 30 * 24 * 60 * 60 * 1000)
  const ninetyDaysAgo = new Date(Date.now() - 90 * 24 * 60 * 60 * 1000)
  const oneYearAgo = new Date(Date.now() - 365 * 24 * 60 * 60 * 1000)

  // 会话日志:30 天
  await db.sessionLogs.deleteMany({
    where: { createdAt: { lt: thirtyDaysAgo } }
  })

  // 分析事件:90 天(PostHog 自托管可能更长)
  await db.analyticsEvents.deleteMany({
    where: { recordedAt: { lt: ninetyDaysAgo } }
  })

  // 已删除用户的数据:立即
  await db.userData.deleteMany({
    where: { userDeletedAt: { not: null } }
  })

  // 审计日志:1 年
  await db.auditLogs.deleteMany({
    where: { createdAt: { lt: oneYearAgo } }
  })
}

数据加密

// 传输加密:HTTPS(TLS 1.2+)—— Cloudflare/Let's Encrypt
// 存储加密

// 1. 数据库级加密(PostgreSQL TDE 或云提供商加密)
// AWS RDS: 自动加密
// 自托管: pgcrypto 扩展

// 2. 应用级敏感字段加密
const crypto = require('crypto')

const ENCRYPTION_KEY = process.env.ENCRYPTION_KEY // 32 bytes

function encrypt(text) {
  const iv = crypto.randomBytes(16)
  const cipher = crypto.createCipheriv('aes-256-gcm', ENCRYPTION_KEY, iv)
  let encrypted = cipher.update(text, 'utf8', 'hex')
  encrypted += cipher.final('hex')
  const tag = cipher.getAuthTag()
  return { encrypted, iv: iv.toString('hex'), tag: tag.toString('hex') }
}

function decrypt(encrypted, ivHex, tagHex) {
  const iv = Buffer.from(ivHex, 'hex')
  const tag = Buffer.from(tagHex, 'hex')
  const decipher = crypto.createDecipheriv('aes-256-gcm', ENCRYPTION_KEY, iv)
  decipher.setAuthTag(tag)
  let decrypted = decipher.update(encrypted, 'hex', 'utf8')
  decrypted += decipher.final('utf8')
  return decrypted
}

合规工具

工具 功能 定价
Termly 隐私政策/TOS/Cookie 同意生成器 免费起步,Pro $9/月
Iubenda 隐私政策/Cookie 同意/条款生成 免费起步,Pro €9/月
OneTrust 企业级隐私管理平台 联系销售
Cookiebot Cookie 同意管理 免费 <100 页,€8/月起
Vanta SOC 2 / ISO 27001 合规自动化 $1,000/月起
Drata SOC 2 / HIPAA 合规自动化 $1,000/月起
💡 早期 SaaS 合规路径:
  1. 先用 Termly/GetTerms 生成隐私政策 + TOS(0 成本)
  2. 实现数据导出和删除 API(GDPR 要求)
  3. 加上 Cookie 同意组件(如用分析工具)
  4. 大客户要求 SOC 2 时,用 Vanta/Drata 加速认证

SaaS 合规清单

✅ 上线前必做
✅ 增长期补充

🔗 相关章节