无状态令牌身份验证安全性



我是ReST的新手,正在以标准方式在移动web应用程序中实现ReSTful令牌身份验证,尝试使用Django ReST Framework JWT

  • 客户端发送凭据
  • 服务器验证并发回令牌和过期日期。从数据库中删除令牌
  • 当用户提出请求并且令牌即将过期时,客户端调用刷新令牌
  • 根据客户端请求,服务器验证令牌签名
  • 在过期的令牌上,移动应用程序将用户注销。移动应用程序检查过期而非服务器

我决定让移动应用程序检查到期日期,因为我读到它是ReSTFul,服务器检查它需要它存储不是ReSTFul 的令牌

关于上述实现,我有几个安全问题:

1) 无论刷新多少次令牌,获取一个令牌是否都能让攻击者完全访问用户的登录信息?

即使是通过https,也可以说通过某种方式,攻击者(即ssl拦截器代理)检索到了令牌。显然,移动应用程序不允许他们登录,但他们可以通过任何HTTP客户端调用带有令牌的api来获取数据。

2) 如果服务器认为所有令牌都有效,那么首先刷新令牌的目的是什么?

这里面似乎没有前沿安全。但是,如果服务器存储令牌并保留其到期日期,则会停止完全的用户折衷,但不会停止每会话折衷。显然,使用SSL拦截器,它们仍然可以危害用户,但需要捕获每个登录。然而,该实现并不是ReSTful。

首先,过期的令牌是有效的令牌,但您可以在采取任何行动之前检查令牌是否过期,并拒绝过期的令牌。你可以做几件事来提高应用程序的安全性:

  • 您可以在令牌中添加哈希密码。因此,如果用户丢失了他的/她的手机,当密码在另一台设备中更改时,您可以拒绝使用旧密码哈希的令牌。

  • 这一个并不完全是restful,但也没那么糟糕:您可以在db中添加一个名为revokedTokens的表,它可以跟踪用户吊销的令牌的id(显然您应该将其添加到令牌中),如果您稍后收到带有该令牌的请求,您可以拒绝它,直到它过期。当它过期时,您可以从表中删除,因为过期的令牌无论如何都不会成为问题。

  • 您可以在用户登录到令牌时添加设备的主机名,并将其与请求的主机名进行比较,从而为ssl拦截器攻击提供额外的安全层。是的,这不是完全的保护,但还是要好一点,因为攻击者除了需要从另一个设备发送令牌外,还需要更改他/她的主机名。

希望这能有所帮助。

最新更新