HTTP cookie格式与约束

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,故对于复杂的存储需求来说是不够用的

猜你喜欢

转载自blog.csdn.net/qq_34556414/article/details/129163404