【问题标题】:Should a cookie header be set on every response?是否应该在每个响应上设置 cookie 标头?
【发布时间】:2021-11-27 15:45:19
【问题描述】:

假设您正在实施会话。

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

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

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

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

【问题讨论】:

    标签: python http session pyramid


    【解决方案1】:

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

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

    【讨论】:

    • 是的,你是对的! Pyramid 中的默认会话实现将访问时间存储在 cookie 中——它需要在每次请求时更新,因此在每次响应时重置 cookie。而且,像 pyramid_beakerpyramid_redis_sessions 这样的替代实现不会无条件地这样做。你是对的。
    【解决方案2】:

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

    >这里有一个cookie。
    > 不,真的,吃一块饼干。
    > 说真的,吃这个饼干。

    只有在您对其进行更改时再次发送 cookie 才有意义。因此,对于具有绝对到期时间的 cookie,您可能希望每隔一段时间更新该到期时间。显然,如果你要改变 cookie 中存储的值,你也会再次发送 header。

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2019-06-10
        • 1970-01-01
        • 2022-01-23
        • 2021-04-03
        • 2020-09-07
        • 2016-02-18
        • 2014-01-12
        • 2015-05-02
        • 1970-01-01
        相关资源
        最近更新 更多