大家好,今天小编来为大家解答以下的问题,关于服务器端令牌,这个很多人还不知道,现在让我们一起来看看吧!
Token可以避免CSRF攻击。
令牌可以是无状态的并在多个服务之间共享。
Token是在服务器端生成的。如果前端使用用户名/密码向服务器请求认证,服务器认证成功,服务器会返回一个Token给前端。前端每次请求都可以带上Token来证明自己的合法地位。如果这个Token被持久化在服务器端(比如存储在数据库中),那么它就是一个永久的身份令牌。还有一个问题:Token需要设置有效期吗?
需要设置有效期吗?
对于这个问题,我们先来看两个例子。一个例子就是登录密码,一般需要定期更改,防止泄露,因此密码是有有效期的;另一个例子是安全证书。 SSL安全证书有一个有效期,以解决吊销问题。对于这个问题的细节,无论是从安全角度还是从撤销角度考虑,Token都需要有有效期。
那么有效期是多少合适呢?只能说根据系统的安全需求尽可能的短,但也不能短的离谱。那么新的问题就出现了。如果正常操作时用户的token过期了,需要用户重新登录……那用户体验不是很糟糕吗?
为了解决操作过程中不让用户感觉Token无效的问题,一种解决方案是在服务器端保存Token状态。用户每次操作时,Token过期时间都会自动刷新(推迟)。 ——Session使用该策略来维护用户登录状态。的。然而,仍然存在一个问题。在前端和单页应用分离的情况下,每秒可能会发起很多请求,每次刷新过期时间都会产生非常高的成本。如果将Token过期时间持久化到数据库或者文件中,成本会更大。因此,为了提高效率、减少消耗,Token在过期时通常会存储在缓存或内存中。
还有一种解决方案,使用Refresh Token,可以避免频繁的读写操作。在该方案中,服务器不需要刷新Token的过期时间。一旦Token过期,就会反馈给前端,前端通过Refresh Token申请新的Token继续使用。该方案中,当客户端请求更新Token时,服务端只需要检查一次Refresh Token的有效性,大大减少了更新有效期的操作,避免了频繁的读写。当然,Refresh Token也是有有效期的,但是这个有效期可以更长。
时序图表示
Token和Refresh Token的时序图如下:
1)登录
2)业务请求
3)Token过期,刷新Token
上面的序列图没有提到如果刷新令牌过期了该怎么办。由于刷新令牌已过期,因此需要要求用户重新登录。当然,这个机制可以设计得更复杂。例如,每次使用刷新令牌时,其过期时间都会更新,直到超过其创建时间很长一段时间(例如三个月)。 ),相当于让Refresh Token可以自动续订很长一段时间。目前为止,Token都是有状态的,即相关属性需要在服务器端保存记录。那么无国籍呢,如何实现呢?
无状态令牌
如果我们将所有状态信息附加到Token上,那么服务器就不需要保存它。但服务器仍然需要验证令牌是否有效。但是,只要服务器能够确认该Token是自己颁发的,并且其信息没有被修改,就可以认为该Token是有效的。 ——“签名”可以提供这种保证。常见的签名都是由一方签名,另一方验证,因此必须使用非对称加密算法。但这里,签名方和验证方都是同一个人,所以对称加密算法就可以满足要求,而且对称算法比非对称算法快很多(最多相差几十倍)。
对称加密算法除了加密之外,还具有恢复加密内容的功能,而在对Token进行签名的时候,这个功能并不是必须的。 —— 由于不需要解密,摘要(哈希)算法会更快。你可以指定密码哈希算法,自然是HMAC。
然而,当使用无状态令牌时,服务器端会发生一些变化。虽然服务器不保存有效的令牌,但需要保存未过期但已取消的令牌。如果某个Token在过期前被用户主动取消,那么服务器需要保存取消的Token,以便下次收到仍然有效的Token时失效。
当前端可控时(例如前端和服务端在同一个项目组),可以协商前端一旦注销成功,就会丢失本地保存的Token和刷新Token(如存储在内存、LocalStorage等)。基于这个协议,服务器可以假设收到的Token一定是没有注销的(因为注销后前端就不再使用它了)。
如果前端不可控的话,上述假设仍然可以成立,但这种情况下,需要尽可能缩短Token的有效期,并且当用户主动注销时,Refresh Token必须失效。这种操作存在一定的安全漏洞,因为用户会认为自己已经注销了,但实际上短时间内并没有注销。如果应用程序设计中的这个漏洞不会造成任何损失,那么这个策略是可行的。使用无状态代币有两点需要注意:
Refresh Token是长期有效的,所以它应该在服务器端有状态,以增强安全性并确保可控的用户退出。
您应该考虑使用双因素身份验证来增强敏感操作的安全性。
上面提到的只是认证服务和业务服务集成在一起的情况。如果他们分开了怎么办?
单独的身份验证服务
当Token无状态时,单点登录变得容易。当前端获得有效的Token后,就可以在同一系统的任何服务上进行认证。只要他们使用相同的密钥和算法来验证Token的有效性,就是这样的:
当然,如果Token过期了,前端还是需要去认证服务更新Token!
虽然认证和业务是分开的,但实践中并没有太大区别。当然,这是建立在认证服务器信任业务服务器的前提下的,因为认证服务器生成Token所使用的密钥与业务服务器认证Token所使用的密钥和算法是相同的。也就是说,业务服务器也可以创建有效的Token。
不受信任的业务服务器
当遇到不受信任的业务服务器时,很容易想到使用不同的密钥。认证服务器使用密钥1颁发,业务服务器使用密钥2验证——,这是非对称加密签名的典型应用场景。认证服务器使用自己的私钥对Token进行签名,并将公钥公开。
信任该认证服务器的业务服务器保存公钥,用于验证签名。幸运的是,JWT 不仅可以使用HMAC 进行签名,还可以使用RSA(一种非对称加密算法)进行签名。
当业务服务器不再可信时,用户在多个业务服务器之间使用同一个Token是不安全的。因为任何拿到Token的服务器都可以冒充用户去另外一台服务器处理业务,所以悲剧随时可能发生。
为了防止这种情况发生,在认证服务器生成Token时,需要在Token中记录使用该Token的业务服务器的信息,这样当其他业务服务器获取到该Token时,发现不是它应该是什么。验证通过的Token可以直接拒绝。
认证服务器不信任业务服务器,业务服务器之间也不信任,但前端信任这些服务器。 —— 如果前端不信任,则不会使用Token来请求验证。那么为什么要信任呢?可能是因为这些是由同一家公司或同一项目提供的多项服务组成的服务系统。
为了获得用户的信任,认证服务必须帮助用户识别业务服务。认证服务器决定不公开公钥,但要求业务服务先申请注册并通过审核。只有通过审核的业务服务器才能获得认证服务为其创建并仅供其使用的公钥。
若业务服务泄露公钥带来风险,则由业务服务承担风险。现在认证服务可以清楚地告诉用户“某某”服务是什么。如果用户还不够信任,认证服务甚至可以询问,某个业务服务需要请求三项个人数据A、B、C。其中A是必须的,否则无法工作。是否允许授权?如果你授权了,我会把你授权的几条数据加密放到Token里。
原创文章,作者:小su,如若转载,请注明出处:https://www.sudun.com/ask/158489.html
用户评论
绝版女子
服务端管理TOKEN确实很方便!以前每次都要手动操作,现在直接调个接口,效率简直爆表!希望以后能支持更多平台类型。
有7位网友表示赞同!
熏染
终于看到这个了!从前端到后端都用统一的TOKEN机制,是不是比之前的cookie要安全不少?这样可以避免一些潜在的黑客攻击吧!
有12位网友表示赞同!
青墨断笺み
服务端的Token管理方式确实很强大,可以实现细粒度的授权控制,像访问某个敏感资源的时候更加安全可靠。不过这好像需要对后端架构有更深入的了解才能合理运用吧?
有14位网友表示赞同!
妄灸
这篇文章说得真详细!我之前一直用前端处理TOKEN,现在看来服务端管理确实更优,省心又有效率。受益匪浅了,好评!
有15位网友表示赞同!
何必锁我心
感觉服务端的Token实现过程比较复杂,需要学习很多新的知识点。对我这种只想简单的开发的小白来说还是有点门槛啊…
有15位网友表示赞同!
↘▂_倥絔
这个服务端的TOKEN机制真让人眼亮!以后开发项目可以直接采用,省得自己费劲地去设计接口和安全模型了。
有7位网友表示赞同!
回到你身边
我之前对JWT有了一些研究,感觉服务端生成和验证Token效率比前端更高。这篇文章写得很到位,对理解服务端Token起到很大帮助!
有10位网友表示赞同!
素颜倾城
这个方法好,但我觉得还是需要考虑缓存问题啊,不然每次请求都需要去后端校验TOKEN,会造成很大的性能瓶颈。
有18位网友表示赞同!
寒山远黛
服务端的JWT简直是神器!终于不用担心前端代码逻辑的漏洞导致信息的泄露了。现在可以专注于更核心的业务开发了!
有13位网友表示赞同!
抚笙
对于大型应用来说,服务端管理TOKEN确实是一个比较好的选择。但是对于小型项目来说,可能过于复杂,反而增加了开发难度。
有12位网友表示赞同!
﹎℡默默的爱
这篇文章写的太好了,把服务端的Token使用场景和注意事项都详细说明了。我现在对这个问题有了更深入的理解!
有20位网友表示赞同!
歇火
我觉得服务端TOKEN管理确实比前端管理更安全,但是也更加依赖后端服务的稳定性和负载能力啊。如果后端崩溃的话,整个系统都要停摆…
有8位网友表示赞同!
灼痛
学习一下服务端的TOKEN机制确实很必要,它对提升应用安全性起到关键作用!这篇文章帮我打开了新的思路,我会好好研究研究它的实现细节。
有7位网友表示赞同!
命运不堪浮华
我一直觉得前端管理TOKEN更加便捷直接,服务端管理则显得更繁琐复杂。不过看到这篇文章分享的利弊分析,我确实有些改变了看法…
有10位网友表示赞同!
暮染轻纱
服务端的Token虽然安全,但要注意处理 revoked的 token, 以及防止攻击者 hijack token 的问题,这些都需要谨慎对待!
有20位网友表示赞同!
几妆痕
这篇文章真是太棒了!通俗易懂地讲解了服务端TOKEN的原理和使用方法。我之前一直对这个话题比较模糊,现在终于明白是怎么回事了。
有16位网友表示赞同!
失心疯i
对于新手来说,服务端的TOKEN机制可能有点难以理解,需要多花时间学习和实践才能掌握。但这篇文章给了我很大的启发!
有7位网友表示赞同!
执妄
这个标题吸引我点击进来,没想到内容竟然这么详细!作者真是个高手,把问题描述得清清楚楚,逻辑清晰,受益匪浅。强烈推荐给想要了解服务端TOKEN的伙伴们!
有6位网友表示赞同!