cookie是前端编程当中经常要使用到的概念,我们可以使用cookie利用浏览器来存放用户的状态信息保存用户做了一些什么事情。
session是服务器端维护的状态。session又是如何和cookie关联起来。
后面介绍cookie和session的使用。
Cookie 是什么?
RFC6265, HTTP State Management Mechanism
保存在客户端(由服务器生成)、由浏览器维护、表示应用状态HTTP 头部(表明用户做了一些什么样的事情)
• 存放在内存或者磁盘中
• 服务器端生成 Cookie 在响应中通过Set-Cookie 头部告知客户端(允许多个 Set-Cookie 头部传递多个值)服务端生成了cookie是通过响应来返回的
• 客户端得到 Cookie 后,后续请求都会自动将 Cookie 头部携带至请求中
client端第一次访问是没有cookie的,server会在响应头部set-cookie中去传递一个key value给我们的客户端。客户端收到了这样key-value会保存在浏览器当中。当然可以传递多个set-cookie字段,每个字段后面都有key value。
客户端得到了cookie之后,后续的请求,只要访问这个域名下面所有的请求都会自动的将收到的cookie的key value携带进来。以cookie头部方式传递给server。
Cookie 与 Set-Cookie头部的定义
• Cookie 头部中可以存放多个 name/value 名值对
• cookie-header = "Cookie:" OWS cookie-string OWS
• cookie-string = cookie-pair *( ";" SP cookie-pair ) 可以有多个cookie pair,多个是以,进行分割的
• cookie-pair = cookie-name "=" cookie-value 每个以key/value的形式
浏览器保存了cookie-pair,在发送请求的时候就会将cookie发送出去了。可能有多个set-cookie头部,但是只有一个cookie头部就可以了,因为cookie可以存放多个cookie-pair。
• Set-Cookie 头部一次只能传递 1 个 name/value 名值对,响应中可以含多个头部
• set-cookie-header = "Set-Cookie:" SP set-cookie-string 所有头部这块都一样
• set-cookie-string = cookie-pair *( ";" SP cookie-av )
• cookie-pair = cookie-name "=" cookie-value
• cookie-av:描述 cookie-pair 的可选属性 属性可以有0个或者多个,属性之间以分号作为分隔。
每个set-cookie头部对应的就是一个或者多个cookie pair。
在请求当中的cookie带入了很多键值对,之前响应当中的cookie也带入到请求当中了。
Set-Cookie 中描述 cookie-pair 的属性
cookie-av = expires-av / max-age-av / domain-av / path-av / secure-av / httponly-av / extension-av
• expires-av = "Expires= " sane-cookie-date(这个cookie可以使用多久,会明确指定一个日期,超过这个时间点之后,这个cookie就作废,这样就要求浏览器将这个cookie清除掉)
• cookie 到日期 sane-cookie-date 后失效
• max-age-av = "Max-Age= " non-zero-digit *DIGIT(以定时器的方式告诉浏览器,经过多少秒以后,)
• cookie 经过 *DIGIT 秒后失效。max-age 优先级高于 expires
• domain-av = "Domain= " domain-value
• 指定 cookie 可用于哪些域名,默认可以访问当前域名(访问某些页面才能使用这个cookie)
• path-av = "Path= " path-value
• 指定 Path 路径下才能使用 cookie
• secure-av = "Secure“
• 只有使用 TLS/SSL 协议(https)时才能使用 cookie
• httponly-av = "HttpOnly“
• 不能使用 JavaScript(Document.cookie 、XMLHttpRequest 、Request APIs)访问到 cookie
第一个set-cookie,他的cookie属性path描述的很清楚,这里都可以使用cookie,因为使用的是根路径。
只有访问这个路径的url才能去使用key value。httponly.......
Cookie 使用的限制
• RFC 规范对浏览器使用 Cookie 的要求
• 每条 Cookie 的长度(包括 name、value 以及描述的属性等总长度)至于要达到 4KB
• 每个域名下至少支持 50 个 Cookie
• 至少要支持 3000 个 Cookie
• 代理服务器传递 Cookie 时会有限制
在代理服务器传输cookie的时候,也会有限制,因为cookie是放在HTTP头部的,很多代理服务器会限制HTTP头部为4k 8k,像nginx默认支持32k。
所以生成cookie的origin server应当尽量减少每个cookie的大小。
在rest架构当中,会有很多厂商的浏览器,这些浏览器会以很多不同的版本同时出现。
Cookie 在协议设计上的问题
• Cookie 会被附加在每个 HTTP 请求中,所以无形中增加了流量
• 由于在 HTTP 请求中的 Cookie 是明文传递的,所以安全性成问题(除非用 HTTPS)
• Cookie 的大小不应超过 4KB,故对于复杂的存储需求来说是不够用的