我在使用 Next.js 13 作为前端、使用 Node.js 作为后端构建的 Web 应用程序中遇到 cookie 管理问题。尽管在服务器端成功设置了cookie,但Chrome在页面刷新时意外地清除了cookie。
res.cookie('accessToken', accessTokenJWT, {
httpOnly: true,
secure: true, //process.env.NODE_ENV === 'production',
signed: true,
expires: new Date(Date.now() + oneDay),
});
res.cookie('refreshToken', refreshTokenJWT, {
httpOnly: true,
secure: true, //process.env.NODE_ENV === 'production',
signed: true,
expires: new Date(Date.now() + longerExp),
});
};
采取的步骤:
使用 Node.js,我为
accessToken
和 refreshToken
设置 cookie,其特定属性包括 Path
、Expires
、HttpOnly
和 Secure
)
.
提供的响应标头表明已成功传输 cookie 作为 HTTP 响应的一部分。
但是,在页面刷新时,Chrome 似乎会清除这些 Cookie,从而扰乱预期的用户身份验证流程。
相关详情:
浏览器:谷歌浏览器
服务器配置:Node.js
框架:前端的 Next.js 13
请求和响应标头采用下面提供的结构化格式。
HTTP/1.1 200 OK:
Content-Length: 29
Content-Type: application/json; charset=utf-8
Date: Tue, 31 Oct 2023 20:42:42 GMT
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin:
ETag: W/"1d-SUDaWU/q2dcldXFBDZxiPXz37Fo"
Set-Cookie:
- accessToken: s%3AeyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyIjp7Im5hbWUiOiJBQkRJUklTQUsgWVVTVUYiLCJ1c2VySWQiOiI2NTM3YWMyZWUyODk2YTZiY2QzNmU4NGYiLCJyb2xlIjoiQURNSU4ifSwiaWF0IjoxNjk4Nzg0OTYyfQ.JsomTCXDe-xOo3UWUQbNjKm9DwMdmN4daVX_odrQDaY.t3m5OrryAfVzyKBpj9fapRNx2UsSGfTDcKjrDEDKbkM
Path: /
Expires: Wed, 01 Nov 2023 20:42:42 GMT
HttpOnly: true
Secure: true
- refreshToken: s%3AeyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyIjp7Im5hbWUiOiJBQkRJUklTQUsgWVVTVUYiLCJ1c2VySWQiOiI2NTM3YWMyZWUyODk2YTZiY2QzNmU4NGYiLCJyb2xlIjoiQURNSU4ifSwicmVmcmVzaFRva2VuIjoiYTU4Y2U2Mzg3MmEwMTczNTllYWE2NzZhYTU2YTA5YzY0OTk1ODg3ZDdlMWIyY2FhZWU4M2RhNWExOWY4ZTk1Zjc3OTZhZjY4YWQwYTdhNzMiLCJpYXQiOjE2OTg3ODQ5NjJ9.XFAkKg37u2EnajwioD9M5otqsp9ovONxxOmgWyZYlk0.08FU6sNeJCvOZZxUqjU679PJ2Fh6cNe8hOBnZA4qWCA
Max-Age: 1701376962
Path: /
Expires: Wed, 29 Sep 2077 17:25:24 GMT
Secure: true
Vary: Origin
Strict-Transport-Security: max-age=15552000; includeSubDomains
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 59
X-RateLimit-Reset: 1698785283
Cross-Origin-Opener-Policy: same-origin
Cross-Origin-Resource-Policy: same-origin
Origin-Agent-Cluster: ?1
Referrer-Policy: no-referrer
X-Content-Type-Options: nosniff
X-DNS-Prefetch-Control: off
X-Download-Options: noopen
X-Frame-Options: SAMEORIGIN
X-Permitted-Cross-Domain-Policies: none
X-XSS-Protection: 0
Content-Security-Policy: default-src 'self' https://jam.dev blob: i.imgur.com data:; base-uri 'self'; font-src 'self' https: data:; form-action 'self'; frame-ancestors 'self'; img-src 'self' data: https://jam.dev blob: i.imgur.com; object-src 'none'; script-src 'self' https://jam.dev blob: i.imgur.com data:; script-src-attr 'none'; style-src 'self' https: 'unsafe-inline'; upgrade-insecure-requests
Timing-Allow-Origin: *
任何调试和解决此问题的见解、建议或解决方案将不胜感激。预先感谢您!
我尝试过的:
1. Cookie 配置: 使用 Node.js 在服务器端配置 `accessToken` 和 `refreshToken` 的 cookie。
2. 指定属性: 设置 cookie 的“Path”、“Expires”、“HttpOnly”、“Secure”等属性。
3. 验证标头:检查提供的响应标头以确保正确传输 cookie。
预期结果:
- 即使在页面刷新后,预计 cookie 仍会持续存在并存储在浏览器中。
- 预期使用“accessToken”和“refreshToken” cookie,以方便跨会话无缝进行用户身份验证。
实际结果:
- 尽管服务器传输成功,但 Chrome 在页面刷新时意外地清除了 cookie。
- 由于这种意外的清除,维护用户会话的持久 cookie 的预期行为被打乱。
我也面临着同样的问题。你解决了吗