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)根据以下公式生成签名
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!