如果我使用基于令牌的身份验证,我还需要会话吗

Posted

技术标签:

【中文标题】如果我使用基于令牌的身份验证,我还需要会话吗【英文标题】:Do I still need sessions if I use token based authentication 【发布时间】:2017-01-28 12:30:04 【问题描述】:

如果我以完全无状态的方式(即在令牌中包含用户 ID 等内容)使用 JWT 等基于令牌的身份验证,那么我是否完全不需要会话?

刚看了这篇文章(Stop using JWT for sessions),不推荐使用JWT替换session。

【问题讨论】:

【参考方案1】:

答案(一如既往):视情况而定!

前面的陈述可能是软件开发的唯一规则,其他一切都是指导方针。是的,我在夸大其词,但我想传达的是,您需要对那些文章持保留态度。

对您的问题的更具体答案是,是的,如果您在 JWT 中包含您需要的所有内容,则您不需要服务器端会话,但如果您在 cookie 中包含您需要的所有内容,这也是正确的。

在您的职位上,我会阅读更多关于该主题的文章,然后会考虑手头的具体情况并决定最适合它的方法。我可以推荐以下博客文章作为有趣的补充阅读:Cookies vs Tokens: The Definitive Guide

TL;DR 基于令牌的身份验证比以往任何时候都更加重要。我们研究了 cookie 和基于令牌的身份验证之间的异同、使用令牌的优势,并解决了开发人员对基于令牌的身份验证的常见问题和顾虑。

从摘要中可以看出,它似乎更倾向于基于令牌的身份验证,但这很好,因为它可以让您从另一个角度了解该主题。

就我个人而言,根据场景使用其中任何一种方法都没有问题。

如果我的系统由单个域中可用的单个甚至多个 Web 应用程序组成,则使用会话标识符和存储在服务器上的相关会话数据的更传统的实现是该死的好选择,让我们看看为什么:

您可以在整个系统中进行单点登录,因为您的会话 cookie 可供同一域内的所有应用程序使用。 在服务器上维护会话状态会产生开销,但只要操作正确,您仍然可以使用该配置进行扩展。 会话标识符很可能比 JWT 更轻量级,并且对客户端不透明,因此您不必担心泄露敏感信息。

但是,如果我有一个跨不同域和/或平台(网络、原生移动设备等)的多个应用程序系统,我会更关注基于令牌的方法......为什么你问,让我们看看:

在这样的系统中,您很可能希望拥有一个对不同客户端应用程序通用的 Web API。使用基于令牌的方法设置要保护的 API 非常容易,因为那里有很多示例代码。 作为多个域和多个平台,我无法使用 cookie 进行单点登录。 现在您的应用拥有一个通用 API,如果您使用 JWT 而不是传统的基于 cookie 的会话标识符,那么向第三方应用打开该 API 会容易得多。

【讨论】:

以上是关于如果我使用基于令牌的身份验证,我还需要会话吗的主要内容,如果未能解决你的问题,请参考以下文章

基本身份验证是基于令牌的身份验证吗?

基于令牌的身份验证中的会话

混合身份验证 - 基于 Spring MVC 会话 + 基于 JWT 令牌

会话管理:如何为 REST 服务生成身份验证令牌? (球衣)

通过令牌进行身份验证,如果令牌失败,则通过会话进行身份验证,使用 Passport?

在 Spring Security 中接收令牌的基本身份验证