Http 如何在HTML和API调用具有不同域的站点上使用cookie?

Http 如何在HTML和API调用具有不同域的站点上使用cookie?,http,cookies,static-html,Http,Cookies,Static Html,我在一个静态服务器上托管一个单页应用程序网站(碰巧是AmazonS3),所以它是从我的应用程序的URL提供的,比如说“example.com”。因此,该网站位于“”。此站点使用使用JavaScript的fetch()调用进行的API调用来执行站点的功能。因为example.com指向一个静态服务器,所以API调用会转到另一个域,我们将其称为“xyz.execute API.cloudhost.com”(它恰好位于Amazon的API网关后面) 我想使用cookies来管理用户会话。也就是说,我希

我在一个静态服务器上托管一个单页应用程序网站(碰巧是AmazonS3),所以它是从我的应用程序的URL提供的,比如说“example.com”。因此,该网站位于“”。此站点使用使用JavaScript的fetch()调用进行的API调用来执行站点的功能。因为example.com指向一个静态服务器,所以API调用会转到另一个域,我们将其称为“xyz.execute API.cloudhost.com”(它恰好位于Amazon的API网关后面)

我想使用cookies来管理用户会话。也就是说,我希望一个API调用在响应上返回一个集Cookie头,该响应将在浏览器上存储Cookie,并且我希望某些其他API调用在请求上传递Cookie头,然后可以在API中进行验证。cookie将始终来自API并返回到API(而不是页面的站点,因为页面本身托管在静态服务器上)。我希望在会话之间保存cookie(有一些过期期限,并且理解浏览器可能会由于空间限制或用户操作而清除cookie)

但这很难做到。首先,我的API调用都是到一个单独的域,所以我必须使用CORS来授权调用。当我使用CORS时,服务器必须在访问控制允许头的列表中包含“Cookie”,否则它将不会被返回。此外,当我使用Javascript的fetch()API进行调用时,我需要指定包含如下凭据:

fetch(url,{method:“POST”,凭证:“include”})

…否则将不发送cookie。返回Cookie的API调用不需要接收Cookie,但我必须为此指定
凭据:“include”
,否则浏览器将忽略设置Cookie响应头

我还需要正确配置cookie本身。不同的API调用有不同的路径,因此我需要在Set-Cookie头中指定
Path=/
。我更愿意设置
SameSite=Strict
Secure
HttpOnly
最大年龄的值,但如果需要,我愿意灵活处理

这就是我所能做到的。我仍然无法让我的Cookie以跨平台的方式放置(使用Set Cookie)并返回到服务器(使用Cookie)。由于页面域与API域不同,我可能需要指定
SameSite=None
,但如果这样做,可能还需要设置
安全
(这很好)。即便如此,我也无法让所有主流浏览器都返回cookie。我还希望用相同的密钥设置一个新的cookie将替换现有的cookie,但我也不能让它工作——当它返回时,我看到两个cookie


在这种情况下,使用cookie的正确方法是什么?

因为您明确表示希望从单独的站点向API站点发起这些请求,这意味着它们本质上是跨站点或第三方请求,因此cookie必须标记为
SameSite=None;安全

如果您想使用类似于
SameSite=Strict
SameSite=Lax
的东西,那么您将需要从SPA中管理cookie。这可能更可取,因为它允许您将会话标识符或令牌存储在那里,然后将其作为单独的字段或头传递给API。这样,您的API就不依赖于cookie,这可能更可取