Cookie
HTTP Cookie 是服务器发送到用户浏览器并保存在本地的一小块数据。浏览器会存储 cookie 并在下次向同一服务器再发起请求时携带并发送到服务器上。通常,它用于告知服务端两个请求是否来自同一浏览器。Cookie 使基于无状态的 HTTP 协议记录稳定的状态信息成为了可能.
创建Cookie:
服务器收到 HTTP 请求后,服务器可以在响应标头里面添加一个或多个 Set-Cookie 选项。浏览器收到响应后通常会保存下 Cookie,并将其放在 Cookie 标头内。
Set-Cookie: <cookie-name>=<cookie-value>
Set-Cookie: <cookie-name>=<cookie-value>; Domain=<domain-value>
Set-Cookie: <cookie-name>=<cookie-value>; Expires=<date>
Set-Cookie: <cookie-name>=<cookie-value>; HttpOnly
Set-Cookie: <cookie-name>=<cookie-value>; Max-Age=<number>
Set-Cookie: <cookie-name>=<cookie-value>; Partitioned
Set-Cookie: <cookie-name>=<cookie-value>; Path=<path-value>
Set-Cookie: <cookie-name>=<cookie-value>; Secure
Set-Cookie: <cookie-name>=<cookie-value>; SameSite=Strict
Set-Cookie: <cookie-name>=<cookie-value>; SameSite=Lax
Set-Cookie: <cookie-name>=<cookie-value>; SameSite=None; Secure
// 可以同时有多个属性,例如:
Set-Cookie: <cookie-name>=<cookie-value>; Domain=<domain-value>; Secure; HttpOnly服务器发送标头告知客户端存储一对 cookie:
HTTP/1.0 200 OK
Content-type: text/html
Set-Cookie: yummy_cookie=choco
Set-Cookie: tasty_cookie=strawberry
[页面内容]现在,对该服务器发起的每一次新请求,浏览器都会将之前保存的 Cookie 信息通过 Cookie 请求头部再发送给服务器。
GET /sample_page.html HTTP/1.1
Host: www.example.org
Cookie: yummy_cookie=choco; tasty_cookie=strawberryCookie相比其他web存储技术
- 由于服务器指定 Cookie 后,浏览器的每次请求都会携带 Cookie 数据,会带来额外的性能开销。新的浏览器 API 已经允许开发者直接将数据存储到本地,如使用
Web storage API(localStorage 和 sessionStorage)或IndexedDB - Cookie 自动、不可撤回地随 HTTP 往返,正是它的核心能力,也是性能负担; Web Storage 家族只留本地、不发网络,给了前端完全可控的读写与传输权——这是二者最根本的取舍点。
Cookie与Session对比
Session(会话)这个概念存在于服务端,是为了服务器为了认出,连续多次请求来自同一个客户端而维护的一块服务端状态。当客户端首次连接,服务器会生成全局唯一的Session ID,服务器把此ID通过
Set-Cookie:sessionId=xxx交付给浏览器,也可以放在URL或Authorization标头,之后浏览器每次请求都会携带这个ID。存储位置
- Cookie:存储在浏览器(客户端)。
- Session:存储在服务端,客户端通常只保存一个指向它的标识。
传输方式与开销
- Cookie:跟随每次 HTTP 往返发送,天然有带宽/性能开销。
- Session:如果用 Cookie 传
sessionId,则网络开销主要是这个 id;真正的数据在服务端,不随请求反复传输。
生命周期
- Cookie:
- 会话 Cookie(不设置
Expires/Max-Age):通常随浏览器进程结束而消失。 - 持久化 Cookie(设置了
Expires/Max-Age):到期才删除。
- 会话 Cookie(不设置
- Session:
- “会话”是否存在由服务端决定(超时、主动注销、服务重启、存储淘汰等)。
- 即使 Cookie 还在,Session 也可能已过期;反过来,Session 还在但客户端 Cookie 丢了,也会被视为新会话。
- Cookie: