6

假设您正在实施会话。

您检查浏览器是否提供会话 cookie。如果是,您验证 cookie 并找到与会话关联的用户,然后继续处理请求。

如果您没有找到会话 cookie,则创建一个新会话并将 cookie 发送到您希望在后续请求中接收的浏览器。

现在我的问题是:如果您确实在请求中找到了会话 cookie,您会在响应中重新发送相同的 cookie。在什么情况下这是对的?

注意:我作为 Pyramid (Python) 程序员提出这个问题,因为 Pyramid 实现在每次响应时都会无条件地发送会话 cookie。(去代码

4

3 回答 3

8

通常,您不需要在每个响应上都设置 cookie。浏览器已经拥有 cookie,只要它仍然有效,它就会继续发送到服务器。

具体来说,每个请求都会设置一个 Pyramid 会话 cookie,因为它包含一个签名和时间戳记的秘密,该秘密可以与正常的 cookie 过期机制分开过期。通过在Pyramid 每次更新嵌入的时间戳时设置一个新的 cookie 以显示会话仍然是新鲜的。换句话说,cookie 集每次都是不同的。

于 2013-03-15T12:23:32.037 回答
8

对于会话cookie(如浏览器会话 cookie,客户端将在关闭后立即销毁)我可能不会这样做。它并没有取得任何特别的成就,并且像这样不断重复自己是浪费带宽(尽管是少量)。

> 这里有一块饼干。
< 谢谢!
> 不,真的,吃一块饼干。
< 那不是同一个饼干吗?
> 说真的,吃这个饼干。
<请停止。

只有在更改某些内容时再次发送 cookie 才有意义。因此,对于具有绝对到期时间的 cookie,您可能希望每隔一段时间更新该到期时间。显然,如果您要更改存储在 cookie 中的值,您还将再次发送标头。

我通常是一名 PHP 开发人员,PHP 原生会话也执行此操作(每次无条件发送)。我想这样做的原因是a)它更容易实现和b)它试图解释行为不正常的用户代理,可能忽略到期时间或未能将cookie写入客户端持久存储或<插入其他奇怪此处的行为>。

如果每个人都正确实现了 2109/2965,那么绝对没有理由多次设置语义相同的 cookie。但是,如果人们真的阅读标准,开发人员的生活会不会很枯燥?

于 2013-03-15T12:26:16.973 回答
1

并非一切都是浏览器。例如,在分布式系统中,您可以从一个节点登录并使用同一会话从其他节点访问服务(如果您有一千个节点,您不想从每个节点登录)现在假设其中一个节点注意到cookie 即将过期,它会更新 cookie。其他节点不会知道更改,并且会再次更新 cookie 或使用旧的。在任何一种情况下,您的整个系统都会停止工作,除非您进行一些复杂的节点间消息传递。您可以针对这种情况实施 JWToken 之类的东西,但它有其自身的缺点(例如无法注销),因此它并不总是可以接受的。除了浏览器不理解 jwtokens。

于 2021-11-23T17:31:41.680 回答