AngularJS或带JWT的SPA - 到期和刷新

pat*_*r82 12 security authentication jwt angularjs single-page-application

我了解JWT和单页应用程序在登录和JWT发布方面的流程.但是,如果JWT在到期时已烘焙,并且服务器未在每个请求上发出新的JWT,那么更新的最佳方式是什么?有一个刷新令牌的概念,但在Web浏览器中存储这样的东西听起来像一张金票.

IE我可以很容易地进入浏览器本地存储并窃取刷新令牌.然后我可以去另一台计算机并给自己发一个新令牌.我觉得在JWT中引用的数据库中需要有一个服务器会话.因此,服务器可以查看会话ID是否仍然处于活动状态或是否由刷新令牌无效.

在用户处于活动状态时,在SPA中实施JWT以及处理新令牌发布的安全方法是什么?

mgo*_*nto 6

如果您的服务器中没有其他限制,您需要检查1小时不活动状态以将用户注销,则每15分钟更新一次令牌(如果它的寿命为30).如果你只是想要这个短暂的JWT并继续更新它,那就行了.

我认为使用JWT的一大优势是实际上不需要服务器会话,因此不使用JTI.这样,您根本不需要同步,因此这是我建议您遵循的方法.

如果您想要强制注销用户,如果他处于非活动状态,只需在一小时内设置一个过期的JWT.有一个$ interval,每隔约50分钟自动获得一个基于旧JWT的新JWT如果在最后50分钟内至少完成了一次操作(你可以有一个请求拦截器只计算请求以检查他是否有效)就是这样.

这样您就不必在数据库中保存JTI,您不必拥有服务器会话,并且它不是一个比另一个更差的方法.

你怎么看?

  • 我认为我唯一的问题是它就像一个刷新令牌.如果我偷了你的JWT,我可以继续更新会话并保持无限期活跃. (3认同)

pat*_*r82 3

我认为对于我的实现,经过一番搜索后,我将采用的是......

使用案例:

  • JWT仅有效15分钟
  • 用户会话将在 1 小时不活动后超时

流动:

  1. 用户登录并获得 JWT

    1. JWT 的有效期为 15 分钟,声明为“exp”
    2. JWT JTI在db中记录有一个1小时的会话
  2. JWT 过期后(15 分钟后):

    1. 当前过期的 JWT 将使用 @ /refresh URI 来交换新的 JWT。过期的 JWT 只能在刷新端点上工作。IE API 调用不会接受过期的 JWT。此外,刷新端点不会接受未过期的 JWT。
    2. JTI将被检查是否被撤销
    3. JTI 将检查是否仍在 1 小时内
    4. JTI 会话将从数据库中删除
    5. 将发布新的 JWT,并将新的 JTI 条目添加到数据库中
  3. 如果用户注销:

    1. JWT 已从客户端删除
    2. JTI 已从数据库中删除,因此无法刷新 JWT

尽管如此,每 15 分钟就会调用一次数据库来检查 JTI 是否有效。滑动会话将在跟踪 JWT 的 JTI 的数据库上扩展。如果 JTI 过期,则该条目将被删除,从而强制用户重新进行身份验证。

这确实暴露了一个令牌处于活动状态 15 分钟的漏洞。然而,如果不跟踪每个 API 请求的状态,我不知道还能怎么做。