http_only 用于带有 JWT 令牌的 cookie

信息安全 xss javascript 饼干
2021-09-05 02:42:29

我试图弄清楚如何使用在 SPA 中传输的 JWT 它需要在 cookie 中,因为我们希望非 ajax 请求也发送 jwt,它应该对所有子域“正常工作”。我在服务器端生成并更新了带有令牌的 cookie。我想弄清楚的是客户端应该如何获取信息(本质上是登录用户的 is_logged_in 和用户名)并使该信息与服务器端 cookie 生命周期保持同步,因为我希望在 1 小时后到期没有请求,当发生这种情况时它应该显示在浏览器上。我的问题是我想要的用户信息位于 http_only 的 cookie 中以防止 XSS。我已经想到了几个选项,并想就什么是合理的安全妥协提出意见:

1) 在两个 cookie 中发送相同的 jwt 令牌,一个用于实际的服务器端 auth & auth,标记为 http_only 和安全,第二个相同但不是 http_only,因此客户端可以对其进行解码以获取当前用户信息和到期时间。

2) 在第二个 cookie 中发送用户信息,该 cookie 不是 http_only 并且是普通视图,但只有登录用户的用户名。

3) 尝试让客户端自己跟踪登录信息,到目前为止这似乎有问题,而且很容易搞砸,但没有不安全的 cookie 到处乱飞。

我想我很可能错过了上述选项的一些安全方面,因此在这里问。谢谢!

2个回答

这听起来不错,并且似乎是一个很好的解决方案,可以通过将用户名的值复制到非 http only cookie 中来保护会话 cookie 免受 XSS 攻击。

无论如何,您的所有授权检查都应该在服务器端进行。因此,如果您的客户端想要在服务器端做某事,它会发送请求,然后服务器自己进行授权检查,根本不考虑非 http only cookie - 它只使用仅受 http 保护的会话 cookie。

如果非 http only 仅用于 UI 目的,它不会损害会话,因为服务器将使用会话 cookie 审查所有请求。

我必须多次阅读您的问题才能理解您在选项一中所描述的内容 - 如果您的会话 cookie 包含可预测的明文值(在您的示例中是经过身份验证的用户名以及它们经过身份验证的冗余事实​​),那么您的安全性从根本上破坏了。会话应该是随机的或使用随时间变化的初始化值/盐进行加密。

在您的第二个选项中,假设会话 cookie 是安全的,那么第二个不安全的 cookie 被泄露的后果是什么?不是很多。尽管值得注意的是,大多数 cookie 可能被破坏的手段相当于浏览器类型攻击(包括 xss)中的人,此时攻击者将能够利用会话 cookie 创建源自受害者浏览器的请求.