Set-Cookie: at=xxx; HttpOnly; Secure; SameSite=Lax
# 前端请求记得带上凭据
fetch('/api/me', { credentials: 'include' })
安全评估只留了一句话:页面里任意一段脚本都能读到 localStorage 里的 access_token,控制台敲一行 getItem 就把凭据原样打印出来了。这类现象通常不是突然出现的,往前翻半天日志能看到苗头。
追下去是这么回事:localStorage 除了同源访问没有额外的保护,页面里任何一段被注入的脚本都能直接读走;httpOnly Cookie 至少挡住了 JS 读取,代价是跨站请求要另外处理 CSRF。
这次卡住的地方就在「token 存储位置」这一环,单独把它拎出来验证,别和其他改动混在同一次发布里。权限不要一口气开到最大,先加到够用再往上试,范围小才好收。
把复现步骤压到三条以内,交给同事也能跑出来,才算真的定位清楚。
处理上按这个顺序:短期的访问凭据统一改放到 httpOnly 的 Cookie 里,同时把 Secure 标记打开;跨站的请求场景再用 SameSite 配合 CSRF token 一起兜住,不要只依赖一项;localStorage 里不要再留下任何长期有效的凭据,清掉之后重新登录一次。
确认没问题再收工,控制台里读不到凭据,登录态仍然正常,跨站请求带上 Cookie 也能通过。
