公开refreshtoken API是否安全



我在前端使用React开发了一个应用程序,在后端使用ASP.NetWebneneneba API开发了该应用程序。我使用JWT进行授权。该过程为

  1. 当用户登录并通过身份验证时,会向前端发送2个令牌,即访问令牌和刷新令牌。访问令牌是JWT,刷新令牌是随机字符串,刷新令牌存储在数据库中
  2. 对于随后对API的每次调用,访问令牌都附加在头中,我有一个验证访问令牌的身份验证过滤器
  3. 一旦访问令牌过期,就会抛出401状态,并显示错误消息TokenExpired
  4. 一旦前端接收401,它就调用刷新令牌API来获得刷新令牌

我的问题是,我无法使用身份验证过滤器来验证刷新令牌API的访问令牌,因为由于访问令牌过期,它将抛出401,因此我需要使刷新令牌API匿名,这样它就不会命中身份验证过滤器。如果我是匿名的,我会调用数据库来获取为用户存储的刷新令牌,并将其与从前端收到的令牌进行比较。那么,让刷新令牌API匿名是否安全?如果不是,最好的方法是什么?

在Auth0上,创建了一组功能,通过对刷新令牌的生命周期实施保护和控制来降低使用刷新令牌的风险。我们的身份平台提供刷新令牌轮换,还附带自动重用检测。

请阅读以下主题。

刷新令牌轮换

刷新令牌自动重用检测

JWT使用预共享密钥进行签名。由于后端是REST API并且是无状态的,因此jwt用于授权和构造主体对象

正如您所说,访问令牌代表应用程序中的授权,如果刷新令牌被暴露,那么坏的参与者可能会提供刷新令牌,以获得他们可以用于相同授权的访问令牌。

使用"预共享秘密"表明JWT是JWT的HMAC唯一变体,即没有加密,因为这表明私钥和公钥对与"预共享机密"相反。因此,JWT本质上是安全特征的一个签名,我们正在确保完整性JWT的声明是完整的,并且自签署以来没有更改。这也意味着,一端用于签名的秘密与另一端用于验证的秘密相同,必须使用相同的秘密,因为验证签名需要两端生成签名,并且两个签名都匹配。所以没有数据被加密,所以JWT中的数据不是敏感的,需要保护。

在这种情况下,刷新和访问令牌都是一个简单的JWT,只能由秘密持有者生成——如果它们被公开,只要它们仍然有效,就可以用来发出恶意请求(nbf声明(。

从本质上讲,如果暴露为模拟签名JWT的秘密所代表的身份,而实际上不知道秘密本身,则这种类型的JWT可能会被滥用,直到nbf声明使令牌过期,而刷新令牌是在没有秘密的情况下扩展nbf声明的机制(这将导致新的签名,因为nbf声明在使用时会更改(。

有一种防止访问令牌重用的保护措施,那就是nonce声明。如果你目前没有使用nonce声明,你可以阅读OIDC是如何实现的,并在你的应用程序中进行同样的操作。但正如你所说,你的应用程序是无状态的,但希望后端有一种状态形式,以确保没有nonce重用,并防止JWT签名重用。对于每个nonce,JWT签名都会更改,因此访问令牌会更改,并且只能使用1次。因此,如果被盗,谁先使用代币是一种种族条件,这大大降低了风险,但不是一个完美的解决方案。

最新更新