JWT,无状态身份验证和安全性

时间:2016-03-26 17:44:23

标签: security authentication jwt

我正在开发一个可扩展性是一个大问题的应用程序。在过去,我使用了基于会话的身份验证,但这次决定使用无状态服务器以便于水平扩展。

我不是安全专家,但在研究JWT时,它们看起来似乎非常不安全。我们散列密码的全部原因是,如果我们的数据库被泄露,攻击者就无法冒充用户。使用JWT,我们在服务器上存储一个秘密。如果攻击者获得了对该秘密的访问权限,他们是否不能冒充他们想要的任何用户?这是否意味着使用JWT具有与存储纯文本密码相同的安全级别?

我已经读过人们有时会使用reddis来交叉引用JWT,但是服务器不是无状态的,我根本看不到使用JWT的好处。

有人可以帮我澄清一下这个问题吗?

2 个答案:

答案 0 :(得分:4)

基于会话的身份验证系统,至少是任何值得使用的身份验证系统,也会在服务器上存储一个秘密。就像JWT一样,秘密用于签署基于会话的身份验证使用的cookie中存储的数据。所以这和JWT没什么不同。

所有这些都与密码存储完全无关,因为密码仅在您没有cookie / JWT时使用。

编辑:

不确定如何将Redis与JWT结合使用... Redis中存储的是什么,令牌?这似乎毫无意义,因为所有服务器需要知道的是解码令牌的秘密。

以下是使用JWT的一些好处:

  • 这是无国籍的,正如你已经提到的那样
  • 不受CSRF / XSRF攻击。这些攻击通过诱使您的浏览器将cookie发送到未生成cookie的服务器来实现。这不可能发生在JWT b / c上,浏览器不会像使用cookie一样自动发送JWT。
  • JWT是standardized。有一种定义明确的方法来生成它们,这意味着JWT更易于移植,并且该过程已经过安全社区的审查。

答案 1 :(得分:2)

使用JWT令牌(资源服务器)的服务器不需要访问任何秘密。它所需要的只是公钥,它属于用于对令牌进行数字签名的私钥。

发布令牌的授权服务器显然需要保密其签名密钥。但基于令牌的身份验证的好处在于,该服务器可以由具有更多资源/专业知识的外部方创建,以保密这些内容(谷歌,Facebook,微软等)。

在用户名和密码的情况下,资源服务器不需要检查数据库以验证令牌。这有助于系统的可扩展性并消除单点故障。

如果客户端/用户丢失了JWT令牌,攻击者可以模拟客户端/用户,直到令牌过期。保持令牌寿命缩短的一个很好的理由。

我没有看到在Reddis缓存中存储JWT令牌的意义。由于每个调用都带有Authorization HTTP标头中的标记,因此无需在服务器之间共享标记。将它们存储在缓存中只会增加令牌被盗的风险。

相关问题