最严格的数据保护法。影响任何处理欧盟居民数据的公司,无论公司在哪里。
美国最严格的隐私法。赋予加州居民数据权利,年收入 >$25M 或 5 万+消费者数据的企业适用。
个人信息保护法 + 数据安全法 + 网络安全法。数据出境需要安全评估,ICP 备案等。
| 原则 | 含义 | SaaS 实践 |
|---|---|---|
| 合法、公平、透明 | 有合法基础处理数据,对用户诚实 | 隐私政策清晰说明数据处理 |
| 目的限制 | 只为声明的目的处理数据 | 不把用户数据用于未说明的用途 |
| 数据最小化 | 只收集必要的数据 | 注册不要问出生日期(除非必要) |
| 准确性 | 保持数据准确、及时更新 | 允许用户更新个人信息 |
| 存储限制 | 不保留超过必要时间的数据 | 设置数据保留策略(如日志 90 天) |
| 完整性和保密性 | 确保数据安全 | 加密存储、访问控制、审计日志 |
| 可问责性 | 能证明你遵守了以上原则 | 文档化所有数据处理活动 |
// 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);
});
如果你使用第三方服务处理用户数据(几乎一定有),你需要与它们签署数据处理协议(Data Processing Agreement)。
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 在中国运营或有中国用户,需要了解三部法律:
隐私政策是法律要求,也是用户信任的基石。
// 用工具生成隐私政策,不要从零写
// 推荐工具:
// 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 },
]
服务条款定义了你和用户之间的法律关系。它保护你的公司,也设定了用户预期。
| 条款 | 要点 |
|---|---|
| 服务描述 | 清楚说明你提供什么服务 |
| 账户条款 | 注册要求、账户安全责任、可拒绝服务 |
| 可接受使用 | 禁止的行为:违法、侵权、滥用 |
| 用户内容 | 用户保留内容版权,授予你使用许可 |
| 知识产权 | 你的品牌、代码、设计的归属 |
| 付费和退款 | 定价、付款方式、自动续费、退款政策 |
| 服务级别 | 不保证 100% 可用性(SLA 另议) |
| 责任限制 | 限制你的最大责任(通常为 12 个月付款额) |
| 终止 | 双方终止条件、终止后数据处理 |
| 争议解决 | 仲裁条款、管辖法院 |
当你的数据处理可能对用户权利造成高风险时,GDPR 要求进行 DPIA。
大多数标准 SaaS(CRM、项目管理、协作工具)不需要 DPIA。但如果涉及 AI 用户画像或大规模个人数据分析,就需要评估。
// 简单的 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/月起 |