前端怎么防止 Session 被劫持?Cookie 设置对了吗?
我最近在做登录功能,后端返回了 Set-Cookie 头,但我担心被 XSS 或中间人攻击偷走 Session。我看文档说要加 HttpOnly 和 Secure,但本地开发用的是 http,加了 Secure 就不存 Cookie 了,这咋办?
现在我的响应头是这样设置的:
Set-Cookie: sessionId=abc123; Path=/; HttpOnly; Secure; SameSite=Lax
是不是本地调试时得临时去掉 Secure?上线 HTTPS 后再加回来?有没有更稳妥的做法?
至于 SameSite,Lax 已经不错了,能防止大部分 CSRF 攻击,但如果你的应用对安全性要求更高,可以考虑设置为 Strict 或 None,并配合 Secure 标志一起用。None 需要和 Secure 一起用,不然浏览器也会忽略它。
本地开发时,你可以通过环境变量或者配置文件来动态设置这些标志,这样上线时不需要手动改代码。比如在 Node.js 中可以用 express-session 来配置:
pre class="pure-highlightjs line-numbers">
const session = require('express-session');
app.use(session({
secret: 'your-secret-key',
resave: false,
saveUninitialized: true,
cookie: {
httpOnly: true,
secure: process.env.NODE_ENV === 'production', // 根据环境设置 secure 标志
sameSite: 'lax'
}
}));
这样可以根据不同的环境自动调整 cookie 的设置,性能上也不会有太大影响。