很多人在看网页开发或者调试接口时,会看到 Set-Cookie 这个字段,心里就会打个问号:它到底是请求头还是响应头?特别是名字里带“cookie”,又出现在 HTTP 头里,很容易搞混。
Set-Cookie 实际上是响应头
Set-Cookie 不是请求头,而是服务器返回给浏览器的响应头。当用户登录网站、添加商品到购物车,或者进行其他需要保持状态的操作时,服务器为了记住这个用户,就会通过 Set-Cookie 告诉浏览器:“帮我存个数据,下次来记得带上”。
比如你登录一个论坛,服务器验证密码正确后,会在响应中加上:
Set-Cookie: session_id=abc123; Path=/; HttpOnly
浏览器收到这个头之后,就会把 session_id=abc123 存下来。之后每次你访问这个网站的页面,浏览器都会自动在请求头里加上:
Cookie: session_id=abc123
别被名字误导
虽然 Set-Cookie 听起来像是“设置 cookie”,像是客户端主动发起的动作,但它其实是服务端下发的指令。就像快递员给你一张回执单,让你下次见面时交还给他,这张单子是他给你的,不是你主动写的。
真正出现在请求头里的,是 Cookie 字段,而不是 Set-Cookie。你可以打开浏览器开发者工具的 Network 面板,随便刷个网页,点开某个请求,看到请求头里有 Cookie: 开头的内容,那就是浏览器自动附上的凭证。
常见误区
有些人抓包时发现请求里没有 Set-Cookie,就以为 cookie 没生效,其实是因为它只出现在响应中。你要找的是服务器返回的数据头,而不是浏览器发出的请求头。
举个生活化的例子:你去健身房办卡,前台给你一张会员卡(相当于 Set-Cookie),你把卡收好。下次进门时你出示这张卡(相当于请求头里的 Cookie),门卫才让你进去。发卡的动作发生在你离开柜台时,不是你进门时。