为什么Cookie无法防止CSRF攻击而Token可以?
CSRF介绍
CSRF(Cross Site Request Forgery):跨站请求伪造,属于网络攻击领领域范畴。相比于SQL脚本注入、XSS攻击等安全攻击方式,CSRF的知名度并没有他们高,但是它确实是我们开发系统时必须要考虑的安全隐患。
什么是CSRF呢?
简单来说,就是黑客利用你的身份信息去做一些非法的事情,例如将你的钱转走、发邮件、发消息等
CSRF攻击需要依赖于Cookie,Session
Cookie中会存放SessionID,
CSRF攻击流程
流程:
- 客户端通过账户密码登录访问网站A
- 网站A验证客户端的账号密码,成功则生成一个sessionID,并返回给客户端存储在浏览器中
- 该客户端Tab一个新页面访问了网站B
- 网站B自动触发要求该客户端访问网站A(网站B中有链接指向网站A)
- 客户端通过网站B中的链接访问网站A(此时携带有合法的SessionID进行访问站A)
- 此时网站A只需要校验sessionID是否合法,若合法则执行相应的操作
防御方法
防御CSRF攻击的方法:
- 在请求地址中添加token并验证
- 验证 HTTP Referer 字段
- 这个字段可以用来识别这个请求的来源,这样来自第三方的就可以拒绝了
- JWT校验
传统方案:使用Cookie
通常Cookie会搭配Session使用,由于http请求是无状态的,服务器需要识别客户端的身份,例如常见的购物车功能,所以使用SessionID
可以使用cookie在用户登录之后保存用户的登录状态
JWT为什么安全
JWT一般存放在localStorage中,前端的每一个请求都会带上该JWT,整个过程中不涉及到Cookie,如果此时点击了非法请求,非法请求是无法携带JWT的,攻击者无法获取到或者伪造token,因此可以有效的防止csrf攻击。