面试时候经常会被问及 Cookie 大小限制,但一直没尝试写一些 demo 测试下溢出极限值会怎样~~

本文就来看看各种极限情况!

英文

测试代码:

(() => {
const maxSize = 4 * 1024; // 4KB
const name = 'name'
// 最大出入的 value 长度
const maxValueStr = 'a'.repeat(maxSize - name.length);
// firefox 不能使用 Secure
document.cookie = `${name}=${encodeURIComponent(maxValueStr)};expires=${new Date(2026, 0, 1).toUTCString()};path=/`;
})()

Chrome/Edge/Firefox 浏览器

英文:名字 + 内容 字符串长度限制 4096 字符。

各家浏览器的存储面板都能看到 Cookie 大小,此大小包含存入 Cookie 的名字和内容加在一起的长度

不同之处

Chrome/Edge

超过 4KB 大小无法存储,浏览器无报错,也无提示,纯粹毫无感知。

Firefox

超过 4KB 大小会有提示:

Cookie “name”太大而无效。最大大小为 4096 字节。

比如这段代码存入 cookie 的值超过一个字符:

(() => {
const maxSize = 4 * 1024 - 5; // 4KB
const maxStr = 'a'.repeat(maxSize) + 'b1';
console.log(' ~ maxStr:', maxStr.length);
document.cookie = `name=${encodeURIComponent(maxStr)};expires=${new Date(2026, 0, 1).toUTCString()};path=/`;
})()

运行有警告:

如果在 Firefox 中 localhost 使用 secure 会报错!!

由于非 HTTPS Cookie 无法设置“secure”属性,已拒绝 Cookie “name”。

比如这段代码在本地 localhost 的环境中 Chrome 和 Edge 都能正常运行,但是 Firefox 会报错:

document.cookie = `name=${encodeURIComponent(maxStr)};expires=${new Date(2026, 0, 1).toUTCString()};path=/;Secure;SameSite=Lax`;

报错:

中文

一个中文占用3个英文长度!!!

测试代码:

(() => {
const maxSize = 4 * 1024; // 4KB
const name = 'name'
const valueSize = maxSize - name.length
console.log(valueSize / 3);
const value = '中'.repeat(Math.floor(valueSize / 3));
// firefox 不能使用 Secure
document.cookie = `name=${(value)};expires=${new Date(2026, 0, 1).toUTCString()};path=/`;
})()

4KB 字符串长度减去 name 的长度,除以 3 等于 1364 中文字符长度,刚好是浏览器能存储的极限值。

Firefox 显示的大小比较另类,它没按照转换后的大小显示,而是直接显示了中文值长度 + 英文名称长度,而 Chrome 和 Edge 显示的是占用空间长度。如下图:

一般在存储中文的的时候,会用到 encodeURIComponent 编码一下中文字符,这方法编码之后,一个中文字符将会转成 9 个英文字符,使用这种方法存储中文时候需特别注意!!!

使用 cookieStore

cookieStore 存入超过大小限制的字符串长度时,会报一个奇奇怪怪的错误,比如:

(async () => {
const maxSize = 4 * 1024; // 4KB
const name = 'name'
const valueSize = maxSize - name.length
console.log(valueSize / 3);
const value = '中'.repeat(Math.floor(valueSize / 3));
const res = await cookieStore.set({
name: 'name',
// 比极限值多出一个长度
value: value + '1',
expires: new Date(2026, 0, 1).getTime(), // Unix 时间戳(以毫秒为单位表示)
path: '/',
sameSite: 'lax'
})
console.log('存储结果:', res); // 正常写入返回 undefined
})()

报错:

翻译过来的大致意思:由于解析时出现问题,导致 Cookie 格式错误,无法存储。

反正不是明确的告诉开发者长度异常了!!所以在使用 cookieStore 时,需要进行异常捕获。

本文编写时 Firefox 最新版本 138.0.4 还不支持 cookieStore。

Cookie 个数限制

单个 Cookie 的大小限制了解了,再看看 Cookie 个数限制。

多个超大 Cookie

测试代码:

(async () => {
document.cookie = ''
const name = 'name'
// 最大出入的 value 长度
let cookieStr = ''
for (let i = 0; i < 200; i++) {
document.cookie = `${name + i}=${'a'.repeat(4000)};expires=${new Date(2026, 0, 1).toUTCString()};path=/`;
}
// JS 查找 name 出现次数
console.log(document.cookie.match(/name/g).length)
})()

第一次都能正常打开页面,第二次刷新页面之后都会报错:

此问题应该是跟 http 协议的限制有关,请求头发送的 Cookie 长度太长了,导致响应 431 状态码。

Firefox 在页面未正常打卡的情况下还不支持清空 Cookie,需要点击右上角菜单--设置--隐私与安全--清除数据删除保存的超大 Cookie 浏览器才能正常访问。

小 Cookie 个数限制

测试代码:

(async () => {
function setCookie(name, value) {
return new Promise((resolve, reject) => {
setTimeout(() => {
document.cookie = `${name}=${value};path=/`;
resolve()
}, 5);
});
}
const name = 'name'
// 最大出入的 value 长度
let cookieStr = ''
for (let i = 0; i < 2000; i++) {
console.log('正在写入:', i);
await setCookie(name + i, 'a')
}
setTimeout(() => {
// JS 查找 name 出现次数
console.log(document.cookie?.match(/name/g)?.length)
}, 1000);
})()

Chrome、Edge、Firefox 浏览器每次刷新写入的 Cookie 个数都不一样,可以复制以上代码在浏览器中测试!

AI 回答:

写在最后

根据测试结果可以得出:在使用 Cookie 时只建议用于存入关键数据,而不是用来做相关缓存!!

Web前端入门第 82 问:JavaScript cookie 有大小限制吗?溢出会怎样?的更多相关文章

  1. web前端入坑第五篇:秒懂Vuejs、Angular、React原理和前端发展历史

    秒懂Vuejs.Angular.React原理和前端发展历史 2017-04-07 小北哥哥 前端你别闹 今天来说说 "前端发展历史和框架" 「前端程序发展的历史」 「 不学自知, ...

  2. web前端入坑第二篇:web前端到底怎么学?干货资料! 【转】

    http://blog.csdn.net/xllily_11/article/details/52145172 版权声明:本文为博主[小北]原创文章,如要转载请评论回复.个人前端公众号:前端你别闹,J ...

  3. WEB前端工程师整理的原生JavaScript经典百例

    一.原生JavaScript实现字符串长度截取 二.原生JavaScript获取域名主机 三.原生JavaScript转义html标签 四.原生JavaScript时间日期格式替换 Date.prot ...

  4. web前端(13)—— 了解JavaScript,JavaScript的引入方式

    从本篇博文开始,将进入web前端方便最关键最重要的部分——javascript,学到后面你就知道它真的太重要了 什么是JavaScript JavaScript一种直译式的脚本语言,是一种动态类型.弱 ...

  5. Web前端基础怎么学? JavaScript、html、css知识架构图

    以前开发者只要掌握 HTML.CSS.JavaScript 三驾马车就能胜任一份前端的工作了.而现在除了普通的编码以外,还要考虑如何性能优化,如何跨端.跨平台实现功能,尤其是 AI.5G 技术的来临, ...

  6. web前端学习之HTML CSS/javascript之一

    前端编码之路之坎坷,web前端应该一直是个战场吧,各种浏览器的不兼容,各种小细节的修改,要往一个好的产品经理方向走,实在是难,昨天听了一位十年经验的产品经理讲座,最重要的恐怕就是协调资源的能力,而协调 ...

  7. Android零基础入门第82节:Activity数据回传

    上一节学习了将简单的数据从MainActivity传递到SecondActivity,本节一起来学习数据如何从SecondActivity回传到MainActivity. 一.简介 前面己经提到,Ac ...

  8. Web前端开发规范【HTML/JavaScript/CSS】

    前言 这是一份旨在增强团队的开发协作,提高代码质量和打造开发基石的编码风格规范,其中包含了 HTML, JavaScript 和 CSS/SCSS 这几个部分.我们知道,当一个团队开始指定并实行编码规 ...

  9. web前端——实例中学习css,javascript

    最近闲暇时候在研究前端的样式和js,以前都是从w3school上看看那些选择器和DOM操作方法很少去实际做demo来研究,做的过程当中才真切感觉到纸上得来终觉浅,看得懂跟能做出东西完全两码事,尤其在定 ...

  10. 文成小盆友python-num14 - web 前端基础 html ,css, JavaScript

    本部分主要内容 html - 基础 css - 基础 一.html 标签 html 文档标签树如下: head 部分 Meta(metadata information) 提供有关页面的元信息,例:页 ...

随机推荐

  1. 【SQL周周练】:利用行车轨迹分析犯罪分子作案地点

    大家好,我是"蒋点数分",多年以来一直从事数据分析工作.从今天开始,与大家持续分享关于数据分析的学习内容. 本文是第 7 篇,也是[SQL 周周练]系列的第 6 篇.该系列是挑选或 ...

  2. 补充停牌的日K数据

    问题 从TuShare获取的数据,停牌日是没有数据的,这将会在回测时,不能直接参与账户的净值计算,导致账户的净值以及收益计算不准确. 停盘 股票由于某种消息或进行某种活动引起股价的连续上涨或下跌,由证 ...

  3. Django Web应用开发实战第十一章

    一.会话控制 Django内置的会话控制简称为session,可以为用户提供基础的数据存储. 数据主要存储在服务器上,并且网站上的任意站点都能使用会话数据. 当用户第一次访问网站时,网站的服务器将自动 ...

  4. ShadowSql.net之正确使用方式

    ShadowSql是面向接口模块化可插拔可扩展的工具 ShadowSql不是全家桶 不把所有功能都做一个项目里面就是为了大家不一次引用所有的nuget包 大家可以先判断需要哪些功能,再引用对应的nug ...

  5. Windows基线检查

    Windows 脆弱性检查是指通过一系列工具和方法,评估 Windows 操作系统中的潜在安全漏洞,以发现并修复可能被攻击者利用的弱点.这个过程包括对系统的安全配置.补丁更新.权限设置以及其他安全因素 ...

  6. 技术干货 |看我如何来解Web Terminal假性输入框

    编者按 写在前面的话 在介绍本篇文章的时候,先说一下本篇文章的一些背景.笔者是基于公司的基础建设哆啦 A 梦(Doraemon) (https://github.com/DTStack/doraemo ...

  7. ATE测试工程师的职业展望

    这是IC男奋斗史的第29篇原创 本文2188字,预计阅读6分钟. 接上文:ATE测试工程师是做什么的? ATE测试工程师就业情况分析  目前芯片就业市场上ATE测试工程师非常紧缺,基本上大部分的芯片设 ...

  8. 简单的php奥运倒计时牌

    1 <?php 2 3 date_default_timezone_set ( "Asia/Shanghai" ); 4 $kaimu = mktime ( 4, 0, 0, ...

  9. AI应用实战课学习总结(1)必备AI基础理论

    大家好,我是Edison. 由于公司的愿景逐渐调整为ONE Tech Company,公司的IT战略也逐渐地朝着Data & AI Driven发展,因此近半年来我一直在学习大模型相关的东西, ...

  10. 第三代长安75p安装三方软件

    前言 长安的车机系统是 长安与腾讯联合且基于安卓自研的 梧桐车联系统. 通过一些特殊方式,打开了车机的系统信息真身 此系统极为封闭,默认情况下,不允许安装除了车机本身应用商店之外的三方软件,本身内置的 ...