无状态的http协议
http是无状态的,这即是优点也是缺点。优点是服务器没有状态差异,可以很容易的组成集群。缺点是无法记录需要状态记录的事务操作。
HTTP 协议是可扩展的,后来发明的 Cookie 技术,给 HTTP 增加了“记忆能力”。
什么是cookie
cookie来源于计算机编程里的术语『magic cookie』,意思是不透明的数据。
Cookie 是服务器委托浏览器存储的一些数据,让服务器有了“记忆能力”;
早期的cookie直接就是磁盘上的一些小的文本文件,现在通常是以数据库记录的形式存放(一般是sqlite)。浏览器对cookie的 大小和数量也有限制,不允许无限存储,一般大小不超过4k。
cookie的工作过程
需要用到响应头字段:Set-Cookie和请求头字段Cookie
1、客户端第一次请求时,没有cookie信息,服务器收到后响应报文里返回cookie信息。在头字段Set-Cookie中以key-value键值对存储
2、客户端收到响应后,若Set-Cookie字段不为空,则将Cookie信息存在本地(一般是浏览器中),下一次请求时会将存储的Cookie信息放到头字段Cookie中发送给服务器,多个键值对中间用“;”隔开
3、服务器再一次收到请求后,通过Cookie字段就能识别出该次请求的身份信息
Cookie的属性
cookie的生存周期
Cookie 的有效期可以使用 Expires 和 Max-Age 两个属性来设置。
Expires:过期时间,是一个绝对时间点,截止日期
Max-Age:用的是相对时间,单位是秒,浏览器用收到报文的时间点再加上 Max-Age,就可以得到失效的绝对时间。
Expires 和 Max-Age 可以同时出现,两者的失效时间可以一致,也可以不一致,但浏览器会优先采用 Max-Age 计算失效期。
Cookie 的安全性
HttpOnly:属性“HttpOnly”会告诉浏览器,此 Cookie 只能通过浏览器 HTTP 协议传输,禁止其他方式访问,浏览器的 JS 引擎就会禁用 document.cookie 等一切相关的 API,脚本攻击也就无从谈起了。
SameSite:可以防范“跨站请求伪造”(XSRF)攻击,设置成“SameSite=Strict”可以严格限定 Cookie 不能随着跳转链接跨站发送,而“SameSite=Lax”则略宽松一点,允许 GET/HEAD 等安全方法,但禁止 POST 跨站发送。
Secure:表示这个 Cookie 仅能用 HTTPS 协议加密传输,明文的 HTTP 协议会禁止发送。但 Cookie 本身不是加密的,浏览器里还是以明文的形式存在。
cookie的应用
Cookie 最基本的一个用途就是身份识别,保存用户的登录信息,实现会话事务。
比如,你用账号和密码登录某电商,登录成功后网站服务器就会发给浏览器一个 Cookie,内容大概是“name=yourid”,这样就成功地把身份标签贴在了你身上。
之后你在网站里随便访问哪件商品的页面,浏览器都会自动把身份 Cookie 发给服务器,所以服务器总会知道你的身份,一方面免去了重复登录的麻烦,另一方面也能够自动记录你的浏览记录和购物下单(在后台数据库或者也用 Cookie),实现了“状态保持”。
Cookie 的另一个常见用途是广告跟踪。
网站的页面里会嵌入很多广告代码,里面就会访问广告商,在浏览器里存储广告商的cookie。
你换到其他网站,上面也有这个广告商的广告代码,因为都是一个广告商网站,自然就能够读取之前设置的cookie,也就获得了你的信息。
比如 某个网站插入了谷歌的广告,用户加载谷歌广告后(访问的是谷歌的服务器,自然下发了谷歌的cookie), 那么下次用户去其他有谷歌广告的网站上网,这次请求广告会带上之前谷歌的cookie, 谷歌就可以根据这个cookie中的信息来推荐广告给用户
cookie的缺点
(1) 不安全。如果被中间人获取到 Cookie,完全将它作为用户凭证冒充用户。解决方案是使用 https 进行加密。
(2)有数量和大小限制。另外 Cookie 太大也不好,传输的数据会变大。
(3)客户端可能不会保存 Cookie。比如用 telnet 收发数据,用户禁用浏览器 Cookie 保存功能的情况。
问答
1、如果 Cookie 的 Max-Age 属性设置为 0,会有什么效果呢?
答:如果 Max-Age 设置为0,浏览器中该 Cookie 失效,即便这个 Cookie 已存在于浏览器中,且尚未过期。另外 Web 应用开发中,可以通过这种方式消除掉用户的登陆状态,此外记得在服务器的 session 中移除该 cookie 和其对应的用户信息。
2、Max-age:-1 的时候会永久有效吧 ?
答:rfc里有说明,如果max-age <=0,统一按0算,立即过期。
3、既然max-age=0会立即失效,那不就等于无记忆了?那干嘛还用cookie?
答:max-age=0是指不能缓存,但在会话期间是可用的,浏览器会话关闭之前可以用cookie记录用户的信息。