Cookie

11 小时前
/ ,
1

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=strawberry

Cookie相比其他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):到期才删除。
    • Session:
      • “会话”是否存在由服务端决定(超时、主动注销、服务重启、存储淘汰等)。
      • 即使 Cookie 还在,Session 也可能已过期;反过来,Session 还在但客户端 Cookie 丢了,也会被视为新会话。

使用社交账号登录

  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...