HTTP Cookie 机制

Cookie 机制

HTTP 是无状态的,也就是没有记忆能力,好在 HTTP 可以扩展,有了扩展,也就有了记忆能力,这里要说到Cookie 技术

Cookie 是什么

Cookie相当于服务器给浏览器的小纸条,上面写了只有服务器才可以理解的数据,需要客户端把这个信息发送给服务器,当服务器看到这张小纸条,就能认出发送请求的客户端是谁。

Cookie 的传输过程

Cookie 传输时需要用到两个HTTP 头部字段:响应头Set-Cookie 和 请求头Cookie

1.当用户第一次访问服务器的时候,服务器肯定不知道它的身份,于是服务器首先要创建一个 key=value 格式的身份标识数据,这就需要用到 Set-Cookie,然后通过这个响应头部字段,将键值对的数据发送给浏览器。

HTTP/1.0 200 OK
Content-type: text/html
Set-Cookie: theme=light
Set-Cookie: sessionToken=abc123; Expires=Wed, 09 Jun 2020 10:18:14 GMT
...

2.当浏览器收到响应报文后,发现响应报文中有 Set-Cookie 的字段,就将其保存下来,下次请求时自动将这个值放进 Cookie 头字段中发送给服务器。

GET /spec.html HTTP/1.1
Host: www.example.org
Cookie: theme=light; sessionToken=abc123

3.当服务器看到请求字段中含有 Cookie 字段时,就会认出这是之前来过的浏览器,识别出身份后,可以提供个性化服务。

之前我们说过,大多数 HTTP 头字段是不可以重复的,但是 Set-Cookie 除外,它可以一次性设置多个。这样就可以存储多个 key=value 格式的数据,浏览器发送时,只用一个 Cookie 字段,但是会用;隔开。

由于 Cookie 是浏览器保存的,所以换了浏览器还得重新走一遍 Cookie 的流程。

Cookie 的属性

Cookie是服务器委托浏览器存储在客户端的一些数据,而这些数据会识别用户的关键信息,所以就需要在 key=value以外再加上一些其他属性来保护。

生命周期

Cookie 的生命周期俗称为有效期,这里可以用到两个属性:Max-Age 和 Expires。

Max-Age 是相对时间,翻译过来是最大存在时间,它的单位是秒,也就是服务器收到 Cookie 并返回后,浏览器收到响应报文的时间再加上Max-Age 时间就是 Cookie 的有效时间。

Expires 是绝对时间,翻译就是过期时限,可以理解为截止日期。

它俩的写法是这样的

Set-Cookie:Max-Age=100;Expires=Fri,07-Jun-19 08:19:00 GMT;

意思是过期时间100秒,截止时间2019年6月7日8点19分,星期五。

两者可以同时存在,浏览器优先选择 Max-Age

作用域

作用域就是让浏览器不要随便发 Cookie,要发给特定的服务器和 URI。

Set-Cookie:Domain=www.baidu.com;path=/;

这个设置就比较简单,浏览器在带 Cookie 的时候,会去比较域名Domain和路径path 部分。如果不满足条件,就不会在请求头中发送Cookie

使用这两个属性可以分别在不同的路径发送不同的Cookie,比如/index/users路径分别发不同的Cookie,不过一般为了省事,会在 path 部分用一个/表示根目录下都发Cookie。

安全性

在 JavaScript 中,有一个读取 Cookie 的方法document.cookie,这可能造成安全隐患,造成 XSS 攻击(跨站脚本攻击)。

这时候可以使用 HttpOnly属性告诉浏览器,不允许使用 Javascript 访问。

还有一个属性,可以防止XSRF 攻击(跨站请求伪造),它就是SameSite=Strict,它可以严格规定Cookie 不能随着跳转链接跨站发送,SameSite=Lax则宽松一点,允许 GET/HEAD 发送 Cookie,但禁止POST发送。

浏览器Cookie 的查看方法

Cookie本身不是加密的,在浏览器中可以查看得到。

通过浏览器 Network-Cookies 和 Application都可以看到 Cookie。Application 则可以看到全站所有 Cookie。

image

image.png

Cookie 的应用

Cookie的基本作用是身份识别,保存用户的登录信息,实现会话事务。

比如,你用账号和密码登录某电商,登录成功后网站服务器就会发给浏览器一个 Cookie,内容大概是“name=yourid”,这样就成功地把身份标签贴在了你身上。

之后你在网站里随便访问哪件商品的页面,浏览器都会自动把Cookie 发给服务器,所以服务器总会知道你的身份,一方面免去了重复登录的麻烦,另一方面也能够自动记录你的浏览记录和购物下单(在后台数据库或者也用 Cookie),实现了“状态保持”。

Cookie 的另一个常见用途是广告跟踪。

你上网的时候肯定看过很多的广告图片,这些图片背后都是广告商网站(例如 Google),

它会“偷偷地”给你贴上 Cookie 小纸条,这样你上其他的网站,别的广告就能用 Cookie读出你的身份,然后做行为分析,再推给你广告。

小结

Cookie 是服务器委托浏览器存储的一些数据,让服务器有了
“记忆能力”;

响应报文使用 Set-Cookie 字段发送“key=value”形式的 Cookie 值;

请求报文里用 Cookie 字段发送多个 Cookie 值;

为了保护 Cookie,还要给它设置有效期、作用域等属性,常用的有 Max-Age、Expires、Domain、HttpOnly 等;

Cookie 最基本的用途是身份识别,实现有状态的会话事务。