Skip to content

[Feature Request] 支持 HTTP 协议中 Set-Cookie 的 Max-Age 属性 #4357

@Junyan

Description

@Junyan

目前 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
});

服务端返回的 cookie 过期时间是2020年7月1日。
image

在 chrome 浏览器中,会将该与时间与 response 中的 Date 值进行偏移量计算,然后用该偏移量加上本地时间,得到 cookie 的过期时间,是2021年7月1日。
image

然而在 safari 浏览器中,并未有实现偏移量计算,导致 cookie 设置不成功(因为本地时间大于 expires 时间)。
image

在 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;');

chrome
image

safari
image

所以还是希望能支持下 cookie 的 max-age 属性。

但是这样会带来一个问题:之前 maxAge 属性使用的单位是毫秒(会转成 expires 属性),HTTP 规范中 max-age 使用的单位是秒,如果使用同一个字段必然会带来歧义。关于这个问题,koa 使用的 cookies 也有相应的讨论:https://github.com/pillarjs/cookies/pull/107。

不知你们怎么看待这个问题呢?

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions