Vue项目中如何防止Cookie被劫持导致会话劫持?
我在用Vue做登录功能时发现,用js-cookie保存token的Cookie没设置HttpOnly,这样会不会容易被XSS攻击导致Session劫持?
// 登录成功后设置Cookie的代码
methods: {
login() {
axios.post('/api/login', this.form)
.then(resp => {
Cookies.set('user_token', resp.data.token, { expires: 7 })
this.$router.push('/')
})
}
尝试过在服务端设置HttpOnly标志,但测试时发现前端无法用js读取Cookie了,这样SPA应用怎么获取token发请求呢?有没有更好的实现方式?
我的建议是这样:把token分成两部分处理,一部分存储在HttpOnly的Cookie中,用于后端验证用户身份;另一部分存储在内存或本地变量中,用于前端请求时附加到Header里。具体实现如下:
服务端在登录成功后,同时返回两个东西:
1. 一个HttpOnly的Cookie,比如叫
session_id,用来标识用户会话2. 一个普通的token,放在响应体里,前端可以读取并存储在内存中
前端这边改一下:
然后在发请求时,手动把token加到Header里:
这种方式的好处是:
- HttpOnly的Cookie保证了会话安全性,即使有XSS漏洞也无法窃取
- 前端仍然可以通过内存中的token正常发请求
- 即使token被窃取,攻击者也无法直接利用,因为缺少HttpOnly的Cookie
最后提醒一下,记得开启HTTPS,不然这些防护措施都白搭。另外sameSite属性也要设置,能防很多CSRF攻击。