- HTTP是一个无状态的协议
- Cookie的存在是为了解决客户端与服务端会话状态的问题,这个状态指后端服务的状态而非通讯协议的状态
- Cookie是指某些网站为了辨别用户身份儿储存在用户本地终端上的数据
Cookie的设置
- 客户端向服务器发送HTTP请求
- 服务器收到HTTP请求时,在响应头里面添加一个Set-Cookie字段
- 浏览器收到响应后保存下Cookie
- 之后的浏览器发送每一次请求,服务器都会通过Cookie字段将存储的Cookie信息发送给服务器
Cookie的一些属性 - Expires用来设置Cookie的过期时间
- 当Expires属性缺少时或值为Session代表是会话性Cookie,值保存在客户端内存中,当浏览器关闭时失效
- 相对于会话Cookie而言的时持久性Cookie,值保存在用户的硬盘中,直到过期或主动清除才会失效
- Max-Age用来设置在Cookie失效前需要经过的秒数
- Max-Age可以为正数、负数、0
- 正数代表浏览器会将其持久化,即写到对应的Cookie文件中
- 负数代表Cookie是一个会话性Cookie
- 0代表会立即删除这个Cookie
- 当Expires和Max-Age同时存在,Max-Age优先级更高
- Domain指定了Cookie可以送达的主机名
- 不能跨域设置Cookie
- Path指定了一个URL路径
- 这个路径必须出现在要请求的资源的路径中才可以发送Cookie首部
- Domain和Path表示共同定义了Cookie的作用域,即Cookie应该发送给哪些URL
- Secure属性
- 标记为Secure的Cookie只应通过被HTTPS协议加密过的请求发送给服务端
- 可以保护 Cookie 在浏览器和 Web 服务器间的传输过程中不被窃取和篡改。
- HTTPOnly
- 设置HTTPOnly属性可以防止客户端脚本通过document.cookie等方式访问Cookie,有助于避免XSS攻击
- SameSite
- Chrome80版本默认屏蔽了第三方的Cookie,SameSite属性可以让Cookie在跨站请求时不会被发送,从而可以阻止跨站请求伪造攻击(CSRF)
- SameSite 可以有下面三种值
- Strict 仅允许一方请求携带 Cookie,即浏览器将只发送相同站点请求的 Cookie,即当前网页 URL 与请求目标 URL 完全一致。
- Lax 允许部分第三方请求携带 Cookie
- None 无论是否跨站都会发送 Cookie
之前默认是 None 的,Chrome80 后默认是 Lax
跨站和跨域
- 跨站(Cross-site)/同站(same-site)=== 第三方(third-party)/第一方(first-party)
- 同源策略(SOP)中的同源(same-origin)/跨域(cross-origins)
- 同源策略的同源是指2个URL的协议/主机名/端口一致
- TLD(Top-Level-Domain)顶级域名
- eTLD(effective Top-Level-Domain)有效顶级域名,注册在Mozilla维护的公共后缀列表(Public Suffix List)中
- eTLD+1:有效顶级域名+二级域名,来判断是否是一个站点,只要2个URL的eTLD+1相同就是【同站】
Cookie的作用 - 会话状态管理(用户登录状态、购物车、游戏分数或其他需要记录的信息)
- 个性化设置(用户自定义设置、主题)
- 浏览器行为跟踪
Cookie的缺点 - 大小、安全、增加请求大小等方面