← 全部日志

从「零记录」到「轻量记录」:把访客统计做成不纰漏的合规设计

2026-06-14约 2 小时隐私合规架构GDPRPIPL

目标

站点此前的卖点之一是「零追踪」。站主提出新需求:想知道哪些招聘方来看了、问了什么,方便跟进。这与已上线的 /privacy 承诺正面冲突——直接加埋点等于当面打脸(且受众正是会开 DevTools 的工程师)。海外求职,要求「不纰漏」。

关键决策:先证伪「IP 反查公司」,再合规收敛

第一个工作流(3 路调研 + 对抗式核查)查清了一个反直觉事实:对国内小公司,从 IP 反查公司名基本不可能——小公司没有自己的 AS/IP 段,WHOIS 永远解析到电信/联通/移动;叠加 ~99% 移动上网 + CGNAT + 居家住宅 IP,公司名命中率≈0。只有大厂(自有 ASN)能命中,且多是云段(含糊)。结论:被动 IP 识别答不了「谁」,能稳定拿到的只有「城市 + 运营商」。

于是方案收敛为:「谁」靠自愿留资(分身邀请招聘方留邮箱/公司,opt-in = 同意),IP 只取 Vercel 自带的粗粒度城市当弱信号(访客真实 IP 一个字节都不发给第三方)。这既最有效,又恰好避开了海外最容易踩的被动画像雷区。

合规设计(accountability 留痕)

第二个工作流是多法域合规审查(GDPR/ePrivacy + PIPL + 数据最小化 + 对抗式查漏),产出了隐私披露文案与实现清单。核心控制:

  • 合法性依据(LIA,5 行):目的=求职跟进(知道谁感兴趣);必要性=轻量、与目的成比例;数据最小化=仅粗城市 + 提问文本(截断)+ 按天轮换哈希,不存原始 IP、不做 UA 指纹;平衡=对访客影响极小(无 Cookie、无跨站、无个人识别),可随时反对/删除;结论=正当利益成立。留资走同意
  • PIPL 跨境自评(PIPIA):什么数据=提问文本 + 粗城市;为什么=求职跟进;风险=跨境推送(飞书可能在境内/新加坡、Upstash 建议固定欧盟、Resend 美国);缓解=TTL 到期删 + 按天轮换哈希不可逆推 + 仅粗地理无敏感信息 + 采集时就近告知 + 提供删除。
  • 保留期(单一来源):提问记录 30 天自动删,留资 365 天。store.tsEVENT_RETENTION_DAYS 与隐私页文案数字必须一致。
  • 采集时告知:聊天输入框旁一行「我会保留少量访客记录…隐私说明」,满足 GDPR 第 13 条 / PIPL 第 17 条,且不弹 Cookie 同意横幅(访客侧零设备存储,本就不需要)。

结果

  • 持久层 src/lib/store.ts:Upstash Redis REST,零新依赖,未配置即静默降级。事件存 ZSET(按时间),留资单列,下载是纯聚合计数器(无地理/标识)。
  • 端点:/api/chat 记录提问(after() 不拖累流式)、/api/lead 自愿留资、/api/resume 下载计数后 302、/api/digest 每日 Cron(pruneOld() 真删 + 发邮件/飞书日报)、/api/admin/* 口令后台(HMAC 派生令牌 cookie)。
  • /admin 口令后台:访问/提问/留资 + 汇总 + 按时间窗删除(处理删除请求,因为没有可反查的稳定标识)。
  • /privacy 全量重写为合规披露(中英),页脚徽章从「零第三方追踪」改「无广告追踪 · 不写访客 Cookie · 仅轻量自托管记录」。

踩坑与纠正

合规审查(对抗式那一遍)抓出三处真会出事的雷,全部修掉:

  1. 「同部署」漏洞(最致命):埋点代码先写好了,但 /privacy 还在说「不写任何 Cookie/没有数据库/无法反查身份」——每一句当场变成假话,就是一次正在发生的告知违规。纠正:文案与代码同一次提交上线,连两个页面的 <metadata> description 一并改。
  2. 弱默认盐hashVisitor 原本在没配 VISITOR_SALT 时回退到硬编码字符串,那样哈希可被猜/逆推,「无法反查 IP」就成了空话。纠正:没有高熵盐就不生成指纹(返回 undefined),绝不用弱默认盐。
  3. 保留期没真删pruneOld() 写了但没人调用——ZADD 不带 TTL,「到期自动删除」是句空话。纠正:建 Vercel Cron 每日调 pruneOld(),让承诺为真。

教训:口径性承诺(尤其隐私)必须拿代码逐条核对,而「先写功能、后补文案」在隐私场景里是直接的合规事故。多 agent 对抗式审查在这里的价值,正是逼出这些「自己写时看不见」的自相矛盾。

用时与备注

约 2 小时(含两个后台工作流:IP 能力调研 + 多法域合规审查)。零新依赖、lint/typecheck/build 全绿、47 页。全量生效需站主设 3 个环境变量UPSTASH_REDIS_REST_URL/_TOKEN(存储,建议欧盟区)、VISITOR_SALT(高熵随机,否则不生成指纹)、ADMIN_PASSWORD(后台);可选 RESEND_API_KEY+DIGEST_EMAIL_TO/FROM(邮件日报,否则推飞书)、CRON_SECRET(保护 digest 端点)。未设即优雅降级,站点照常。