我在一个域app.example.com
上托管了一个客户端,在其他子域api.example.com
上托管了一个API服务器。在开发模式中,有localhost:3000
和localhost:4000
。
我正在尝试发送包含Cookie
标头的HTTP请求。这工作得很好,而一切都在同一台服务器和域上。然后我更改了代码并在withCredentials
HTTP库上添加了CORS,还包括Axios
属性。在开发模式下它可以工作,cookie在请求中发送,但是在生产中它会中断。所有请求似乎都运行良好,OPTIONS
和POST
次请求获得200
响应。
这是我在API服务器上的CORS设置:
server.all('/*', (req, res, next) => {
res.header('Access-Control-Allow-Origin', DEV ? 'http://localhost:3000' : 'https://example.com')
res.header('Access-Control-Allow-Headers', '')
res.header('Access-Control-Allow-Methods', 'PUT,POST,GET,DELETE,OPTIONS')
res.header('Access-Control-Allow-Credentials', 'true')
next()
})
这就是我的axios
请求的样子:
axios(`${API_URL}/someEndpoint`, {
method: 'post',
withCredentials: true,
data,
})
但我的请求不包括Cookie标头:
然后我遇到了这个post并且答案说不可能在域之间共享cookie。现在我非常困惑。
我在标头中使用Cookie来检测哪个用户发送了哪个请求。如果我在标题中丢失了Cookie,我就无法再跟踪哪个(未登录)用户发送了哪个请求,因此我无法再将这些数据汇总到统计信息中。
我的应用程序是整体的,但我不得不将API服务器与渲染服务器分开。即使服务器使用不同的域,是否仍然可以读取标题中的cookie?
答案 0 :(得分:0)
似乎在不同域之间以这种方式共享cookie是相当不可能的〜安全风险,但是有问题的是,还提到了子域之间的共享,并且可以通过在设置cookie时添加domain
属性来实现。
cookies.set('cookieName', 'cookieValue' , { path: '/', domain: DEV ? undefined : '.example.com' })
请注意,值以.
同时,在不同域之间发送cookie值的解决方法是发送带有cookie值的自定义标头。