Cookie的简单认知

580 阅读3分钟

Cookie的产生原因

http协议是一种无状态协议,这就意味着在http协议下每次发送的请求都不能携带上一条请求的任何信息,服务器因此对于发送请求的客户端没有任何记忆。客户端就不得不重复做很多事情,比如每次网站都要问你用户名和密码。为了提高可用性和效率,cookie作为信息的携带者和记录者,充当了身份证和笔记本的作用。

作用机制

  1. 客户端发送请求
  2. 服务器记录客户端信息,生成Cookie
  3. 在响应头,即responseHeader中加入Set-Cookie,值为生成的cookie
  4. 客户端将cookie保存在本地,下次请求时在Header中带上Cookie属性,值为cookie的值

Rj3FEj.md.png

cookie本地如何存储

1. 本地文件位置及文件内容

各个浏览器存储机制不同,这里以Chrome为例

cookie已数据库文件形式存储在C:\Users\Administrator\AppData\Local\Google\Chrome\User Data\Default

Rjcmz8.png

该文件为Sqlite数据库文件,用SqLiteStudio打开,其表结构如下:

RjcayF.png

2.查看某个网站下的cookie

使用sql语句筛选某个网站下的cookie内容,每个name对应的value都以加密形式存储,字段为encrypted_value

RjgkXF.png

发送请求时,带上的cookie为:

Rjgl6O.png

值为 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

但是允许jscookie进行操作时可能存在跨站脚本攻击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 属性设置为StrictLax,允许服务器设定一则 cookie 不随着跨域请求一起发送,这样可以在一定程度上防范跨站请求伪造攻击(CSRF)