JWT(基于令牌的身份验证)与Session / Cookies - 最佳使用方式。

3

我已经阅读了很多有关此主题的内容,但没有找到我正在寻找的好答案。

因此,我对JWT和Session的优缺点的理解如下:

JWT 优点

  • 更可扩展,因为服务器端不需要进行数据库查找(假设是无状态的JWT)。

缺点

  • 需要仔细考虑在客户端存储令牌的方式(使用带HttpOnly的cookie优于本地存储,但cookie有4kb大小限制)。
  • 不能立即撤销。
  • 权限可能会过期,直到下一次刷新。

Session 优点

  • 可以说更安全,因为只传递会话ID(模糊引用),比XSS等容易防范CSRF攻击。
  • 用户更改会立即反映出来。

缺点

  • 比token不太可扩展。

因此,根据我的理解,

  1. 支持大量用户的网站(亚马逊、优步)使用哪种方法?使用分布式缓存的会话是否足够好?

  2. 在什么实际用例中,使用JWT(基于令牌)比使用基于Session的更有意义?

谢谢!


通常情况下,您真的不希望客户端知道会话中存储了什么。这在JWT中是不可能的。使用会话来存储会话数据和JWT签名声明。 - ArSeN
2个回答

9
JWT令牌从未设计用于处理会话。它们是在服务之间交换完整性保护消息的一种方式。请查看这篇文章:http://cryto.net/~joepie91/blog/2016/06/13/stop-using-jwt-for-sessions/,其中解释了为什么使用JWT来处理会话不是一个好主意。
您还可以阅读BFF模式:https://curity.io/resources/learn/the-bff-pattern/,其中使用轻量级后端组件处理令牌,并仍然只在前端处理会话。因为它是一个轻量级组件,所以很容易扩展 - 例如,它可以是lambda函数。
所以在我看来,没有真正好的用例,在这些用例中,您真正喜欢基于JWT的会话而不是基于cookie的会话,但是(像任何强烈的观点一样),这可能会引发讨论 ;)

如果我想编写一个使用我的服务器的移动应用程序,那么cookie就无法工作了,对吧?这是我对cookie的主要问题。 - Florian Walther
2
在移动应用程序中,没有真正需要使用cookie - 您可以安全地处理令牌。尽管如此,cookie将与移动应用程序一起工作 - 我的意思是,对于移动应用程序,Set-Cookie标头就像任何其他响应标头一样。应用程序必须解析标头并自行存储cookie。它还可以在其请求中发送cookie标头,没有任何阻止该场景的情况。 - Michal Trojanowski

4

JWT的诞生是为了提供移动应用程序安全地访问API。虽然软件开发人员开始在基于 Web 浏览器的客户端中使用它们,但由于安全问题,它们并不适合。您会在这个话题上找到许多文章。对于 Web 应用程序,最好将令牌存储在服务器端,将其链接到新会话,在登录到 Web 浏览器后返回会话,并将其存储在会话 cookie 中。


我认为JWT并非为移动应用程序而创建,但也许我不了解这个方面的情况。我同意答案的其他部分。 - Michal Trojanowski
1
JWT的创建是因为SAML令牌(XML格式)无法适用于移动应用程序。 - Nitin Gaur

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接