什么是CSRF?
-
专业解释:跨站请求伪造(Cross-site request forgery),也被称为 one-click attack 或者
session riding,通常缩写为 CSRF 或者 XSRF,是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。 -
通俗易懂的例子: 就是我在一个安全的官方网站点了别人的一个恶意链接,由于我在安全网站的登录还没过期,或者是还没登出,我点这个恶意链接的时候是会携带浏览器中的cookie一起发给恶意链接的后端服务器的,恶意链接的后端就根据我发过去的cookie,拿到存在cookie中的sessin_Id,然后他这个恶意的后端伪造一个url请求,url里面带了一个刚刚拿到的session_id和一些业务参数,去正规网站里面用我的身份去进行一些操作,比如转账等,这就是一次跨域攻击。
JWT为什么可以防止CSRF呢?
- 因为JWT是由正规安全官网的后端生成的,我登录正规网站,正规网站的后端有一个用于生成JWT签名的密钥,先生成一个head,里面放type=jwt,alg(加密算法)=HS256,再将要传递的数据放到payload里面,第三步使用head中定义的加密算法和后端已经设置好的加密密钥,将head+payload这两部分加密生成一个signature签名,前面三步得到的数据加起来生成一个JWT令牌。也就是说,JWT令牌是由正规网站的后端生成的,用户在第一次登陆这个网站并登陆成功以后,后端就会返回一个JWT给用户,这个JWT存在用户浏览器的localStorage本地缓存里面,下次这个用户发送请求给正规网站的后台时,就会把这个JWT发给正规网站的后台,根本就用不到cookie,但,还是回到上面那个例子,我在正规网站上点了一个恶意链接,并且传递了cookie给恶意链接的后台,此时恶意链接的后台伪造了一个请求发给了正规网站的后台,由于恶意链接的后台本地存储里面没有我与正规网站约定的那个JWT令牌,因此,恶意链接后台生成的发送到正规网站后台的请求就不会带上JWT,就会被正规网站的后台判断为是非法请求,然后抛弃。
知识补充
- JWT的组成:
- JWT身份验证的步骤: