Cookie、Session、HTTP 缓存

Cookie 是什么?

Cookie 是浏览器访问服务器后,服务器传给浏览器的一段数据。

它有以下几个特点:

  1. 服务器通过 Set-Cookie 响应头设置 Cookie(给浏览器的一串字符串)
    例如,response.setHeader('Set-Cookie', `sign_in_email=${email}`)
  2. 浏览器得到 Cookie 之后,以后每次浏览器向服务器发送 HTTP 请求时,每个请求都会带上相应的 Cookie
  3. 服务器通过读取浏览器的 Cookie 就可以知道登录用户的信息(识别用户身份)
  4. 浏览器要在一段时间内保存这个 Cookie(Cookie 存储在本地浏览器上)
  5. Cookie 默认在用户关闭页面后就失效(和 sessionStorage 一样),但是可以通过后台代码任意设置 Cookie 的过期时间(Expires,Max-Age)
  6. 一般来说,单个域名设置的 Cookie 不应超过30个,每个 Cookie 的大小不能超过4KB。


    Cookie 的用途
  • 对话(session)管理:保存登录、购物车等需要记录的信息。
  • 个性化:保存用户的偏好,比如网页的字体大小、背景色等等。
  • 追踪:记录和分析用户行为。


    Cookie 有关问题
  1. Cookie 存在哪?
    在 Windows 系统中, Cookie 是存放在 C 盘的一个文件中
  2. Cookie可以被用户篡改吗?
    可以;通过用户手动修改或通过 JS 修改(document.cookie
  3. Cookie 遵守同源策略吗?
    浏览器的同源政策规定,两个网址只要域名相同和端口相同,就可以共享 Cookie(不要求协议相同)
    举例来说,当请求 qq.com 下的资源时,浏览器会默认带上 qq.com 对应的 Cookie,不会带上 baidu.com 对应的 Cookie;
    当请求 v.qq.com 下的资源时,浏览器不仅会带上 v.qq.com 的Cookie,还会带上 qq.com 的 Cookie;
    另外 Cookie 还可以根据路径做限制,这个功能用得比较少。
  4. Cookie 如何设置过期时间?
    用 Max-Age 或 Expires 都可以设置 Cookie 的过期时间;
    Expires属性指定一个具体的到期时间,Max-Age 属性指定从现在开始 Cookie 存在的秒数。同时指定了 Expires 和 Max-Age,那么Max-Age 的值将优先生效。
  5. 如何删除 Cookie?
    删除一个现存 Cookie 的唯一方法,是设置它的 expires 属性为一个过去的日期。
    document.cookie = 'fontSize=;expires=Thu, 01-Jan-1970 00:00:01 GMT';
    上面代码中,名为 fontSize 的 Cookie 的值为空,过期时间设为1970年1月1月零点,就等同于删除了这个 Cookie。

Cookie 存在的一个很大的问题就是用户可以随意篡改 Cookie,很不安全,因此需要通过设置 Session 来防止用户篡改

Session

Session 和 Cookie 的作用有点类似,都是为了存储用户相关的信息。服务器通过 Cookie 给用户一个 SessionID,这个 SessionID 对应服务器里面的一小块内存,每次用户访问服务器时,服务器就通过用户对应的 SessionID 去读取对应的 Session,从而知道用户的隐私信息。

Session 的优点是比 Cookie 安全,缺点是相比较于 cookie 来说内存占用比较大

  1. 服务器将 SessionID(随机数)通过 Cookie 发送给浏览器
  2. 浏览器访问服务器时,服务器读取的是 SessionID
  3. 服务器有一块内存(哈希表)保存了所有的 Session
  4. 通过 SessionID 我们可以得到对应用户的隐私信息,如 id、email 等
  5. 这块内存(哈希表)就是服务器上的所有 Session(s)(用户只有一个 Session,服务器有很多个 Session)

localStorage (本地存储)

localStorage 是 HTML5 提供的 API,用于脚本在浏览器保存数据。sessionStorage 保存的数据用于浏览器的一次会话(session),当会话结束(通常是窗口关闭)时,数据被清空;localStorage保存的数据长期存在,下一次访问该网站的时候,网页可以直接读取以前保存的数据。

localStorage 是一种持久化的存储方式。在以前没有 localStorage 时,所有变量在页面刷新时全部销毁,没有办法保留下来。

  1. localStorage 跟 HTTP 无关
  2. HTTP 不会带上 localStorage 的值
  3. 只有相同域名的页面才能互相读取 ;ocalStorage(没有同源那么严格)
  4. 每个域名的 localStorage 容量是有限的,每个域名 localStorage 最大存储量为 5Mb 左右(每个浏览器不一样)
  5. 常用场景:用来记录是否已经提示过用户(记录一些没有用的信息,不能用来记录密码)
let already = localStorage.getItem('已经提示了')
if (!already) {
  alert('Welcome!')
  localStorage.setItem('已经提示了', true)
} else {}  // 重复刷新时,只会提示一次"Welcome!"
  1. localStorage 永久有效,除非用户清理缓存

注意:Session 和 localStorage 本质上都是哈希表,但区别在于 Session 是服务器上的 hash 表,而 localStorage 是浏览器上的 hash 表,且只能存储字符串。

localStorage 的几个常用的 API

localStorage.clear() 方法用于清除所有保存的数据。该方法的返回值是undefined。

sessionStorage(会话存储)

sessionStorage 与 localStorage 相似,唯一的不同之处在于保存期限的长短不同。
sessionStorage 保存的数据用于浏览器的一次会话(session),当会话结束(通常是窗口关闭),数据被清空;localStorage 保存的数据长期存在,下一次访问该网站的时候,网页可以直接读取以前保存的数据。

HTTP 缓存

使用 HTTP 缓存有利于 web 性能优化

1. Cache-Control(缓存控制)

Cache-Control 可以让浏览器在一定时间内不访问服务器(不发请求),直接使用本地的缓存作为响应,这样做可以有效避免很多不必要的 HTTP 请求,从而改善页面的性能。

Cache-Control 使用 max-age 指定组件被缓存多久,从请求开始在 max-age 时间内浏览器使用缓存,max-age 时间之外的使用请求。

response.setHeader('Catch-Control','max-age=315360000')

response.setHeader('Catch-Control','max-age=30') 过程

问:为什么首页不能设置 Cache-Control?

答:如果对首页也进行缓存,那么用户刷新之后不会发起请求,无法得到更新后的资源。


问:如何更新缓存?

答:由于只有相同的 URL 才能加载缓存,因此加一个查询参数即可实现更新缓存,重新发起请求
例如,<script src="./main.js?v=2"></script>
在一个原本加载本地缓存的 JS 中加一个查询字符串?v=2,即可让这个JS 文件重新发起请求

更新缓存

2. Expire

Expires 响应头包含日期/时间, 即在此时候之后,响应过期。

Expires: Wed, 21 Oct 2015 07:28:00 GMT

Expires 和 Cache-Control 的区别:

  1. Expires 是以前用来控制缓存的 HTTP 头,Cache-Control 是 Expires 的升级版
  2. Cache-Control 设置的是时间长度,而 Expire 是设置时间点
  3. 如果两个都设置了,优先使用 Cache-Control,而 Expires 头会被忽略

3. MD5 和 ETag

  • MD5 是一种消息摘要算法,可以把微小的差异放大,用于确保信息传输完整一致。
  • ETag 是 HTTP 响应头中的内容,可以让缓存更高效。如果内容没有改变,服务器不需要发送完整的响应。而如果内容发生了变化,使用 ETag 有助于防止资源的同时更新相互覆盖。

那么具体是如何实现的呢,这里举一个例子说明

请求一个main.js文件

查看响应

请求

以后每次请求的版本号如果和 If-None-Match 的值相同,就返回状态码 304,且不需要下载响应体

HTTP 304 Not Modified 表示无需再次传输请求的内容,也就是说可以使用缓存的内容


状态码304
响应体为空

总结

  1. Cookie、Session、Cache-Control 都是在服务器的响应头中设置的
  2. Session 与 Cookie 的区别与联系
    区别:
  • Session 存储在服务器,而 Cookie 是存储在本地浏览器。
  • Cookie 不安全,Session 比较安全。
  • Session 占用服务器的内存比较大,Cookie 保存在本地不占用服务器资源。
    联系:
    一般来说,Session 基于 Cookie 来实现,其 Session ID 是通过 Cookie 发送给客户端的。
    但 Session 也可以用 LocalStorage + 查询参数实现(不基于 Cookie)
  1. Cookie 和 localStorage 的区别
  • Cookie会自动被上传到服务器,而 LocalStorage 只存在于本地的浏览器上,不会「自动」被上传到服务器(LocalStorage 不会随 HTTP 发给 Server)。
  • 它们所支持的最大存储空间不同,LocalStorage 的大小限制比 Cookie 大多了。
  1. localStorage 和 sessionStorage 的区别
    保存期限的长短不同;localStorage 里面存储的数据没有过期时间设置,而存储在 sessionStorage 里面的数据在页面会话结束(页面关闭)时会被清除。
    简单地说,localStorage 不会自动过期,sessionStorage 在会话结束时会自动过期。
  2. 前端永远不要 读/写 Cookie(用 localStorage)
  3. Cache-Control: max-age=1000 缓存 与 ETag 的「缓存」有什么区别?
    Cache-Control 是直接不请求(1000 秒内),读取本地缓存作为响应;而 ETag 只是不下载响应体(响应体为空,沿用之前的响应体),但依然会发起请求。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,864评论 6 494
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,175评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,401评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,170评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,276评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,364评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,401评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,179评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,604评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,902评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,070评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,751评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,380评论 3 319
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,077评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,312评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,924评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,957评论 2 351

推荐阅读更多精彩内容