我正在开发一个应用程序,可扩展性是一个大问题。过去我使用过基于 session 的身份验证,但这次决定使用无状态服务器,以便于水平扩展。
我不是安全专家,但在研究 JWT 时,我开始发现这些非常不安全。我们对密码进行哈希处理的全部原因是,如果我们的数据库遭到破坏,攻击者就无法冒充用户。使用 JWT,我们将 secret 存储在服务器上。如果攻击者获得了 secret 的访问权限,他们就不能冒充任何他们想要的用户吗?这是否意味着使用 JWT 具有与存储纯文本密码相同的安全级别?
我读到人们有时会使用 reddis 来交叉引用 JWT,但服务器不是无状态的,我根本看不到使用 JWT 的好处。
有人可以帮我澄清这个问题吗?
最佳答案
基于 session 的身份验证系统(至少是任何值得使用的系统)也会在服务器上存储 secret 。就像 JWT 一样,该 key 用于对存储在基于 session 的身份验证使用的 cookie 中的数据进行签名。所以这与 JWT 没有什么不同。
所有这些都与密码存储完全无关,因为只有当您没有 cookie/JWT 时才会使用密码。
编辑:
不知道如何将 Redis 与 JWT 结合使用...Redis 中存储了什么( token )?这似乎毫无意义,因为服务器需要知道的只是解码 token 的 secret 。
以下是使用 JWT 的一些好处:
- 正如您已经提到的,它是无状态的
- 它不会受到 CSRF/XSRF 攻击。这些攻击的原理是欺骗您的浏览器将 cookie 发送到未生成 cookie 的服务器。使用 JWT 时不会发生这种情况,因为浏览器不会像使用 cookie 那样自动发送 JWT。
- JWT 是 standardized 。有一种明确定义的方法来生成它们,这意味着 JWT 更便携,并且该过程已经过安全社区的审查。
关于security - JWT、无状态身份验证和安全性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36238642/