Authentication 如果JWT被偷了怎么办?

Authentication 如果JWT被偷了怎么办?,authentication,access-token,jwt,Authentication,Access Token,Jwt,我正在尝试为我的RESTful API使用JWT实现无状态身份验证 首先,JWT基本上是一个加密字符串,在REST调用期间作为HTTP头传递 但是如果有一个窃听者看到了请求并偷走了令牌呢?那么他就能用我的身份伪造请求了 实际上,这个问题适用于所有基于令牌的身份验证 如何预防?像HTTPS这样的安全通道?我是一个节点库的作者,它可以在相当深的程度上处理身份验证,因此我将在这里补充一些信息 首先,JWT通常不加密。虽然有一种加密JWT的方法(请参阅),但由于许多原因,这在实践中并不常见 接下来,任何

我正在尝试为我的RESTful API使用JWT实现无状态身份验证

首先,JWT基本上是一个加密字符串,在REST调用期间作为HTTP头传递

但是如果有一个窃听者看到了请求并偷走了令牌呢?那么他就能用我的身份伪造请求了

实际上,这个问题适用于所有基于令牌的身份验证


如何预防?像HTTPS这样的安全通道?

我是一个节点库的作者,它可以在相当深的程度上处理身份验证,因此我将在这里补充一些信息

首先,JWT通常不加密。虽然有一种加密JWT的方法(请参阅),但由于许多原因,这在实践中并不常见

接下来,任何形式的身份验证(无论是否使用JWTs)都会受到MitM攻击(中间人)攻击。当攻击者可以在您通过internet发出请求时查看您的网络流量时,就会发生这些攻击。这是您的ISP可以看到的,NSA等

这是SSL帮助防止的:通过加密计算机的网络流量->身份验证时的某个服务器,监视网络流量的第三方无法看到您的令牌、密码或类似内容,除非他们能够以某种方式获得服务器的私有SSL密钥副本(不太可能)。这就是SSL对于所有形式的身份验证都是强制性的原因

但是,假设有人能够利用您的SSL并查看您的令牌:您的问题的答案是肯定的,攻击者将能够使用该令牌模拟您并向您的服务器发出请求

现在,这就是协议的用武之地

JWT只是身份验证令牌的一个标准。它们几乎可以用于任何事情。JWT之所以有点酷,是因为您可以在其中嵌入额外的信息,并且您可以验证没有人弄乱它(签名)

然而,JWT本身与“安全性”无关。就所有意图和目的而言,JWT与API密钥或多或少是一样的:只是随机字符串,用于对某个服务器进行身份验证

使您的问题更有趣的是所使用的协议(很可能是OAuth2)

OAuth2的工作方式是,它被设计为只在短时间内为客户端提供用于身份验证的临时令牌(如JWT!)

这个想法是,如果您的令牌被盗,攻击者只能在短时间内使用它

使用OAuth2,您必须经常向服务器重新验证自己,方法是提供用户名/密码或API凭据,然后在exchange中获取令牌

因为这个过程时不时发生,你的令牌会经常改变,使得攻击者很难不费吹灰之力地不断模仿你


我知道这是一个老问题,但我想我可以在这里放弃我的0.50美元,也许有人可以改进或提供一个理由来完全拒绝我的方法。 我正在HTTPS(ofc)上的RESTful API中使用JWTs

要使此功能正常工作,您应该始终发行短期代币(取决于大多数情况,在我的应用程序中,我实际上将
exp
声明设置为30分钟,将
ttl
设置为3天,因此您可以刷新此代币,只要其
ttl
仍然有效且代币未被列入黑名单

对于
身份验证服务
,为了使令牌无效,我喜欢使用内存缓存层(在我的例子中是redis)作为前面的
JWT黑名单
/
禁止列表
,具体取决于一些标准: (我知道它打破了RESTful的理念,但存储的文档实际上是短暂的,因为我将它们剩余的生存时间列为黑名单-
ttl
claim-)

注意:列入黑名单的代币不能自动刷新

  • 如果
    user.password
    user.email
    已更新(需要密码确认),身份验证服务将返回一个刷新的令牌,并使以前的令牌失效(黑名单),因此如果您的客户端检测到用户的身份已被泄露,您可以要求该用户更改其密码。 如果您不想使用黑名单,您可以(但我不鼓励您)验证针对
    user.updated\u at
    字段的
    iat
    (于发布)声明(如果
    jwt.iat
    则jwt无效)
  • 用户故意注销
最后,您可以像其他人一样正常地验证令牌


注意2:我建议为
jti
声明生成并使用UUID令牌,而不是使用令牌本身(非常长)作为缓存的密钥。这很好,而且我认为(因为我刚刚想到它,所以不确定)您也可以使用与CSRF令牌相同的UUID,方法是返回一个
secure
/
非http only
cookie,并使用js正确实现
X-XSRF-token
头。通过这种方式,您可以避免为CSRF检查创建另一个令牌的计算工作。

很抱歉,在这方面有点晚,但也有类似的问题,现在希望在同一方面有所贡献

1) 添加了一个极好的观点,即JWT和“安全性”无关,只要验证是否有人弄乱了有效负载(签名);ssl有助于防止违规

2) 现在,如果ssl也以某种方式被破坏,任何窃听者都可以窃取我们的承载令牌(JWT)并冒充真正的用户,下一步可以做的是,从客户端寻求JWT的“拥有证明”

3) 现在,通过这种方法,JWT的呈现者拥有一个特定的占有证明(POP)密钥,接收者可以确认请求是否来自同一个真实用户

我提到