持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第1天,点击查看活动详情
什么是cookie?
MDN给出的定义是:
An HTTP cookie (web cookie, browser cookie) is a small piece of data that a server sends to a user's web browser.The browser may store the cookie and send it back to the same server with later requests.
简单来说,cookie是服务器发送到用户浏览器并会被保存在本地的一小块数据,它会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器上。cookie使无状态的http协议可以提供有状态的服务。
通常,cookie用在以下三个方面:
- 会话状态管理,例如登录状态、购物车等
- 个性化设置,例如用户自定义设置等
- 浏览器行为跟踪,例如跟踪分析用户行为等
创建cookie
服务器在响应报文使用Set-Cookie选项设置cookie,浏览器接收到响应报文后通常会将cookie保存下来,并在之后的请求报文中携带这些cookie。需要说明的是,cookie的过期时间、域、路径、有效期和适用站点都可以根据需要指定。
响应报文:
HTTP/1.0 200 OK
Content-type: text/html
Set-Cookie: yummy_cookie=choco
Set-Cookie: tasty_cookie=strawberry
Body
请求报文
GET /sample_page.html HTTP/2.0
Host: www.example.org
Cookie: yummy_cookie=choco; tasty_cookie=strawberry
cookie的生命周期
cookie的生命周期可以通过两种方式定义:
- session cookie(会话期cookie):浏览器关闭后自动删除,也就是说它仅在会话期有效。session cookie不需要指定Expires或者Max-Age。需要注意的是,有的浏览器提供了会话恢复功能,这种情况下即使关闭了浏览器,会话期 Cookie 也会被保留下来,就好像浏览器从来没有关闭一样,这会导致 Cookie 的生命周期无限期延长。
- permanent cookie(持久cookie):生命周期取决于过期时间(
Expires
)或有效期(Max-Age
)指定的一段时间。
example:
Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT;
cookie的作用域
Domain属性
Domain
指定了哪些主机可以接受 Cookie。如果不指定,默认为origin,不包含子域名。如果指定了Domain
,则一般包含子域名。
Path属性
Path
标识指定了主机下的哪些路径可以接受 Cookie(该 URL 路径必须存在于请求 URL 中)。以字符 %x2F
("/") 作为路径分隔符,子路径也会被匹配。
例如,设置 Path=/docs
,则以下地址都会匹配:
/docs
/docs/Web/
/docs/Web/HTTP
SameSite属性
SameSite
Cookie 允许服务器要求某个 cookie 在跨站请求时不会被发送。
SameSite 可以有下面三种值:
None
: 浏览器会在同站请求、跨站请求下继续发送 cookies,不区分大小写。Strict
: 浏览器将只在访问相同站点时发送 cookie。Lax
: 与Strict
类似,但用户从外部站点导航至 URL 时(例如通过链接)除外。