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)