什么是cookie?
cookie的英文原意是小饼干
是为了应对HTTP是无状态协议这一特性而创造出来的方法,用于在客户端保留信息并在下次请求传回服务器
服务器响应(response)的http报文中可以添加set-cookie字段, 通过设置该字段中的属性可以控制客户端存储cookie信息
存有cookie信息的客户端会在后续请求(request)中加入cookie字段
cookie中的属性
除键值对外都不是必填项,各属性之间通过一个分号和一个空格隔开
"key=value; expires=Thu, 25 Feb 2016 04:18:00 GMT; domain=ppsc.sankuai.com; path=/; secure; HttpOnly"
- key=value
cookie键值对(必需项) - expires=DATE
cookie的有效期(默认为浏览器关闭为止)
必须是GMT格式的时间
expires 是 http/1.0协议中的选项,在新的http/1.1协议中expires已经由 max-age 选项代替,两者的作用都是限制cookie 的有效时间。expires的值是一个时间点(cookie失效时刻= expires),而max-age 的值是一个以秒为单位时间段(cookie失效时刻= 创建时刻+ max-age)。
另外,max-age 的默认值是 -1(即有效期为 session );若max-age有三种可能值:负数、0、正数。负数:有效期session;0:删除cookie;正数:有效期为创建时刻+ max-age
- path=路径
用于限制cookie的发送范围的文件目录(若不指定则默认为文档所在的文件目录) - domain=域名
指定cookie适用对象的域名(若不指定则默认为创建cookie的服务器的域名)
eg: Set-Cookie: name=value;secure
上例仅在使用HTTPS的情况下才进行cookie的回收
特别说明1:发生跨域xhr请求时,即使请求URL的域名和路径都满足 cookie 的 domain 和 path,默认情况下cookie也不会自动被添加到请求头部中。若想知道原因请阅读本文最后一节)
特别说明2:domain是可以设置为页面本身的域名(本域),或页面本身域名的父域,但不能是公共后缀 public suffix。举例说明下:如果页面域名为 www.baidu.com, domain可以设置为“www.baidu.com”,也可以设置为“baidu.com”,但不能设置为“.com”或“com”。
- secure
用于限制cookie在HTTPS安全链接下使用 - HttpOnly?
作用是使JavaScript脚本无法获得cookie,防止XSS对cookie的信息窃取
添加了HttpOnly这条属性后,js中的document.cookie无法取到cookie值
在服务端设置cookie
在response header的set-cookie字段设置, 每个字段对应一个cookie, 存储格式为字符串
在服务端可以设置cookie的全部6个属性
在客户端设置cookie
使用document.cookie
document.cookie = "name=Micheal; max-age=3600; "
客户端无法设置HttpOnly属性
什么样的数据适合放在cookie中?
存储在cookie中的数据,每次都会被浏览器自动放在http请求中,如果这些数据并不是每个请求都需要发给服务端的数据,浏览器这设置自动处理无疑增加了网络开销;但如果这些数据是每个请求都需要发给服务端的数据(比如身份认证信息),浏览器这设置自动处理就大大免去了重复添加操作。所以对于那设置“每次请求都要携带的信息(最典型的就是身份认证信息)”就特别适合放在cookie中,其他类型的数据就不适合了。
注意:
1.每个域名下的cookie最大为4kb, 每个域名下最多有20条cookie(不同的浏览器厂商可能会有所区别)