JWT 如何防止CSRF ?
先贴个网上搜索到的信息
使用JWT验证,由于服务端不保存用户信息,不用做sessonid复制,这样集群水平扩展就变得容易了。 同时用户发请求给服务端时,前端使用JS将JWT放在header中手动发送给服务端,服务端验证header中的JWT字段,而非cookie信息,这样就避免了CSRF漏洞攻击。
上面提到JWT有两个优点:
- 集群水平扩展容易;
- 避免CSRF漏洞攻击;
使用cookie方式存放认证信息时,可以通过 XSS方式, 利用JS 脚本, document.cookie
将cookie内容发送到 攻击者的伪站上面,来实施下一步攻击。
网上比较多的信息,大意是说,将 JWT存放到 Local Storage里面就防止了CSRF,JWT是服务端生成,攻击者无法获取。
疑问点在于: 通过JS脚本,JSON.stingify(localStorage)
不也是获取了信息吗, 如果JWT存放于localStorage,也有很高的风险;
因此JWT不是防止CSRF的手段,它是解决 分布式服务/跨域 场景下用户认证的问题。
JWT缺点
无法注销客户端的Token,客户端的Token 过期后,需要判断为无效,而在服务端, 可以通过黑名单机制, 将注销、过期、失效的Token放入黑名单,JWT Token验证时,排除掉黑名单的无效Token;