网站首页 > 博客文章 正文
Token认证的优势
相比较于Session认证来讲,使用Token作为身份认证标识主要有如下的几个优势。
无状态
在使用Token的时候,由于它自身就包含了认证所需的各种信息,这样我们就不需要再服务器端去存储Session的信息,这样一来,可以减轻服务器端的压力。同样也是由于Token的无状态性质,也导致了它最大的缺点就是,后端在一个Token的有效期内删除了Token或者是修改了其权限,那么这个删除操作或者是权限修改操作是无法立即生效,一般需要重新授权,或者是等到有效期过了之后才会生效。还有一种情况就是用户完成了注销退出的操作,但是Token还是有效的,这就需要我们在处理后端业务的时候对相关逻辑进行处理。
避免CSRF攻击
CSRF攻击(Cross Site Request Forgery)跨站请求伪造攻击。相比较于SQL注入、XSS等攻击方式,CSRF不足为奇。但是却也是每个系统需要去考虑的问题。
那么到底什么是CSRF攻击呢?
简单来讲就是使用你的身份去发送一些不友好的请求,导致服务器瘫痪,或者是无法服务。
为什么Token认证不会存在问题呢?
简单来讲使用JWT生成了一个Token之后,一般情况下浏览器端会将其放到local storage中,然后在之后的请求中加入这个Token,这样就不会出现CSRF漏洞的情况。因为当你点击一个非法请求发送到服务器端,因为没有携带Token,服务器端会直接判定这个请求是违法的请求,而不予响应。这样就可以有效的防止CSRF攻击了。
但是这种操作还是有可能会出现XSS攻击,为了避免XSS攻击,可以将Token存储在标记为httpOnly的cookie中,这种情况下使用了cookie,所以要对CSRF攻击做出保护。
适合移动端的应用
使用Session做为身份认证的话,一般情况下Session信息会被存储在服务端,而且还会依赖于客户端的Cookie。所以这种操作不适合移动端应用的存储。
如果以Token作为移动端身份认证的话,那么就不会存在这个问题,因为Token可以存储在移动端任意可以用来存储的位置,并且Token一旦生成就可以跨语言使用了。
可以用来完成单点登录
如果使用Session来完成身份认证的话,那么需要实现单点登录就需要把Session的信息保存到另外的电脑上,并且还会出现Cookie跨域请求的问题。使用Token认证的话则不会出现这种情况。因为Token一直被客户端持有,所以认证成功之后,服务端只需要完成对于Token的续约即可。
Token认证常见问题以及解决方案
在用户完成注销的情况下,Token仍然有效
这种情况一般出现在如下的一些场景中
- 用户主动退出登录操作
- 用户修改密码的时候
- 用户修改了权限或者是用户角色的时候
- 用户账户被后端限制登录的时候
- 用户账户被管理删除的时候
上述这些问题在Session中都不会存在,因为在Session方式中,遇到这种情况服务端一般会删除Session,所以用户操作会被拦截。但是在Token操作中则不好处理,因为Token的有效期不过的话所有的操作都是可以进行的。如果后端没有对应的操作的话,就会导致在Token失效之前,用户还是持有原来的权限进行操作。可以由如下的操作来避免这种问题的出现
- 将Token存储到数据库中:使用Redis来完成Token的存储。如果Token过期之后就从Redis进行删除,但是如果每次请求都需要查库的话就违背了JWT的无状态原则,这就需要开发者根据自己的需求进行设计了。
Token续约问题
Token一般不会是长期有效的,所以当Token认证过期之后,如何对其进行动态刷新就成了需要我们去解决的问题?
在Session中的做法是如果Session的有效期是30分钟,如果30分钟到了就把Session的有效期延长30分钟就可以了。
在Token中我们也可以采用这种方式来做。
- 与Session方式一样,这种操作几乎满足大部分的请求场景,如果服务器发现Token马上过期了,就对Token有效期进行续约,如果过期了就重新返回新的Token来保证用户的登录状态。
- 每次请求都刷新新的Token,这种方式比较简单,但是系统开销比较大
- Token过期时间统一设置到晚上,白天使用的时候不影响用户。
- 返回两个Token,一个是用来设置过期时间,另一个则是用来校验有效性。两个Token值都在本地存储,每次访问的时候,传入正常的Token,如果过期了就将校验有效性的To肯传入,如果有效就继续,如果无效就重新进行获取。
当然在实际操作过程中可能还有其他的解决方案,需要开发者根据具体的业务逻辑来做相应的处理。
总结
JWT适合的场景就是不需要再服务端保存用户状态的场景,如果要考虑到续约、登录、注销等操作的场景的话,就需要给Token利用缓存操作加上状态来保存用户信息。这就有点像是伪Session的实现方式。
猜你喜欢
- 2024-10-11 苹果手机出现新严重漏洞:账户被接管
- 2024-10-11 你必须知道的十大漏洞之失效的访问控制——A1
- 2024-10-11 互联网小产品开发之(4)基于JWT的登录认证设计
- 2024-10-11 苹果在macOS,iOS中散布零日漏洞(如何在普通pc上安装macos苹果操作系统)
- 2024-10-11 「热点」微软自动化服务被爆高危的账户越权访问漏洞
- 2024-10-11 黑客发现苹果安全漏洞;苹果支付10万美元赏金
- 2024-10-11 垂直越权漏洞与代码分析(垂直越权漏洞修复方案)
- 2024-10-11 Apple登录功能存在安全漏洞,允许未经授权的黑客访问用户信息
- 2024-10-11 在Web应用中,别再把JWT当做session使用
- 2024-10-11 Java 15以上版本爆加密漏洞:CVE-2022-21449
你 发表评论:
欢迎- 367℃用AI Agent治理微服务的复杂性问题|QCon
- 358℃初次使用IntelliJ IDEA新建Maven项目
- 357℃手把手教程「JavaWeb」优雅的SpringMvc+Mybatis整合之路
- 351℃Maven技术方案最全手册(mavena)
- 348℃安利Touch Bar 专属应用,让闲置的Touch Bar活跃起来!
- 346℃InfoQ 2024 年趋势报告:架构篇(infoq+2024+年趋势报告:架构篇分析)
- 345℃IntelliJ IDEA 2018版本和2022版本创建 Maven 项目对比
- 342℃从头搭建 IntelliJ IDEA 环境(intellij idea建包)
- 最近发表
- 标签列表
-
- powershellfor (55)
- messagesource (56)
- aspose.pdf破解版 (56)
- promise.race (63)
- 2019cad序列号和密钥激活码 (62)
- window.performance (66)
- qt删除文件夹 (72)
- mysqlcaching_sha2_password (64)
- ubuntu升级gcc (58)
- nacos启动失败 (64)
- ssh-add (70)
- jwt漏洞 (58)
- macos14下载 (58)
- yarnnode (62)
- abstractqueuedsynchronizer (64)
- source~/.bashrc没有那个文件或目录 (65)
- springboot整合activiti工作流 (70)
- jmeter插件下载 (61)
- 抓包分析 (60)
- idea创建mavenweb项目 (65)
- vue回到顶部 (57)
- qcombobox样式表 (68)
- vue数组concat (56)
- tomcatundertow (58)
- pastemac (61)
本文暂时没有评论,来添加一个吧(●'◡'●)