无状态令牌验证安全性

时间:2016-01-10 06:57:06

标签: rest security web-applications django-rest-framework

我是ReST的新手,正在实施ReSTful令牌身份验证,尝试以标准方式在移动网络应用中使用Django-Rest-Framework JWT

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

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

关于上述实施,我有一些安全问题:

1)无论获得多少令牌刷新,都无法获得一个令牌,攻击者可以完全访问用户的登录信息?

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

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

此处似乎没有前向安全性。但是,如果服务器存储了令牌并保持其到期日期,则将停止完整的用户妥协,但不会导致每次会话损害。显然,使用SSL拦截器,他们仍然可以危害用户,但需要捕获每次登录。但是,该实现并不是ReSTful。

1 个答案:

答案 0 :(得分:1)

首先,过期的令牌是有效的令牌,但您可以在采取任何操作之前检查令牌是否已过期,并拒绝过期的令牌。您可以采取以下措施来提高应用的安全性:

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

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

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

希望这有帮助。