RESTful API为何在响应中发送Cookie?附Twitter客户端警告案例
遇到的问题
前阵子我调用Twitter API的时候,客户端抛出了一个Cookie相关的警告,先给大家贴一下这个异常信息:
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
排查后确认Cookie格式本身是正确的,问题出在HTTP客户端的配置上,但这个小插曲让我产生了一个核心疑问:RESTful API为什么要返回Set-Cookie响应头?
从Twitter返回的响应节选来看,这些Cookie大多是跟踪类的(比如guest_id、personalization_id),我很好奇它们在RESTful场景下的作用:
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
是Twitter希望这些Cookie被浏览器的XMLHttpRequest(而非服务端调用)接收并保存?还是他们误把通用的Set-Cookie过滤器应用到了API端点上?这个问题其实不局限于Twitter,而是适用于所有返回Cookie的RESTful API。
针对RESTful API中Cookie作用的解析
其实RESTful设计原则里并没有严格禁止使用Cookie,只是早期REST理念更倾向于无状态(stateless),而Cookie常被用来维持会话状态,所以容易被误解为不符合REST规范,但实际场景中Cookie的用途远不止会话管理:
- 用户跟踪与个性化:像Twitter的
guest_id、personalization_id这类Cookie,主要是用来识别未登录用户,记录他们的浏览偏好、行为轨迹,从而提供个性化内容推荐,或者做用户行为分析。这类Cookie不管请求来自浏览器XHR还是服务端调用,都会被返回,但服务端调用通常不会主动保存这些Cookie,而浏览器则会自动存储并在后续请求中携带。 - 跨场景兼容:很多API平台同时支持浏览器端(比如前端通过XHR/fetch调用)和服务端调用。为了统一处理逻辑,他们可能会把针对浏览器端的Cookie逻辑直接复用在API端点上,即使服务端调用用不到这些Cookie。这种情况不一定是“误配置”,而是为了减少代码分支,统一响应处理流程。
- 功能性偏好存储:比如
lang这类Cookie,用来记录用户的语言偏好,属于功能性Cookie,能让API返回对应语言的内容,提升不同场景下的用户体验。 - 速率限制补充:虽然Twitter已经用
x-rate-limit-*头做速率限制,但结合Cookie跟踪用户(即使是匿名用户),可以更精准地控制单个用户/设备的请求频率,防止恶意爬虫或API滥用。
总结
RESTful API返回Cookie并不一定违反设计原则,关键看Cookie的用途。对于Twitter这类平台来说,返回跟踪类Cookie主要是为了实现用户个性化和行为分析,同时兼容浏览器端的调用场景。如果是服务端调用API,完全可以忽略这些Cookie,或者配置客户端不处理它们(这也是我之前遇到警告的原因——客户端默认尝试解析所有Cookie,但配置上对过期时间格式的处理有问题)。
内容的提问来源于stack exchange,提问作者Bozho

