HTTPOnly Cookie 不随 Ajax 请求一起发送

问题描述 投票:0回答:1

当我的用户登录时,我设置了一个 HTTPonly cookie access_token。我有一个中间件 auth,它验证 cookie access_token 的值是否授权用户。 当直接从服务器端发出请求并且中间件成功检索 cookie 时,它工作得很好。

但是当我通过 Ajax 在我的应用程序(相同域和相同端口)上调用一些路由时,中间件找不到 cookie access_token(因此拒绝连接)并且在 Web 检查器上,我没有看到任何 cookie 发送请求。

Ajax 请求似乎应该发送所有副本(甚至是 HTTPonly cookie),但我不知道为什么它不适用于我的应用程序。 你知道为什么吗?

非常感谢! 路易

javascript node.js ajax cookies httpcookie
1个回答
0
投票

这可能是因为 JavaScript 代码无法访问 HTTPOnly cookie,以防止跨站点脚本 (XSS) 攻击。由于 AJAX 请求是由 JavaScript 代码发出的,因此它无法访问 HTTPOnly cookie。

这个问题的一个解决方案是将cookie设置为常规cookie(不带HTTPOnly标志)并使用一些其他措施来防止XSS攻击。但是,不推荐使用这种方法,因为它会损害应用程序的安全性。

另一种解决方案是在请求标头中包含访问令牌而不是 cookie。这样,访问令牌可以通过 JavaScript 代码访问并与 AJAX 请求一起发送。为此,您可以在用户登录时将访问令牌设置为响应中的自定义标头,然后将其包含在后续请求的标头中。

这里是如何使用 Express 在响应中设置自定义标头的示例:

res.set('Authorization', `Bearer ${accessToken}`);

这里是一个如何使用 jQuery 在 AJAX 请求中包含自定义标头的示例:

$.ajax({
    url: '/api/data',
    headers: {
        'Authorization': `Bearer ${accessToken}`
    },
    success: function(data) {
        // do something with the data
    }
});

请注意,您仍应使用其他安全措施来防止 XSS 攻击,例如清理用户输入和使用内容安全策略 (CSP) 标头。

© www.soinside.com 2019 - 2024. All rights reserved.