JSON Web令牌(JWT)优于数据库会话令牌

Ski*_* M2 49 access-token jwt express-jwt json-web-token

使用数据库会话令牌系统,我可以使用用户名/密码进行用户登录,服务器可以生成令牌(例如uuid)并将其存储在数据库中并将该令牌返回给客户端.来自其上的每个请求都将包括令牌,并且服务器将查询令牌是否有效以及它属于哪个用户.

使用JWT,由于保留在服务器上的密钥和客户端保留并随每个请求发送的签名令牌的组合,因此无需为会话/令牌保存任何数据库.

这很好,但除了保存数据库检查每个请求(因为它只是检查哈希表,这将是快速的),我不清楚使用JWT的优点是什么.你能熟悉这个解释吗?让我们忽略cookie,它特别是如上所述的数据库自定义令牌和JWT,我试图比较和理解它的好处.

Era*_*anG 26

主要区别在于服务器所需的会话存储大小和查找工作:

  • 在服务器端,JWT将单个密钥存储在内存(或配置文件)中 - 称为密钥.该密钥有两个目的,它可以创建新的加密令牌,它的功能类似于"打开所有锁"的主密钥 - 或者在现实生活中验证所有令牌.因此,服务器对身份验证请求的响应速度要快得多,因为如果您有两百万或两百万用户登录并不重要 - 将使用相同数量的记录(一个,即服务器密钥)来验证所有客户端请求.

  • 将用户会话存储在数据库中的传统身份验证会在db中为每个用户创建一条记录,从而产生多个密钥.因此,如果您有两百万用户登录,则服务器将创建两百万条记录,并且每个客户端请求服务器都需要在数据库中找到相关的会话记录*.

JWT将其留给客户端来存储和处理整个会话/用户对象.它实际上更有意义,因为每个客户端只处理自己的数据,因此它也不会导致客户端的繁重工作.

至于你在上一段写的内容,不仅仅是我们在这里保存的db调用.JWT实际上具有更高的可扩展性,因为它具有独立和轻量级的特性,它不会因为auth请求堆积而失败,并且它允许服务器在不管理服务器端会话的情况下处理auth跨设备和服务.

虽然安全性明显,但数据库会话可以占上风:由于这种延迟,它们可以更安全,并且在用户注销后也更不容易受到会话劫持的影响.

*db存储会话方法可以通过有效缓存和仅在快速键/值服务器(如Redis)中存储会话ID(而不是整个用户对象)进行优化.也就是说,在大多数情况下,我仍然会选择JWT方法而不是db.

  • 实际上,劫持也是会话可能发生的事情,只是通过会话可以清除单个用户会话,而jwt则不能,更改密钥会将所有人都记录下来但不能为单个用户执行.与维护会话相关的可扩展性和缺乏管理可能会给jwt带来优势. (2认同)
  • 看看这个线程并回答有关jwt令牌安全问题的问题http://stackoverflow.com/questions/26739167/jwt-json-web-token-automatic-prolongation-of-expiration这个想法是保持令牌生命周期短并且经常更新令牌,或在Google中搜索“ auth0刷新令牌”(不带引号)以寻求另一种解决方案 (2认同)

Pri*_*har 1

基于 Json 的令牌(JWT)克服了以下问题:

\n\n
    \n
  1. 移动问题:本机移动应用程序似乎在使用 cookie 时遇到问题,因此如果我们需要查询远程 API,会话身份验证可能不是最佳解决方案。
  2. \n
  3. CSRF 问题:如果您遵循 cookie 方式,那么您需要有 CSRF 以避免跨站点请求。
  4. \n
\n\n

但是 JWT 不使用会话,在移动设备上没有问题,它不需要 CSRF,并且它也可以很好地与 CORS 配合使用。如果您没有有效的令牌,您将无法执行任何操作。

\n\n

还有一个,因为此令牌存储在客户端本地存储/会话存储中,因此您也可以将这些令牌传递给其他客户端,但您必须共享用于生成此 JWT 的相同凭据。

\n

  • 这些是 JWT 相对于使用 cookie 提供的好处,我理解这一点,但我问的是存储在数据库中并由服务器生成的会话令牌。 (12认同)