日志表既要存一年,又要随时能删
PCI DSS 要求保留 12 个月审计记录,GDPR 要求及时删除,解法在于 API 接收什么、日志记录什么。
要点速览
- PCI DSS 要求审计日志至少保留 12 个月;GDPR 第 17 条要求无不当延迟地删除个人数据。日志只存引用、不存数据内容,两者最容易兼顾。
- 审计日志里自由格式的 details 字段,是 PAN、CVV 和令牌泄露的常见途径;应在写入时用允许字段白名单拦截。
- CCPA 给知情、删除、更正请求留出 45 个自然日的处理期限,并设有例外,因此删除必须设计成有状态的工作流。
一项标准要求审计日志至少保留 12 个月;一部法律要求在有正当理由时“无不当延迟”地删除个人数据。把客户的邮箱地址写进一个必须存活 12 个月的日志库,等于给今后每一个删除请求都多造了一个必须触及的地方。
为欧美用户开发支付、医疗或电商平台 API 的人,都会碰到这个问题。把 GDPR、CCPA/CPRA、HIPAA 和 PCI DSS 逐条读下来,大部分内容最终归结为三个工程决策:API 接收哪些字段,日志记录什么,数据存在哪里、存多久。
想成为前线部署工程师(FDE)的人,值得在设计层面弄懂这些。一旦接触客户的真实数据,这些决策就要由你来做,至少要能解释清楚。
两股力量拉扯同一张日志表
第一股力量要求“记住”。根据 OneUptime 对 PCI DSS 的分析,要求 10.5.1 规定审计记录至少保留 12 个月,且最近三个月须可立即调取。
Wiz Academy 也把追踪每次 API 调用和响应的日志列为合规控制措施,因为它记录了数据在何时、何种情境下被访问。Traceable 则把“日志与监控不足”列为 API 的主要合规风险之一。
第二股力量要求“遗忘”。GDPR 自 2018 年 5 月 25 日起在所有欧盟成员国适用,其中第 25 条要求系统在设计上落实数据最小化等原则,第 17 条要求控制者在有正当理由时无不当延迟地删除个人数据。
GDPR 并非只管欧洲公司。它约束的是对欧盟境内个人数据的处理,所以一支在河内为德国客户提供服务的团队,同样在其适用范围内。
不过,只有当日志里含有个人数据时,两股力量才会真正冲突。一行“用户 84213 于 09:14 读取记录 5521,结果 200”的日志,放 12 个月也无妨。
而一行把包含姓名、邮箱和电话的完整响应体照搬下来的日志,会让日志库变成第二个个人信息数据库,每个删除请求都得伸进去处理。
泄露往往出在“details”字段
“记录每次 API 调用和响应”听上去很稳妥,却也是最容易泄露数据的做法。OneUptime 指出一种非常常见的失败模式:审计记录里一个通用的 details 对象,成了 PAN、CVV 和认证令牌的泄露通道。开发者为了方便调试加上这个字段,某天就有人把整个请求体塞了进去。
在 PCI DSS 下,后果最为直接。卡验证码和其他敏感认证数据在交易授权后不得保留。如果 CVV 混进了日志,而按 10.5.1 这些日志又必须保留 12 个月,你就让自己违规了整整 12 个月。
设想一个 POST /payments 接口。“省事”的日志长这样:
{"event":"payment.create","user":"[email protected]","details":{"pan":"4111...","cvv":"123","amount":250000}}
按合规设计的日志只保留审计人员需要的内容:
{"event":"payment.create","actor_id":"u_84213","resource":"pay_9f2a","card_ref":"tok_7c1e","result":"authorized","ts":"2026-10-08T09:14:02Z"}
区别在于数据如何被拦下。OneUptime 建议在写入环节阻止敏感载荷,而不是指望每个开发者都记得脱敏。实践中最持久的做法是白名单式的日志结构:日志组件拒绝任何不在名单上的字段,根本不存在自由格式字段。
删除是一套工作流,不是一条 DELETE 语句
如果说日志是法律要求你“记住”的地方,那么用户权利就是法律要求你证明自己清楚数据在哪里的地方。
Wiz Academy 总结道,在 CCPA/CPRA 下,API 必须支持四项权利:知情权、删除权、拒绝出售或共享权、更正权,同时要对收集、处理和保留做到透明。
加州总检察长办公室给出了具体数字:知情、删除或更正请求须在 45 个自然日内答复,可再延长 45 天。落到日历上,3 月 1 日收到的请求,默认截止日是 4 月 15 日,延期后最晚到 5 月底。
系统需要为每个请求保存收到日期、状态和截止日期。这意味着要有一张带状态机的 privacy_requests 表,而不是一张四处漂流的 Jira 工单。
CCPA 的删除权还附带“若干例外”。因此删除流程不能一刀切:它必须检查哪些记录因正当理由需要保留,删除其余部分,并记录这一决定。
GDPR 第 17 条又加上了时效压力,而这种压力会传导到数据的每一份副本:主数据库、副本、缓存、日志库和备份。
在风险方面,CCPA 一般不允许个人自行起诉,数据泄露除外:此时按事件计算法定赔偿,每起事件最高 750 美元。其他违规由总检察长或该州隐私保护机构(CPPA)处理。
泄露是用户少有的可以直接起诉的情形,所以一个塞满个人数据的日志库,恰恰是工程师能通过设计砍掉的那部分风险。
哪条规定落在哪一层
把各项要求分到三个技术层,工程师要承担的部分就一目了然:
| 法规 | 关键条款 | API | 日志 | 存储 |
|---|---|---|---|---|
| GDPR | 第 25 条:设计即保护数据;第 17 条:删除权 | 只接收真正需要的字段 | 不把个人数据复制进日志 | 所有副本(包括备份)都可删除 |
| CCPA/CPRA | 四项权利:知情、删除、拒绝出售/共享、更正;45 天期限 | 每项权利对应一个接口或流程 | 记录每个请求的处理过程 | 删除前检查例外 |
| HIPAA | 隐私规则、安全规则、泄露通知规则 | 管控 ePHI 的接收和处理 | 留有足够痕迹以发现并报告泄露 | 对 ePHI 实施安全控制 |
| PCI DSS 4.0 | API 专项要求;要求 10.5.1 | 认证、授权、加密 | 保留 12 个月,3 个月可立即调取 | 授权后不保留 CVV |
按列往下看,日志层是要求重叠最密集的一层,也因此最值得从第一天起认真设计。
HIPAA 和 PCI DSS 4.0 比想象中更直白
大多数法规从不提“API”这个词。Wiz Academy 指出了例外:PCI DSS 4.0 专门为 API 设定了合规要求,涵盖认证、访问控制、加密和漏洞管理。
HIPAA 由三项规则组成:隐私规则、安全规则和泄露通知规则。按 Wiz 的解读,API 必须同时管控 ePHI 的接收和处理,配套相应的安全措施,并能支持泄露通知。
第三项规则又把问题拉回日志:没有完整的访问痕迹,就说不清是谁的数据被泄露了。
所以,如果在客户系统里只能先做一件事,那就是梳理敏感数据的流向:它从哪些接口进入,写进了哪些日志,复制到了哪些存储。这张图能同时回应 PCI 审计、GDPR 删除请求和 HIPAA 通知义务。
对 FDE 来说,最合适的时机是驻场第一周,在把任何 Agent 或数据管道接入客户系统之前的数据流评审中。这时发现一个塞满卡号的 details 字段,比在审计时才发现要便宜得多。
一项值得写进简历的技能
如果你瞄准的项目服务欧盟或加州用户,或者处理银行卡、健康数据,这些法规就会跟着项目走,不管你人在哪里。
阅读岗位描述时,留意 PCI、HIPAA、GDPR、audit logging、data retention、PII handling 这类词,把它们当作信号:你要做的是设计决策,而不只是写 CRUD。
简历上不要写“了解 GDPR”,要写你做了什么:一个在写入环节拦截 PAN 和令牌的白名单日志组件;一套带 45 天 SLA 和例外分支的数据删除工作流;一项热存储 3 个月、冷存储 9 个月、合计满 12 个月的日志保留策略。
面试官可以就其中任何一行深挖,而你能用自己真正做过的决策来回答。
数据法规还会不断变化,但设计原则是稳定的:日志按 ID 记录操作,个人数据只存在一个知道如何删除自己的地方。从第一天起这样设计的工程师,在审计人员上门时不必重写系统。
这篇文章对你有帮助吗?
感谢你的反馈!
7 个信源
- How Can I Achieve API Compliance? (Traceable) · 2022-03-14
- What is API compliance? A cloud security perspective (Wiz Academy)
- California Consumer Privacy Act (CCPA) – California Attorney General · 2026-08-28
- General Data Protection Regulation (GDPR) – gdpr-info.eu
- Art. 25 GDPR – Data protection by design and by default
- Art. 17 GDPR – Right to erasure ('right to be forgotten')
- How to Build PCI DSS Audit Logs Without Recording Sensitive Authentication Data (OneUptime) · 2026-09-24