为什么Cookie无法防止CSRF攻击而Token可以?

CSRF介绍

CSRF(Cross Site Request Forgery):跨站请求伪造,属于网络攻击领领域范畴。相比于SQL脚本注入、XSS攻击等安全攻击方式,CSRF的知名度并没有他们高,但是它确实是我们开发系统时必须要考虑的安全隐患。

什么是CSRF呢?

简单来说,就是黑客利用你的身份信息去做一些非法的事情,例如将你的钱转走、发邮件、发消息等

CSRF攻击需要依赖于Cookie,Session

Cookie中会存放SessionID,

CSRF攻击流程

流程:

  1. 客户端通过账户密码登录访问网站A
  2. 网站A验证客户端的账号密码,成功则生成一个sessionID,并返回给客户端存储在浏览器中
  3. 该客户端Tab一个新页面访问了网站B
  4. 网站B自动触发要求该客户端访问网站A(网站B中有链接指向网站A)
  5. 客户端通过网站B中的链接访问网站A(此时携带有合法的SessionID进行访问站A)
  6. 此时网站A只需要校验sessionID是否合法,若合法则执行相应的操作

防御方法

防御CSRF攻击的方法:

  • 在请求地址中添加token并验证
  • 验证 HTTP Referer 字段
    • 这个字段可以用来识别这个请求的来源,这样来自第三方的就可以拒绝了
  • JWT校验

传统方案:使用Cookie

通常Cookie会搭配Session使用,由于http请求是无状态的,服务器需要识别客户端的身份,例如常见的购物车功能,所以使用SessionID

可以使用cookie在用户登录之后保存用户的登录状态

JWT为什么安全

JWT一般存放在localStorage中,前端的每一个请求都会带上该JWT,整个过程中不涉及到Cookie,如果此时点击了非法请求,非法请求是无法携带JWT的,攻击者无法获取到或者伪造token,因此可以有效的防止csrf攻击。