HTTP基础之Cookie

一般来说,了解一样东西的流程是这样的

  • 是什么
  • 长啥样
  • 有啥用
  • 怎么用
  • 优点
  • 缺点

按照这个逻辑,概览如下

  • 是什么 -> Cookie(复数形态 Cookies ),中文名称为“小型文本文件”或“小甜饼”
  • 长啥样 -> 打开你的浏览器,访问 谷爹,在 console 中执行 document.cookie :) 就是它!
  • 有啥用 -> 网站用它在客户端(浏览器)存储少量信息
  • 怎么用 -> 通过 HTTP 请求头附带 or 前端 js 操作
  • 优点 -> 简单、全浏览器支持
  • 缺点 -> 能存的数据非常少;明文传输不安全;每次 HTTP 请求都会发送,增大了流量;且这玩意是纯文本字符串,js 操作非常不便

详解

引自维基百科

Cookie(复数形态 Cookies ),中文名称为“小型文本文件”或“小甜饼”,指某些网站为了辨别用户身份而储存在用户本地终端(Client Side)上的数据(通常经过加密)。定义于RFC2109。是网景公司的前雇员卢·蒙特利在1993年3月的发明。

试想以下情形
1. 登陆某网站时,每次都需要输入用户名、密码,严重影响用户体验,怎么实现类似“下次自动登陆”的功能?
2. 某电商网站买东西,在购物车中加入了一样商品,再去其它商品页面时发现购物车内还能够显示前一件商品,怎么做到的?

由于 HTTP 协议是无状态的,服务器并不知道用户上一次做了什么,所以上述两个需求的实现只能通过额外手段,即存储信息的方式来实现,于是我们的 Cookie 就闪耀登场了

使用 Cookie 解决以上问题
1. 用户第一次登陆时,服务器返回一个登陆凭证(一般需加密且设置过期时间)给客户端,客户端保存该 Cookie 凭证,以后访问这个网站时,直接把该凭证发给服务器,若凭证有效,即通过验证进入网站
2. 将商品加入购物车时,服务器在向用户发送网页时候也会发送一段保存用户已选购商品的 Cookie 给客户端,当用户浏览其他商品页面的时候,客户端把 Cookie 又发给服务器,这样服务器就知道用户上次选购了什么商品,实现了购物车功能

按照 Cookie 的存储位置

  • 内存 Cookie -> 由浏览器维护,关闭浏览器即消失
  • 硬盘 Cookie -> 存储在硬盘文件中,只有过期或用户手动清理时才会被删除

所以按照存储时间分为

  • 非持久 Cookie
  • 持久 Cookie

首先,Cookie 作为存储数据的一种方案,最重要的当然是 namevalue,而在一些比较复杂的场景中,只有这两个属性就远远不够了

expires/max-age

指定 Cookie 的生存期,默认情况下 Cookie 是暂时存在的,关闭浏览器即失效,即值为 session。如果想让 Cookie 长期存在,则需要指定 expire 属性的值,即 未来的一个用毫秒数表示的过期日期或时间点
而 expire 属性现在已被 max-age 属性代替,max-age 用秒来设置 Cookie 的生存期

如果 max-age 为正数,则表示该 Cookie 会在 max-age 秒后失效。浏览器会将 max-age 为正数的 Cookie 持久化,写到对应的 Cookie 文件中。无论用户是否关闭浏览器,只要还未过期,则一直存在

如果 max-age 为负数,则表示该 Cookie 仅在本浏览器窗口和本窗口打开得子窗口有效,关闭窗口即失效, Cookie 默认的 max-age 值为 -1

如果 max-age 为 0,则表示删除 Cookie,由于 Cookie 机制没有提供删除 Cookie 的方法,因此通过设置该值实现即时失效删除 Cookie 的效果,浏览器会将 max-age 为 0 的 Cookie 删除

domain

domain 属性可以让多个 web 服务器共享 Cookie,默认是创建 Cookie 的网页所在服务器的主机名,不能将 Cookie 的 domain 设置成服务器所在的域之外的域

path

指定和 Cookie 关联的网页,默认值为 / ,即与创建该 Cookie 的网页同目录和该目录子目录下的网页关联

secure

一个 Bool 值,指定是否以安全模式传输。默认是不安全的。当为 True 时,该 Cookie 只有以 HTTPS 连接时才会传输

HttpOnly

如果设置了 HttpOnly 属性,那么通过程序(js 或 Applet等)将无法读取 Cookie 信息

SameSite

非常新的一个属性,这个属性用途是缓解 CSRF 攻击,有两个属性值 laxstrict,前者只对比较危险的 HTTP 请求(比如 POST)进行限制,不允许发送 cookies 到另一个域;后者严格限制所有请求,包括 GET

  1. Cookie 的大小被限制在 4KB 内,能够存储的信息非常少
  2. 如果不用 HTTPS 的话 Cookie 的信息是明文传输,非常不安全
  3. 每次 客户端-服务端 间的通信,都会发送、接收 Cookie,增大了通信的流量负担
  4. Cookie 再发浏览器是以纯文本的方式保存,通过 js 对其进行操作时非常不便
  5. 有的站点会基于安全考虑禁用 Cookie

替代、优化方案

参见 JavaScript本地存储实践(html5的localStorage和ie的userData)

另外可以 Google “html5 localStorage” 相关资料,不考虑老浏览器的话,这可能是现在最好的方案了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值