Set-Cookie头部不起作用。

54

我正在使用Go语言开发一个小网站,尝试从服务器端设置cookie。

我的服务器运行在本地主机上,127.0.0.1别名为 subdomain-dev.domain.com ,端口为 5080

当我收到针对 subdomain-dev.domain.com:5080/loginPOST请求的响应时,我可以看到 set-cookie 头信息。响应如下:

HTTP/1.1 307 Temporary Redirect
Location: /
Set-Cookie: myappcookie=encryptedvalue==; Path=/; Expires=Fri, 13 Sep 2013 21:12:12 UTC; Max-Age=900; HttpOnly; Secure
Content-Type: text/plain; charset=utf-8
Content-Length: 0
Date: Fri, 13 Sep 2013 20:57:12 GMT

为什么Chrome或Firefox没有记录这个?在Chrome中,它不会显示在资源选项卡中。在Firefox中我也看不到它。未来的请求头中也无法看到它。

1
顺便问一下,为什么不使用 net/http 中的 SetCookie 并自己编写呢? - Mostafa
我正在使用 SetCookie(或者说是 gorilla/sessions)。设置它并不是问题,问题在于为什么 Chrome 忽略它。;) 感谢您的建议! - Chris Pfohl
除了其他需要调查的事情之外,我最近发现如果你正在使用fetch发送请求,Chrome浏览器在68版本以下的默认行为是删除所有cookie。https://stackoverflow.com/questions/65981488/cookie-in-chrome-68-not-accepted - 1110101001
6个回答

73

看到那个Secure的字符串在cookie里了吗?

我也是几个小时之后才注意到的。

如果你设置了Secure标志,请确保通过SSL(URL以https://开头)访问你的网站。

如果你在本地开发并且没有证书,请确保跳过该选项。


1
这不是答案,你不应该能够从Chrome或Firefox中看到cookie的httpOnly。 - julio
5
“@julestruong,这肯定是答案……因为我回答了自己的问题。我当时并不是试图从JavaScript中访问,只是试图设置cookie。这是几年前的事情了,但那只是一个会话cookie。” - Chris Pfohl

22

在我的情况下,我必须将这个添加到我的响应中:

access-control-expose-headers: Set-Cookie

我在这里发现,如果没有将我的Set-Cookie头信息添加到暴露的头信息中,客户端将无法访问它。

希望这能帮到某些人!


1
对我来说,仍然无法使用set-cookie响应头设置Cookie。 我发现它是被禁止的响应头:https://fetch.spec.whatwg.org/#forbidden-response-header-name - Piotr Śródka
1
但我的是http cookie,我也能获取那个cookie吗? - jay rangras
这个有效,谢谢。 - AzizStark
这只与跨域请求相关。 - omriman12

12

找到了相关的GitHub问题 response cookies not being sent,这对我很有帮助。
在我的情况下,我正在使用mkcert工具在https下运行react应用程序,并进行跨域获取请求和响应。直到我

  1. 为fetch请求指定credentials: 'include'。 示例fetch api
fetch('https://example.com', {
  credentials: 'include'
});
  1. 从服务器指定这些响应头
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: https://localhost:3000

Access-Control-Allow-Origin头部的值是我react应用程序的网址。

  1. 使用http cookies添加Set-Cookie头部这些属性:Path=/; HttpOnly; Secure; SameSite=None

希望对某人有所帮助!


1

对于其他遇到此问题的人,我需要执行以下操作才能获取我的cookie(我恰好在后端使用fastapi-users,在前端使用js fetch api):

  • 更改我的cors配置,使得头部不是“*”,而是完全指定的(我从标准请求字段中提取)
  • 在我的后端配置中添加cookie_samesite="none"以传输cookie
  • 在fetch api的请求中添加credentials: 'include'

如果你更喜欢使用CookieTransport,似乎你也可以在Starlette的exposed set_cookie中完成这个操作... https://www.starlette.io/responses/#set-cookie - paxton91michael

0

flask,flask_jwt_extended

我的问题是,我有一个函数(@Blueprint.after_app_request - 在响应返回给客户端之前运行)在响应上设置了一个头部来刷新cookie。

因此,我的注销函数添加了一个头部来使cookie过期,而刷新函数则刷新了我的cookie。

因此,响应具有以下标头:

  1. 使cookie过期。
  2. 刷新cookie。

也许这将有助于某天的某个人。


-1
发布一下,以防有人对网页开发还不熟悉,仍然在苦苦挣扎,无法使用cookie(就像我一样)。
为了让cookie正常工作,你需要在服务器端配置cors设置,似乎只有"origin: *"是不够的。
我不得不设置我的origin,然后在服务器端将credentials设置为true。 如果你使用node,可以这样做- app.use(cors({ origin: "http://localhost:5173", credentials: true })); 此外,在前端获取数据时,你需要确保将withCredentials设置为true。这个选项将在你的XHR请求中包含cookie和身份验证头。
在axios中实现的示例- const response = await axios.get(url, { withCredentials: true }); 希望这能帮助到有困扰的人。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接