一个RESTful API为什么会在API响应中发送cookies?

17

前几天,在向Twitter发送请求后,我的客户端出现了一个奇怪的警告:

2018-01-12 02:32:50,162 WARN o.a.h.c.p.ResponseProcessCookies:130 - Invalid cookie header: "set-cookie: guest_id=v1%3A151572431977858379; Expires=Sun, 12 Jan 2020 02:31:59 UTC; Path=/; Domain=.twitter.com". Invalid 'expires' attribute: Sun, 12 Jan 2020 02:31:59 UTC

格式是正确的,所以最终是HTTP客户端配置错误,但这让我有了一个问题:为什么RESTful API会发送cookie?

这些似乎是Twitter的追踪cookie,在RESTful上下文中有什么用处呢?Twitter是否想在通过XMLHttpRequest调用时设置cookie(而不是在服务器端),还是他们错误地将通用的“设置cookie”过滤器也应用于API端点?

这个问题不仅适用于Twitter,还适用于一般的RESTful API。

以下是原始响应的摘录:

Server:
    tsa_b
pragma:
    no-cache
cache-control:
    no-cache, no-store, must-revalidate, pre-check=0, post-check=0
x-connection-hash:
    24fd4a4b3d61e33b6b94080b710a1e61
x-xss-protection:
    1; mode=block; report=https://twitter.com/i/xss_report
x-content-type-options:
    nosniff
x-rate-limit-limit:
    900
expires:
    Tue, 31 Mar 1981 05:00:00 GMT
Date:
    Fri, 12 Jan 2018 17:45:03 GMT
set-cookie:
    personalization_id="v1_/3EYpbQnCe+vnjhnBUew=="; Expires=Sun, 12 Jan 2020 17:45:03 UTC; Path=/; Domain=.twitter.com
set-cookie:
    lang=en; Path=/
set-cookie:
    guest_id=v1%3A1515770330954116; Expires=Sun, 12 Jan 2020 17:45:03 UTC; Path=/; Domain=.twitter.com
x-rate-limit-reset:
    1515780003
content-disposition:
    attachment; filename=json.json

5
为什么这个问题被暂停了?它似乎是一个合法的问题,并且还有一个示例。这个问题是:为什么一个符合 RESTful 标准的 API 会发送 cookies? - John Baker
1
@John,你重新命名的标题听起来像一个好问题,但是以它当前的标题(和内容)来看,这个问题太具体化了,只限于Twitter - 如果你确定这是OP真正想要的,请随意编辑它,使其更加通用! - Simon MᶜKenzie
1个回答

18
一个RESTful API可以像提供HTML的普通Web应用程序一样发送cookie。使用cookie并不总是违反REST模式的。例如,服务器可能希望客户端记住某个状态,以便在稍后请求另一个资源时提供此状态。
但是,如果cookie旨在维护服务器上的客户端会话(例如Session Token),则REST API不应使用它们。这将违反REST端点的无状态性,因为服务器需要知道每个客户端的状态才能向其提供所请求的资源。
现在,你提到你特定的REST端点设置了跟踪cookie。这可能是完全有效的,因为跟踪ID可以视为应该持久化的客户端属性。该cookie可能不是服务器为了提供所请求的资源而必需的。
这也可能与StackExchange上的这个问题有关:Should Cookies be used in RESTful APIs?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接