会话跟踪技术之Cookie
Cookie介绍
背景
HTTP
协议是无状态协议,无状态是指每次request
请求之前是相互独立的,当前请求并不会记录它的上一次请求信息
- 问题:既然无状态,那完成一套完整的业务逻辑,需要发送多次请求,那么怎么标识这些请求都是同一个浏览器操作呢?
解决方案
- 当浏览器发送
request
请求到服务器,服务器除了返回请求的response
之外,还给请求分配一个唯一标识ID
和response
一并返回给浏览器
- 服务器在本地创建一个
map
结构,专门以key-value
存储这个ID标识和浏览器的关系
- 当浏览器第一次请求后已经分配一个
ID
,当第二次访问时会自动带上这个标识ID
,服务会获取这个标识ID
去map
里面找上一次request
的信息状态且做对应的更新操作;服务端生成这个全局的唯一标识,传递给客户端用于标记这次请求就是Cookie
;服务器创建的那个map
结构就是Session
cookies
由服务端生成,用于标记客户端的唯一标识,在每次网络请求中,都会被传送
Session
服务端自己维护的一个map
数据结构,记录key-Object
上下文内容状态
- 核心:它用于告知服务端两个请求是否来自同一浏览器,如保持用户的登录状态。
Cookie
使基于无状态的HTTP
协议记录稳定的状态信息成为了可能;浏览器查看多个站点的cookie
cookie的属性
Name
:名称
-Value
:值
Domain
:表示当前cookie所属于哪个域或子域下面
Expires/Max-age
:表示cookie的有效期,是一个时间,过了这个时间,该cookie就失效了
Path
:表示cookie的所属路径
size
:大小,多数浏览器都是4000多个字节
http-only
:表示这个cookie
不能被客户端使用js读取到,是不公开的cookie
(Chrom
调试器的console
中输入document.cookie
将得不到标记为HttpOnly
的字段)
-Secure
:标记为Secure
的Cookie
只应通过被HTTPS
协议加密过的请求发送给服务端,从Chrom52和Firefox52开始,不安全的站点(http:)无法使用Cookie的Secure标记
Cookie的缺陷
Cookie
会被附加在每个HTTP
请求中,增加了流量
- 在
HTTP
请求中的cookie
是明文传递的,所以安全性成问题,除非用HTTPS
Cookie
的大小是有限制,对于复杂的存储需求来说不满足
Cookie
泄露。。。
浏览器允许每个域名所包含的cookie数量
- 多数浏览器允许最多包含50个,部分浏览器是30或者20
- 满后会有多种剔除策略,比如
LRU
(最近最少使用),权重等
Cookie现状
一张图?