FDE Times 数据在招 FDE 职位 863▼55 近 7 天在招职位数的变化(同口径比较):不计入本周新开始追踪的公司的职位近 7 天新增 71在招公司 181支持远程 24%美国薪资中位数 $200k招聘最多 Palantir 95
ENVI

前线部署工程师(FDE)的专业媒体

分析

日志表既要存一年,又要随时能删

PCI DSS 要求保留 12 个月审计记录,GDPR 要求及时删除,解法在于 API 接收什么、日志记录什么。

分享微博

要点速览

  • PCI DSS 要求审计日志至少保留 12 个月;GDPR 第 17 条要求无不当延迟地删除个人数据。日志只存引用、不存数据内容,两者最容易兼顾。
  • 审计日志里自由格式的 details 字段,是 PAN、CVV 和令牌泄露的常见途径;应在写入时用允许字段白名单拦截。
  • CCPA 给知情、删除、更正请求留出 45 个自然日的处理期限,并设有例外,因此删除必须设计成有状态的工作流。
同一个 POST /payments 事件的两份审计日志。左侧是“省事”的写法:客户邮箱、卡号和 CVV 都写进了日志,并以橙色高亮,表示保留 12 个月就等于违规 12 个月。右侧是按合规设计的日志,只记录 actor_id、resource、card_ref、result 和 ts,全是内部 ID,可以放心保留 12 个月。
同一笔支付请求,两种记日志的方式。按照 PCI DSS 10.5.1,日志须保留 12 个月;如果 CVV 或邮箱混进了 details 字段,它们也会跟着留存 12 个月。示例取自正文,依据 OneUptime 的分析。

一项标准要求审计日志至少保留 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 个信源
路线图上的下一篇 · 阶段 5: 部署上线Assistants API 已停用,客户的聊天记录可能随之消失迁移到 Responses API 看似只换端点,工具调用循环和会话存储却都落到了客户自己的代码里。