cookie
HTTP 协议是一种无状态协议,即每次服务端接收到客户端的请求时,都是一个全新的请求,服务器并不知道客户端的历史请求记录;Session 和 Cookie 的主要目的就是为了弥补 HTTP 的无状态特性。
大纲
- cookied的概念
- cookie的应用场景
- cookie的分类
- cookie的内容
- cookie的弊端
cookie概念
- cookie是存储在客户端本地的文本文件中的一些数据
- cookie是由服务器产生,之后发送刚给浏览器,然后由浏览器保存在客户端的某个文本文件里,下次请求同一网站浏览器会携带该cookie给服务器(前提是浏览器必须启用cookie)
- cookie的存储形式:键值对 >> key=value
image.png
cookie的应用场景
当web服务器向客户端浏览器发送web页面时,在关闭连接后,服务器不会记住客户端的用户信息;
cookie的作用就是解决:服务端如何记录客户端的用户信息
当用户访问web页面时,将用户身份记录在cookie中;
用户在下一次访问页面时候,可以在cookie中获取到用户访问记录
实际场景:登录页面记住密码功能
image.png
cookie的分类
1.会话cookie
会话cookie指的是:没有设置过期时间的cookie
浏览器打开到关闭就是一次会话,当关闭浏览器时,会话cookie就会随着浏览器的关闭而销毁;会话cookie不存储在硬盘上而是保存在内存里,当然这种行为是并不是规范规定的
2.持久cookie
持久cookie指的是:设置了过期时间的cookie
浏览器打开之后,设置了过期时间的cookie就会保存到硬盘上;浏览器关闭之后再打开,cookie依然有效直至超过设置的过期时间。
- 存储在硬盘上的cookie可以在不同的浏览器进程间共享,比如两个IE窗口。
- 保存在内存的cookie,不同的浏览器有不同的处理方式。
cookie的内容
服务器发送给浏览器的相关内容如下:
Set-Cookie:
cookie_user_token=C5CBD6FBD0DA0EE4B5DC36E7075D8CDA;
Expires=Thu, 06-Jul-2017 09:17:46 GMT;
domain= 119.29.100.135;
Path=/;
HttpOnly
name: cookie的名字 >> cookie_user_token
#属性由程序设定,默认值是空引用。Cookie一旦创建,名称便不可更改
value: cookie的值 >> C5CBD6FBD0DA0EE4B5DC36E7075D8CDA
#属性由程序设定,默认值是空引用。
#如果值为Unicode字符,需要为字符编码。如果值为二进制数据,则需要使用BASE64编码
domain: 域名,就是说这个Cookie对应哪一个域名有效
#默认值为当前URL的域名部分,不管发出这个Cookie的页面在哪个目录下的;也可以由程序设置此属性为需要的值
#如果我们想让 www.china.com能够访问bbs.china.com设置的Cookie,该怎么办?
#我们可以把domain属性设置成“.china.com”,并把path属性设置成“/”。
#Cookie具有不可跨域名性。即浏览器访问百度不会带上谷歌的Cookie;Cookie在客户端是由浏览器来管理的。
#浏览器能够保证Google只会操作Google的Cookie而不会操作Baidu的Cookie,从而保证用户的隐私安全。
#判断依据就是域名。
path:路径,默认值是根目录 >> "/"
#路径与域一起构成Cookie的作用范围
expires:cookie的有效期
HttpOnly 属性:安全方面的属性
#将一个Cookie设置为HttpOnly后,通过Javascript脚本将无法读取到Cookie信息,
#这能有效地防止黑客用XSS 发起攻击;一般来说,跟登录相关的 Cookie 必须设置为 HttpOnly
cookie的缺陷
1.数量受到限制
一个浏览器最多能创建300个cookie,并且每个cookie不超过4kb,很多浏览器都限制一个站点最多只能保存20个cookie
2.安全性无法保障
通常跨站点脚本攻击往往利用网站漏洞在网页中植入脚本代码,或网站页面引用第三方脚本代码,均存在跨站点脚本攻击的可能,在收到跨站脚本攻击时,脚本指令将会读取该站点所有的cookie内容(已不存在cookie作用域的限制),然后通过某种方式讲cookie的内容提交到指定的服务器,一旦cookie内容落入到攻击者手中,将会重现其价值
3.浏览器禁用cookie
- 浏览器禁用cookie后,将无法使用cookie,无法享受cookie带来的便利
- 浏览器对cookie有限制,不能手动设置cookie,对于混合嵌套的开发有问题,比如小程序跳转H5页面,不能携带cookie
- 浏览器对单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie