HttpOnly Cookie 为什么前端读不到?是我设置错了吗?
我在后端设置了带 HttpOnly 的 Cookie,但前端用 document.cookie 怎么都读不到,是不是我哪里配置错了?
后端是用 Node.js 写的,代码大概是这样的:
res.cookie('authToken', token, {
httpOnly: true,
secure: process.env.NODE_ENV === 'production',
sameSite: 'strict',
maxAge: 3600000
});
本地开发时也试过关掉 secure,但还是读不到。这是正常现象吗?那前端怎么知道用户是否登录啊?
简单说,HttpOnly 这个属性的目的就是让 JavaScript 读不到这个 cookie,它是专门用来防 XSS 攻击的。黑客就算在你的页面里注入了恶意脚本,
document.cookie也拿不到这个带 HttpOnly 标记的 cookie,你的认证 token 就安全了。那前端怎么知道用户登录没登录?很简单,发个请求问后端就行了。
一般做法是写一个获取当前用户信息的接口,比如
/api/me或者/api/user/profile,前端在页面加载时调用这个接口:后端收到请求后,从 cookie 里取出 token 验证,验证通过就返回用户信息。这样前端既知道用户登录状态,又能拿到用户数据,而敏感的 token 始终安全地待在 HttpOnly cookie 里。
顺便说一句,你那个 sameSite: 'strict' 配置要注意一下,跨站请求的时候 cookie 不会带上,可能会导致一些跳转登录的场景出问题。一般用 'lax' 会更实用一些,当然如果你对安全要求特别高那就当我没说。