Cookie的定义和作用:
Cookie 是服务端发送到客户端浏览器并保存在本地的一小块数据,它会被客户端浏览器在下次向同一服务端发请求时携带并发送到服务端。
Cookie通常用于告知服务端两个请求是否来自于同一客户端浏览器。
Cookie主要用于三个方面:
- 会话状态管理(如用户登录状态、购物车、游戏分数或其它需要记录的信息)
- 个性化设置(如用户自定义设置、主题等)
- 浏览器行为跟踪(如跟踪分析用户行为等)
浏览器查看Cookie的方法:
Cookie的创建:
Cookie一般由服务端通过设置HTTP响应头Set-Cookie创建:
Set-Cookie: <cookie名>=<cookie值>
一个服务端设置了Cookie的响应头示例:
HTTP/1.0 200 OK
Content-type: text/html
Set-Cookie: test_cookie=lynn
Set-Cookie: demo_cookie=hello
[页面内容...]
此后,浏览器对该服务端发起的每一次新请求,需要通过HTTP请求头Cookie将保存的Cookie信息再发送给服务端。
GET /test.html HTTP/1.0
Host: www.example.com
Cookie: test_cookie=lynn; demo_cookie=hello
Cookie的生命周期:
两种方式定义Cookie的生命周期:
- 会话期 Cookie:浏览器关闭之后它会被自动删除,也就是说它仅在会话期内有效。会话期Cookie不需要指定过期时间(
Expires
)或者有效期(Max-Age
)。需要注意的是,有些浏览器提供了会话恢复功能,这种情况下即使关闭了浏览器,会话期Cookie 也会被保留下来,就好像浏览器从来没有关闭一样,这会导致 Cookie 的生命周期无限期延长。 - 持久性 Cookie:取决于过期时间(
Expires
)或有效期(Max-Age
)指定的一段时间。
Expires和Max-Age的区别
含义:
Expires
:为 Cookie 的删除设置一个过期的日期(如:Wed, 21 Oct 2015 07:28:00 GMT)。Max-Age
: 设置一个 Cookie 将要过期的秒数。
版本:
Expires
参数是当年网景公司推出 Cookies 原有的一部分。在 HTTP1.1
中,Expires
被弃用并且被更加易用的 Max-Age
所替代。
优先级:
同时设置了Expires
和Max-Age
,所有支持Max-Age
的浏览器会忽略 Expires
的值,只有 IE(ie6、ie7 和 ie8) 例外,IE(ie6、ie7 和 ie8)会忽略 Max-Age
只支持Expires
。
Cookie的所有属性:
Name=Value
:cookie的名称和值Domain
:Domain 指定了哪些主机可以接受 Cookie。如果不指定,默认为 origin,不包含子域名。如果指定了Domain,则一般包含子域名。因此,指定 Domain 比省略它的限制要少Path
:指定了主机下的哪些路径可以接受 Cookie(该 URL 路径必须存在于请求 URL 中)。以字符 %x2F ("/") 作为路径分隔符,子路径也会被匹配。Expires
:设置Cookie过期的时间戳,格式为GMT。Max-Age
:设置Cookie 将要过期的秒数。HttpOnly
:加以限制,禁止JavaScript脚本例如通过Document.cookie属性访问cookie。主要为了防止XSS攻击。Secure
:Cookie仅在使用该https:方案发出请求时才发送到服务器(本地主机除外),因此更能抵抗 中间人 攻击。SameSite
:用来限制第三方 Cookie,从而减少安全风险。主要有三个值:-
Strict
最为严格,完全禁止第三方 Cookie,跨站点时,任何情况下都不会发送 Cookie。 -
Lax
规则稍稍放宽,大多数情况也是不发送第三方 Cookie,但是导航到目标网址的 Get 请求除外。
-
None
:Chrome 计划将Lax变为默认设置。这时,网站可以选择显式关闭SameSite属性,将其设为None。不过,前提是必须同时设置Secure属性(Cookie 只能通过 HTTPS 协议发送),否则无效。
-