为什么我不能通过 javascript 访问这个 cookie?

问题描述

我的服务器向前端发送一个 locale cookie,后端根据客户端的接受语言标头确定该cookie。当我在 localhost 上运行后端和前端时,我可以在浏览器的 locale 中访问 javascript 中的 document.cookie cookie。它也可以在 chrome devtools 中看到(Application Tab-> Cookies)。

但是当我通过 https 远程运行后端和前端时,我无法访问浏览器上 javascript 中的 cookie。它在 devtools 中也不可见(Application Tab-> Cookies)。

document.cookie // no locale cookie in javascript devtools console
"_ga=somevalue; _gid=somevalue; __stripe_mid=somevalue; __stripe_sid=somevalue"

但我可以在响应的 locale 标头和 Set-Cookie 中看到 chrome://settings/cookies/ cookie。

回复

Set-Cookie:locale=%7B%22locale%22%3A%22en-US%22%2C%22countryCode%22%3A%22US%22%2C%22languageCode%22%3A%22en%22%7D;最大年龄=1617632;路径=/;到期日=周六,2021 年 4 月 24 日 07:34:03 GMT;安全的; SameSite=无

chrome://settings/cookies/

名称:语言环境
内容 : %7B%22locale%22%3A%22en-US%22%2C%22countryCode%22%3A%22US%22%2C%22languageCode%22%3A%22en%22%7D
:mydomain.herokuapp.com
路径:/
发送给:仅安全连接
可访问脚本:是
创建:2021 年 4 月 5 日星期一上午 9:25:27
到期:2021 年 4 月 24 日星期六凌晨 2:45:56

我知道您不能在 javascript 中访问仅 HTTP cookie,但它不是仅 HTTP cookie。它被设置为安全,但这应该无关紧要“仍然可以通过访问客户端硬盘或从 JavaScript 读取/修改具有此属性的 Cookie,如果未设置 HttpOnly cookie 属性。” src。它也是一个跨源 cookie,我的后​​端在 mydomain.herokuapp.com 上运行,而我的前端在 mydomain.netlify.app 上运行。

什么会导致这个 cookie 不能被 javascript 访问?

解决方法

问题是如果 cookie 设置为前端应用程序的域,则前端只能通过 javascript 读取 cookie。但是后端和前端在完全不同的域上。由于后端位于完全不同的域中,因此无法在前端域上设置 cookie。所以我把它们移到了同一个域的子域——frontend.mydomain.com 和 backend.mydomain.com。然后我将 cookie 设置为 trimws(string,whitespace = '[A-Za-z]',which = 'right') #[1] "L_3_A_L_3_1" "L_3_A_L_3_1" "L_3_A_L_3_1" "RL_3_C_RL_3_9" "SL_3_A_SL_3_2" ,如here 所述。

mydomain.com