我不太了解 JWT 身份验证
I can't understand the JWT Authentication well
现在很多开发者使用JWT Authentication来授权api调用。
顺便说一句,如果黑客可以捕获经过身份验证的用户的 api 调用请求,那么他就可以获得经过身份验证的 JWT 令牌。
然后黑客可以使用授权的 JWT 令牌访问此 api,而无需他的身份验证。
这样可以吗?
我想知道 JWT 身份验证实际上是安全的。
你能解释一下吗?
jwt 是包含有关用户身份和声明的信息的代码,并且仅在有限的时间内有效。
除颁发令牌的授权端点外,任何人都无法读取或更改代码。因此 safe 是因为它不能被篡改。这意味着令牌可以 完全信任 。您不必验证令牌,无需查询数据库即可使用身份信息和声明。
但这也是缺点。一旦发行,令牌有效直到它过期,因为过期不能更改。这就是为什么令牌只能通过 安全线路 发送到服务器的原因。您不希望黑客拦截令牌。
但如果发生了,那又怎样?
有几个选项。您可以使用 short-lived 令牌,这意味着令牌在发布后很快就会过期。如果令牌被拦截,则它仅在一小段时间内有效。在那种情况下,您理所当然地认为黑客可以在有限的时间内访问系统。优点是您需要的资源更少,黑客的努力可能不值得。
另一种选择是在每个请求中验证令牌。这需要更多资源(例如在数据库中查找),尽管您可以使用某种缓存。如果某些内容发生变化,例如 IP 地址,那么您可以 使令牌无效 。但问题是您是否可以检测到令牌是否由黑客发送。
所以这取决于选择的策略。 但是:如果你发出一个长期访问令牌没有验证(因此不可能撤销令牌),那么如果黑客获得了访问令牌,你就会遇到问题。因此,您需要做一些事情才能以安全的方式使用它。
虽然我认为这应该足以帮助您理解,但我想提一下 刷新令牌 的使用。如果您使用 short-lived 访问令牌,那么您可能想要实现 long-lived 刷新令牌。这些刷新令牌旨在在其过期后获取新的访问令牌。优点是您不需要发送凭据,刷新令牌就足够了。但是,您只能在 可以保密的应用程序 中实现它。因为您肯定不希望黑客拦截(长期存在的)刷新令牌。
使用频率较低(与访问令牌相对),您可以添加逻辑以在使用时验证刷新令牌。您可以查询数据库并决定拒绝请求(例如,当 ip 地址更改时)并撤销刷新令牌。在这种情况下,用户必须再次识别自己(发送凭据)。
JWT只是fsb服务器和客户端之间的一个安全消息传输器,以便fsb服务器可以确定客户端是否登录;如果登录,fsb 服务器将获取基于用户的个人唯一数据。
google oauth
- 仅当用户拥有 google 帐户并成功正确输入 gmail 和密码时,G 才会将用户 gid 发送回我的服务器。
- user id 保存在 jwt 的 payload 中。
jwt
- if google 验证用户并且 google returns gid
- 创建jwt内容和内部维护:exp日期,加密
- jwt被发送并存储在用户浏览器的本地存储中;
- 每个用户的请求将 jwt 发送回我的服务器
- 我的服务器使用只有我的服务器拥有的 secretOrKey 解码 jwt,并从 jwt 获取内容(uid)。
- 如果 uid 在我的数据库中,则用户已经注册并且现在已登录。
- 将请求的数据从我的数据库发送给用户,因为他已登录
- 如果使用失败 google 由于密码或 G 电子邮件错误导致验证失败,则不会创建 jwt。
JWT的进程
- 用户的 google 弹出窗口登录
- google 服务器 returns 信息到我的服务器。如果 gid 不在我的数据库中,我会把它保存在我的数据库中,以便用户可以注册。
- 创建 jwt 并添加 uid 作为内容。过期日期。
- jwt 被发送并存储在用户浏览器的本地存储中
- 用户通过 http 请求页面,它包含 jwt。我的服务器通过登录确定测试检查该用户是否登录:如果用户的 jwt uid 在我的数据库中,则用户已登录。用户请求的数据将提供给用户。如果用户没有 jwt 或 uid 不匹配则用户未登录,将用户发送到登录页面。
JWT 描述
现在很多开发者使用JWT Authentication来授权api调用。 顺便说一句,如果黑客可以捕获经过身份验证的用户的 api 调用请求,那么他就可以获得经过身份验证的 JWT 令牌。 然后黑客可以使用授权的 JWT 令牌访问此 api,而无需他的身份验证。 这样可以吗? 我想知道 JWT 身份验证实际上是安全的。 你能解释一下吗?
jwt 是包含有关用户身份和声明的信息的代码,并且仅在有限的时间内有效。
除颁发令牌的授权端点外,任何人都无法读取或更改代码。因此 safe 是因为它不能被篡改。这意味着令牌可以 完全信任 。您不必验证令牌,无需查询数据库即可使用身份信息和声明。
但这也是缺点。一旦发行,令牌有效直到它过期,因为过期不能更改。这就是为什么令牌只能通过 安全线路 发送到服务器的原因。您不希望黑客拦截令牌。
但如果发生了,那又怎样?
有几个选项。您可以使用 short-lived 令牌,这意味着令牌在发布后很快就会过期。如果令牌被拦截,则它仅在一小段时间内有效。在那种情况下,您理所当然地认为黑客可以在有限的时间内访问系统。优点是您需要的资源更少,黑客的努力可能不值得。
另一种选择是在每个请求中验证令牌。这需要更多资源(例如在数据库中查找),尽管您可以使用某种缓存。如果某些内容发生变化,例如 IP 地址,那么您可以 使令牌无效 。但问题是您是否可以检测到令牌是否由黑客发送。
所以这取决于选择的策略。 但是:如果你发出一个长期访问令牌没有验证(因此不可能撤销令牌),那么如果黑客获得了访问令牌,你就会遇到问题。因此,您需要做一些事情才能以安全的方式使用它。
虽然我认为这应该足以帮助您理解,但我想提一下 刷新令牌 的使用。如果您使用 short-lived 访问令牌,那么您可能想要实现 long-lived 刷新令牌。这些刷新令牌旨在在其过期后获取新的访问令牌。优点是您不需要发送凭据,刷新令牌就足够了。但是,您只能在 可以保密的应用程序 中实现它。因为您肯定不希望黑客拦截(长期存在的)刷新令牌。
使用频率较低(与访问令牌相对),您可以添加逻辑以在使用时验证刷新令牌。您可以查询数据库并决定拒绝请求(例如,当 ip 地址更改时)并撤销刷新令牌。在这种情况下,用户必须再次识别自己(发送凭据)。
JWT只是fsb服务器和客户端之间的一个安全消息传输器,以便fsb服务器可以确定客户端是否登录;如果登录,fsb 服务器将获取基于用户的个人唯一数据。
google oauth
- 仅当用户拥有 google 帐户并成功正确输入 gmail 和密码时,G 才会将用户 gid 发送回我的服务器。
- user id 保存在 jwt 的 payload 中。
jwt
- if google 验证用户并且 google returns gid
- 创建jwt内容和内部维护:exp日期,加密
- jwt被发送并存储在用户浏览器的本地存储中;
- 每个用户的请求将 jwt 发送回我的服务器
- 我的服务器使用只有我的服务器拥有的 secretOrKey 解码 jwt,并从 jwt 获取内容(uid)。
- 如果 uid 在我的数据库中,则用户已经注册并且现在已登录。
- 将请求的数据从我的数据库发送给用户,因为他已登录
- 如果使用失败 google 由于密码或 G 电子邮件错误导致验证失败,则不会创建 jwt。
JWT的进程
- 用户的 google 弹出窗口登录
- google 服务器 returns 信息到我的服务器。如果 gid 不在我的数据库中,我会把它保存在我的数据库中,以便用户可以注册。
- 创建 jwt 并添加 uid 作为内容。过期日期。
- jwt 被发送并存储在用户浏览器的本地存储中
- 用户通过 http 请求页面,它包含 jwt。我的服务器通过登录确定测试检查该用户是否登录:如果用户的 jwt uid 在我的数据库中,则用户已登录。用户请求的数据将提供给用户。如果用户没有 jwt 或 uid 不匹配则用户未登录,将用户发送到登录页面。
JWT 描述