Cookie的产生原因
http协议是一种无状态协议,这就意味着在http协议下每次发送的请求都不能携带上一条请求的任何信息,服务器因此对于发送请求的客户端没有任何记忆。客户端就不得不重复做很多事情,比如每次网站都要问你用户名和密码。为了提高可用性和效率,cookie作为信息的携带者和记录者,充当了身份证和笔记本的作用。
作用机制
- 客户端发送请求
- 服务器记录客户端信息,生成Cookie
- 在响应头,即
response
的Header
中加入Set-Cookie
,值为生成的cookie
值 - 客户端将
cookie
保存在本地,下次请求时在Header
中带上Cookie
属性,值为cookie
的值
cookie本地如何存储
1. 本地文件位置及文件内容
各个浏览器存储机制不同,这里以Chrome
为例
cookie
已数据库文件形式存储在C:\Users\Administrator\AppData\Local\Google\Chrome\User Data\Default
该文件为Sqlite
数据库文件,用SqLiteStudio
打开,其表结构如下:
2.查看某个网站下的cookie
使用sql
语句筛选某个网站下的cookie
内容,每个name
对应的value
都以加密形式存储,字段为encrypted_value
发送请求时,带上的cookie
为:
值为 key=value
的形式,这里key
对应表中的name
字段
此encrypted_value
加密方式通过CryptUnprotectData
加密,相关源码可参考这里
js操作cookie
使用Document.cookie
进行访问赋值。
document.cookie = "name=oeschger";
document.cookie = "favorite_food=tripe";
alert(document.cookie);
// 显示: name=oeschger;favorite_food=tripe
但是允许js
对cookie
进行操作时可能存在跨站脚本攻击XSS
风险。可以设置指令HttpOnly
来禁止js
访问cookie
。
可以通过navigator.cookieEnabled
判断本页面是否启用cookie
if (!navigator.cookieEnabled) {
// 浏览器不支持 cookie,或者用户禁用了 cookie。
}
Cookie的生命周期
Cookie 的生命周期可以通过两种方式定义:
- 会话期 Cookie 是最简单的 Cookie:浏览器关闭之后它会被自动删除,也就是说它仅在会话期内有效。会话期Cookie不需要指定过期时间(Expires)或者有效期(Max-Age)。需要注意的是,有些浏览器提供了会话恢复功能,这种情况下即使关闭了浏览器,会话期Cookie 也会被保留下来,就好像浏览器从来没有关闭一样,这会导致 Cookie 的生命周期无限期延长。
- 持久性 Cookie 的生命周期取决于过期时间(Expires)或有效期(Max-Age)指定的一段时间。
Cookie的作用域
- Domain属性
一级域名下设置的cookie
,其子域名都能获取到,如:
a.com
b.a.com // 能获取到 a.com 下的 Cookie
反之,子域名设置的cookie
,父级域名获取不到
- Path属性
与域名属性一样,父级路径的cookie
子路径也能匹配,反之多级路径的cookie
父级路径无法匹配
安全
1. 防跨站脚本攻击(XSS)
使用 HttpOnly
属性可防止通过 JavaScript
访问 cookie
值。
2. 防跨站请求伪造(CSRF)
用于敏感信息(例如指示身份验证)的 Cookie
的生存期应较短,并且 SameSite
属性设置为Strict
或 Lax
,允许服务器设定一则 cookie
不随着跨域请求一起发送,这样可以在一定程度上防范跨站请求伪造攻击(CSRF)