1、什么是CSRF?
跨域请求伪造指的是第三方诱导用户点击含攻击信息的网站,利用用户在目标网站的凭证冒充用户进行操作。
2、如何解决?
方法一:同源检测
HTTP 请求头 Referrer 字段是浏览器默认带上,含义是发送请求的页面地址,比如同样是删除相册的操作http://www.photo.com/del?id=xxx;如果是从相册自己页面发送出来,Referrre的值是http://www.photo.com/index.html(以首页举例),如果是从黑客页面发送出来的Referrer的值是http://www.hacker.com/index.html(以首页举例),所以后端只要通过Referrrer做白名单判断就能防这种常见的CSRF攻击。
方法二:token
传统的cookie和session会把用户信息存储在客户端的Cookie里,浏览器在请求服务端接口时会自动在Cookie头中带上用户信息。而JWT令牌可以存储在localStorage,和Cookie不同的是它不会自动在请求中携带令牌,需要通过代码来实现。前端在请求头里添加token,并且后端设置拦截器进行验证token,这样就能防止CSRF攻击。
3、JWT实现原理
对比传统的session认证方式,JWT的优势是:
1、JWT Token数据量小,传输速度也很快。因为JWT Token是以JSON加密形式保存在客户端的
2、不需要在服务端保存会话信息,也就是说不依赖于cookie和session,所以没有了传统session认证的弊端,特别适用于分布式微服务
3、单点登录友好:使用Session进行身份认证的话,由于cookie无法跨域,难以实现单点登录。但是,使用token进行认证的话, token可以被保存在客户端的任意位置的内存中,不一定是cookie,所以不依赖cookie,不会存在这些问题
JWT由3部分组成:标头(Header)、有效载荷(Payload)和签名(Signature)。在传输的时候,会将JWT的3部分分别进行Base64编码后用.
进行连接形成最终传输的字符串
签名哈希部分是对上面两部分数据签名,需要使用base64编码后的header和payload数据,通过指定的算法生成哈希,以确保数据不会被篡改。首先,需要指定一个密钥(secret)。该密码仅仅为保存在服务器中,并且不能向用户公开。然后,使用header中指定的签名算法(默认情况下为HMAC SHA256)根据以下公式生成签名
标签:跨域,JWT,token,session,cookie,CSRF,伪造,请求 From: https://www.cnblogs.com/coooookie/p/17458903.html