我正在开发一个可扩展性是一个大问题的应用程序。在过去,我使用了基于会话的身份验证,但这次决定使用无状态服务器以便于水平扩展。
我不是安全专家,但在研究JWT时,它们看起来似乎非常不安全。我们散列密码的全部原因是,如果我们的数据库被泄露,攻击者就无法冒充用户。使用JWT,我们在服务器上存储一个秘密。如果攻击者获得了对该秘密的访问权限,他们是否不能冒充他们想要的任何用户?这是否意味着使用JWT具有与存储纯文本密码相同的安全级别?
我已经读过人们有时会使用reddis来交叉引用JWT,但是服务器不是无状态的,我根本看不到使用JWT的好处。
有人可以帮我澄清一下这个问题吗?
答案 0 :(得分:4)
基于会话的身份验证系统,至少是任何值得使用的身份验证系统,也会在服务器上存储一个秘密。就像JWT一样,秘密用于签署基于会话的身份验证使用的cookie中存储的数据。所以这和JWT没什么不同。
所有这些都与密码存储完全无关,因为密码仅在您没有cookie / JWT时使用。
编辑:
不确定如何将Redis与JWT结合使用... Redis中存储的是什么,令牌?这似乎毫无意义,因为所有服务器需要知道的是解码令牌的秘密。
以下是使用JWT的一些好处:
答案 1 :(得分:2)
使用JWT令牌(资源服务器)的服务器不需要访问任何秘密。它所需要的只是公钥,它属于用于对令牌进行数字签名的私钥。
发布令牌的授权服务器显然需要保密其签名密钥。但基于令牌的身份验证的好处在于,该服务器可以由具有更多资源/专业知识的外部方创建,以保密这些内容(谷歌,Facebook,微软等)。
在用户名和密码的情况下,资源服务器不需要检查数据库以验证令牌。这有助于系统的可扩展性并消除单点故障。
如果客户端/用户丢失了JWT令牌,攻击者可以模拟客户端/用户,直到令牌过期。保持令牌寿命缩短的一个很好的理由。
我没有看到在Reddis缓存中存储JWT令牌的意义。由于每个调用都带有Authorization
HTTP标头中的标记,因此无需在服务器之间共享标记。将它们存储在缓存中只会增加令牌被盗的风险。