在身份验证等情况下,使用jwt而不是会话的优势是什么?

它是作为一个独立的方法使用还是在会话中使用?


当前回答

简单的答案是:没有。

一个较长的版本是:

在阅读了GraphQL文档中的建议后,我实现了会话管理的jwt:

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

实现确实很简单,因为它只增加了一点点复杂性。然而,过了一段时间,我(和你一样)开始想知道它的好处是什么。事实证明,就会话管理而言,JWT很少(或者可能没有),正如这篇博客文章详细解释的那样:

停止在会话中使用JWT

其他回答

我有一个类似的问题,在JWT和令牌+缓存之间选择用户身份验证。

读完这些文章后,我很清楚智威汤逊承诺的好处并没有超过它带来的问题。所以令牌+缓存(Redis/Memcached)是我的选择。

认证头vs JWT vs会话——如何为api选择正确的认证技术

api的身份验证技术

停止在会话中使用jwt

在会话身份验证(或有状态身份验证)中,可以存储比令牌更多的数据。但是您必须将会话对象存储在某个地方,这使得身份验证集中起来。此外,您需要有额外的内存来存储会话,这将增加管理内存的额外工作。如果您的应用程序增长,现在您必须根据需要实现不同的设计,实现会话缓存服务,并将会话存储在web应用程序或数据库中。

在Jwt或一般的无状态身份验证中,您不存储任何东西。将令牌与请求标头一起发送。这使得它成为分散的身份验证。这种身份验证的缺点是令牌撤销。每个代币都有一个到期时间,如果您的代币被盗,它将一直有效直到到期。你必须实现最小化风险的逻辑。

我的两美分,这在某种程度上与joepie91著名的博客文章形成了对比。

考虑到今天(和未来)的应用程序(大部分)是云原生的 无状态JWT身份验证有经济上的好处, 随着应用程序的扩展而扩展: 云应用每时每刻都在增加成本。 当用户不再需要“根据”会话存储进行身份验证时,此成本就会降低。 以下是一些不使用JWT会增加应用程序成本的因素:

数据库服务器 全天候运营会话商店需要花钱。 在K8S世界中,您不能使用基于本地存储/内存的解决方案,因为pod是短暂的。 出于同样的原因,棘手的会议也不会有好结果。

存储 存储数据需要花钱。在SSD中存储数据的成本更高。 会话相关的操作需要快速解析,因此光盘驱动器不是一个选择。

I / O 一些云提供商对与光盘相关的I/O收费。

下载 大约在2022年,可以安全地假设API和会话存储是独立的服务器实例。 一些云提供商对从一个实例下载信息到另一个实例收取费用。

扩展会话存储 这会影响到前面提到的所有因素。

如果您使用的是AWS,那么另一个略有不同的视角可能会有用。

我们实现了PHP5。在AWS ElastiCache上集中会话存储在多台服务器上。

在我们转到PHP7之前,它工作得很完美。PHP7很难配置,我们被间歇性的问题所困扰,对于特定的用户来说,会话似乎“失败/不匹配/有点混乱”,然后他们无法登录该设备,直到旧的会话过期。

我们转移到使用DynamoDb来存储会话,没有更多的问题。它稍微慢一些,但只在登录(会话存储)阶段可以注意到。

与此同时,我们实现了AWS cognito来取代我们的身份验证,并开始使用API-Gateway通过lambda python函数来交付内容。

我们使用PHP SDK对Cognito进行身份验证,然后将JWT存储在cookie中,但仍然使用PHP会话来保持我们的遗留代码正常工作。

现在我们有了两个栈,这是两个世界中最好的:PHP7做到了它的位,并将主要内容(非常快)传递给用户。然后JS接管并使用JWT提供额外的内容。

我认为JWT的伟大之处在于,它可以在这两个栈之间传递,并在两种情况下用于对用户进行身份验证。

现在我们想知道是否值得冒险,完全切换到新的JWT系统?

在PHP中,我们仍然使用我们的遗留会话,但我们也将令牌传递给cognito以验证它。这是一点额外的安全,可能是不必要的,但它给人一种温暖舒适的感觉。此外,dynamoDb还可以节省成本和维护费用。

简单的答案是:没有。

一个较长的版本是:

在阅读了GraphQL文档中的建议后,我实现了会话管理的jwt:

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

实现确实很简单,因为它只增加了一点点复杂性。然而,过了一段时间,我(和你一样)开始想知道它的好处是什么。事实证明,就会话管理而言,JWT很少(或者可能没有),正如这篇博客文章详细解释的那样:

停止在会话中使用JWT