-
-
Notifications
You must be signed in to change notification settings - Fork 1.8k
Closed
Description
目前 egg-cookies 中对于 maxAge 的设置是转成 expires 属性
if (attrs.maxAge) attrs.expires = new Date(Date.now() + attrs.maxAge);
当客户端时间与服务端时间相差不大的情况下,这样能正常使用。但是当客户端时间设置成未来时间,在 chrome 和 safari 里面的行为就不一致了。
比如:今天是2020年6月21日,本地时间设置成2021年6月21日,设置一个 10 天的 cookie。
ctx.cookies.set('test', '1', {
httpOnly: false,
signed: false,
maxAge: 864000000, // 10 days
});
在 chrome 浏览器中,会将该与时间与 response 中的 Date 值进行偏移量计算,然后用该偏移量加上本地时间,得到 cookie 的过期时间,是2021年7月1日。
然而在 safari 浏览器中,并未有实现偏移量计算,导致 cookie 设置不成功(因为本地时间大于 expires 时间)。
在 HTTP 1.1 协议中给 set-cookie 加了 max-age 属性,用来处理 safari 的这种本地时间修改的情况。rfc6265 - The Max-Age Attribute
尝试使用 setHeader 的方式进行 set-cookie 设置,在 chrome 和 safari 皆能设置成功。
ctx.res.setHeader('set-cookie', 'test=1; path=/; max-age=864000;');
所以还是希望能支持下 cookie 的 max-age 属性。
但是这样会带来一个问题:之前 maxAge 属性使用的单位是毫秒(会转成 expires 属性),HTTP 规范中 max-age 使用的单位是秒,如果使用同一个字段必然会带来歧义。关于这个问题,koa 使用的 cookies 也有相应的讨论:https://github.com/pillarjs/cookies/pull/107。
不知你们怎么看待这个问题呢?
Metadata
Metadata
Assignees
Labels
No labels