使用 JWT 进行身份验证

Authentication with JWT

我一直在关注这个博客 post (https://auth0.com/blog/2015/04/09/adding-authentication-to-your-react-flux-app/),并且对 JWT 的一个方面感到困惑。

上面的post似乎通过检查是否有作为cookie存储的JWT来测试用户是否已经登录,如果有,它只是对其进行解码以找到用户名和其他信息,并将用户重定向到经过身份验证的页面。

我想知道是什么阻止某人添加假的 JWT cookie 来访问应用程序的已验证部分?我一定错过了一些明显的东西。换句话说,在维护会话时,前端如何确保 JWT 是 "signed by the server" 之类的,而不是为试图获得访问权限而欺诈性创建​​的?

在许多应用程序中,有人可以添加伪造的 JWT 来访问您只希望他们在登录时看到的前端部分。但是,他们也有前端 运行 在他们自己的计算机上,并且可以更改代码来执行相同的操作。

后端服务器使用前端不应该存在的密钥对 JWT 进行编码,当您将 JWT 传回服务器时,服务器将在处理您的请求之前对其进行解码。所以它知道有人早些时候使用了您的登录凭据,它发出了 JWT 作为响应,并且有人再次向它发送了 JWT。这会阻止没有(真正的)JWT 的人对您的 API 的攻击。

与会话 cookie 相比,它还有一些优势在于它在服务器端是无状态的,并且它使得某些 cross-site 请求伪造攻击在传统浏览器中更难进行,因为攻击者无法将请求嵌入到您的站点并且信任浏览器添加您的会话 cookie。

但这只是更大的安全解决方案的一部分。

这里 JWT 安全性的关键是 "secret"-- 一个应该只在受信任的服务器上的密钥(或者如果使用第三方,则与您的身份验证提供商一起)。 JWT 是使用这个秘密加密的。可以是passphrase,但是JWT也支持public/private密钥加密,所以secret也可以是私钥。

因此,在您的情况下,阻止用户创建新 JWT 的原因是,除非他们知道秘密,否则他们用于创建自己的 JWT 的加密将无法在服务器上运行,如果编码的话正确,将阻止用户以他们希望的方式进行身份验证。