请记住,这个问题是针对
HttpOnly
标志设置为 true
的 cookie 的。
我很确定我的问题的答案是否定的,但我一直很难通过官方文档或此处的其他帖子找到答案。这是某些上下文的简单用例:
api.domain.com/api/auth/login/
和app.domain.com
的axios向username
发出的password
请求在正文中返回带有access
JWT令牌的响应,并且响应设置带有HttpOnly标志的refresh
cookie [应该会失败,因为我认为无法在 API 请求到 app.domain.com
的 api.domain.com
上设置 cookie? -- 这是我的问题]access
令牌存储在内存中并随每个 API 请求传递api.domain.com/api/auth/refresh/
发出的请求按计划发送以刷新短暂的access
令牌。我通常在同一个子域 (
app.domain.com
) 上托管前端应用程序和后端应用程序,并使用诸如 CloudFront 或 nginx 之类的东西进行基于路径的路由,这很有效。例如,所有以 /api/*
开头的请求都发送到后端,所有其他请求都发送到前端应用程序。无论我使用什么选项在服务器上设置 cookie,尝试为 API 使用单独的子域似乎都失败了。
有人可以帮我确认实际上不可能在
app.domain.com
这样的子域上设置 HttpOnly cookie 来自 api.domain.com
上托管的 API 请求吗?如果有人也能帮我找到这可能在官方文档中找到的地方,那就太好了。
搜索
set httpOnly cookie across subdomains
,我没有找到任何直接相关的东西。我也没有在这些资源中找到任何可以直接回答我的问题的内容:
https://owasp.org/www-community/HttpOnly
https://learn.microsoft.com/en-us/previous-versions//ms533046(v=vs.85)?redirectedfrom=MSDN
这是可能的。事实上,我刚刚做到了。
在您的前端,使用 Axios:
const baseURL = 'https://api.example.com';
const api = axios.create({
baseURL,
withCredentials: true,
});
在您的后端,使用 Express:
app.use(
cors({
origin: 'https://www.example.com',
credentials: true,
}),
);
app.post('/login', async (req, res) => {
res.cookie('someCookie', someCookieValue, {
secure: true,
domain: 'example.com',
httpOnly: true,
});
});
所以在我花了一天时间解决这个问题之后,我将结束这篇文章的尝试。 跨域 Cookies
我终于明白了,很多人都在谈论将 cookie 从 PageA 中的 PageB 发送到 PageA 的解决方案。但这不是我要找的。所以在这篇文章中,对我来说,得票最多的答案是不正确的,但接下来的答案让我更清楚了。
我认为理解我们想要什么是关键,我试图将 Cookie 从 PageB 中的 PageB 发送到 PageA。这似乎是不可能的。 (我只谈论 http cookies。)。如果这不正确,我很高兴得到一个解决方案,但另一方面,从安全的角度来看,它也没有任何意义。