2017-04-17 127 views

回答

15

智威汤逊对每个说法都使用“会话”没有好处。智威汤逊提供了一种在客户端维护会话状态的方法,而不是在服务器上进行。

问这是“什么是使用JWTs在使用服务器端的会话的好处”

使用服务器端的会话,你将不得不会话标识符存储在数据库中,当人们往往意味着,否则将其保存在内存中并确保客户端始终访问同一台服务器。这两个都有缺点。在数据库(或其他集中存储)的情况下,这成为一个瓶颈和一个维护的事情 - 本质上是一个额外的查询要完成每个请求。

随着内存解决方案,你限制你的水平缩放和会议将通过网络问题(客户端WiFi和移动数据,服务器重启等之间的漫游)

移动会话到客户端意味着受影响您删除了服务器端会话的依赖关系,但它强加了自己的一套挑战。
- 安全地存储令牌
- 安全地传输它
- 智威汤逊会话有时很难失效。
- 信任客户的主张。

这些问题由JWT和其他客户端会话机制共享。

智威汤逊特别强调了其中的最后一项。它可能有助于了解什么是JWT:

这是一些信息。对于用户会话,您可以包含用户名和令牌到期的时间。但可以想象的是任何事情,甚至会话ID或用户的整个配置文件。 (请不要这样做) 它有一个安全的签名,可以防止恶意方生成假令牌(您需要访问服务器的私钥来签名,并且可以验证它们在签名后没有被修改) 你发送它们的每一个请求,就像一个cookie或Authorization标题将被发送。实际上,它们通常在HTTP Authorization标题中发送,但使用cookie也不错。

令牌已签名,因此服务器可以验证其来源。我们将假设服务器相信自己的安全签名能力(您应该使用标准库:不要试图自己动手,并且正确保护服务器)

关于安全传输令牌的问题,答案通常通过一个加密的通道发送,通常是httpS。

关于安全地将令牌存储在客户端中,您需要确保坏人无法访问它。这(大部分)意味着阻止坏Web站点的JS读取令牌以将其发回给它们。这可以通过使用相同的策略来减轻其他类型的XSS攻击。

如果您有必要使JWT失效,那么可以实现这些目标。只为那些要求“终止其他会话”的用户存储每用户时代是一种非常有效的方法,可能会足够好。如果应用程序需要每会话失效,那么会话ID可以以相同的方式维护,并且“杀死令牌”表仍然可以保持为比完整用户表小得多(您只需保留比最长允许的令牌生存期)。因此,使令牌无效的能力部分否定了客户端会话的好处,因为您必须维护此会话终止状态。这很可能是比原始会话状态表小得多的表,因此查找效率更高。

使用JWT令牌的另一个好处是,使用库可用的库可能相当容易实现,这些库可能包含您希望拥有它的每种语言。它也完全脱离了您的初始用户身份验证方案 - 如果您转移到基于指纹的系统,则无需对会话管理方案进行任何更改。

更微妙的好处:因为JWT可以携带“信息”,客户可以访问这些信息,所以您现在可以开始做一些聪明的事情。例如,提醒用户他们的会话将在他们注销前几天过期,并根据令牌中的到期日期给他们重新认证的选项。无论你能想象什么。

简而言之:智威汤逊回答了其他会话技术的一些问题和缺点。
1.“便宜”身份验证,因为您可以消除数据库往返行程(或至少有一个小得多的查询表!),这反过来又可以实现水平可伸缩性。
2.防篡改客户端索赔。

虽然智威汤逊未回答安全存储或传输等其他问题,但并未引入任何新的安全问题。

JWTs存在很多负面影响,但是如果您实施与其他类型的身份验证相同的安全措施,您将会很好。

最后一点:它也不是曲奇与令牌。 Cookies是一种存储和传输信息的机制,也可用于存储和传输JWT令牌。

+0

感谢您的TL; DR回答! :D – Pourya8386

4

简短回答是:无。

更长的版本是:

我实现了会话管理JWTs阅读这一建议在the GraphQL docs后:

如果您不熟悉任何的认证机制,我们 推荐使用express-jwt,因为它很简单,不会牺牲任何未来的灵活性。

实现确实很简单,因为它只增加了一点复杂性。然而,过了一段时间,我(如你)开始想知道这些好处是什么。原来也有极少数(或可能没有)的智威汤逊尽可能会话管理得好,因为这个博客帖子详细解释:

Stop using JWT for sessions

+1

引人注目的论点,谢谢你的链接。 – Tom