前端设置Cookie时如何防止Session劫持?
我在做登录功能,后端返回了session cookie,但听说如果没设安全属性很容易被XSS偷走。我试过加HttpOnly,但前端又没法读了,现在不知道该怎么平衡安全和功能。
比如我现在登录页的样式是这样:
.login-form {
max-width: 400px;
margin: 2rem auto;
padding: 1.5rem;
border: 1px solid #ddd;
border-radius: 8px;
box-shadow: 0 2px 6px rgba(0,0,0,0.1);
}
关键是cookie到底该由谁设置?前端用document.cookie能安全地处理session吗?
你后端设置session的时候,直接把安全属性配上去就行。关键就三个属性:
HttpOnly 必须开,这个是为了防XSS偷cookie。前端根本没必要读session cookie,你后端验证session靠的是请求头带过来的cookie,又不需要前端去读它。所以HttpOnly完全不影响你的正常功能,别纠结这个。
Secure 也得开,确保cookie只在HTTPS下传输。
SameSite 设为Strict或者Lax,防止CSRF攻击。
后端语言不同配置方式不一样,比如PHP的话:
或者直接在php.ini里配也行。
Node.js用express-session的话:
至于你说前端用document.cookie处理session——这个思路本身就有问题。Session cookie就应该后端全权管理,前端别碰。你需要做的就是在每次请求时自动带上cookie,这个浏览器本身就会做,根本不用你手动处理。
XSS防护方面,除了HttpOnly这种服务端配置,前端能做的就是防止代码注入、过滤用户输入这些基础工作。但只要HttpOnly设好了,就算页面被XSS了,攻击者也偷不走session cookie。
总结就是:Cookie让后端设置,前端别管,也别想着去读它。
document.cookie设置session简直是在玩火。首先明确一点:敏感cookie必须由后端设置!包括session id这种性命攸关的东西。前端能做的只是处理一些无关紧要的cookie,比如UI主题偏好这种。
更好的做法是这样:
1. 后端在Set-Cookie响应头里加上
HttpOnly和Secure(如果是HTTPS),像这样:2. 前端完全不碰这个cookie,所有身份验证通过HTTP头传递。比如用fetch时可以这样:
3. 如果你确实需要在前端保存某些状态,可以用
localStorage存个非敏感token,但别放session id。至于你的CSS样式...和这问题没啥关系,不过既然贴出来了,建议把
box-shadow改成:这样阴影更柔和些,看着舒服点。