分享一个关于Cookie做的实验结果
实验本身是很枯燥的,我尽量把它讲的有趣些。
起因
去网上搜了下关于Cookie的介绍,看了好几篇都长得很一样,阉割一下内容不外乎说是"不同浏览器限制cookie数不同,大致在30-50这个范围,(前缀)浏览器允许Cookie多达4KB左右,包括名、值、等号"。
我还在上学那会儿,包括后面毕业后工作一段时间,我也没有特别去关注过这个话题,基本上如果面试官问到我了,也就把网上知道的这些讲了一下。
今年的遭遇给了我思考的时间特别多,最近我又重新去仔细读了下楼上那句话,我发现我读不懂了,第一个,我看的资料并不是特别权威的,也都是网上的博客帖子,对浏览器限制30-50个这个范围产生了一个质疑,是真的吗?第二个是允许多达4KB左右,就很迷糊,到底是一个域名下所有的Cookie加起来的值是4KB左右,还是说单独的Cookie的一个Name所表示的信息它可以是4KB左右,这让我很迷啊。
行,那我们接下来就做个关于Cookie的实验,去验证一些东西。
因为这只是一个实验,所有这里笔者不会讲Cookie的使用和作用以及其他介绍。大致理一下,我们要验证的一些点如下:
- 单个域名下浏览器Cookie限制个数为多少?
- 浏览器Cookie单个Value值可以允许多大?
经过
建模
在开始实验之前,我们先建个模型,大致这个实验它要怎么展开,上图。
起初笔者是提供了一个手动挡的模型,你可以试着输入name和value,然后点击按钮Add Cookie,它就会把这条记录写到Cookie里面,为了便于对照,笔者又读取了cookie的信息同步了一份到网页上,看着直观点。由于我们要记录Cookie数,这里笔者简单粗暴地把它设置在网页可视内容的右上角,那个冒红的地方。再后来笔者想偷点懒,就实现了一个随机生成Cookie的手动挡模型Add Random Cookie。后续的所有实验结果也都是在这个基础上得出来的。
写好程序后,笔者首先在Chrome最新版浏览器测试了下。发现的规律是,当Cookie的个数达到180个后,再增加就会降到150个,就是说180是它的上限,到了以后它自动清掉了30个选手。
这里有个问题是,笔者当时也是直接随机了两次分别塞到name和value上面。通过观察,我们很难发现到达上限以后它删除的规律是怎么样的,是删除最前面的30个,还是后面的30个,还是随机的呢?
好,我们改一下,我们的肉眼对数字会敏感一些,那我们就把它的value全部换成数字去看看。
可以看到它是删除了最前面的30个cookie记录。
笔者在自己的手机里,通过打开小米内置浏览器的结果也是和这个一样的。
接下来我们测下在火狐浏览器的情况,笔者电脑上火狐浏览器的版本还是比较低的,没有升级到最新版,因为48.0.2这个版本它可以直接手动安装一些xpi
插件,笔者就是在这个版本安装上了firebug和一起其他插件。
通过观察,我们可以看到,在火狐浏览器中,它的规律是当cookie的个数达到150个以后,它会删除最开始的Cookie,空出位置留个新添加的Cookie,它的上限是150个,后续再添加一个Cookie记录就删除最前面的cookie记录空出位置留给后面添加的。
到这里,笔者将相关的Cookie信息整理成文件,随机两个的结果是6KB左右,随机一个加阿拉伯的结果是3KB左右。看到这里,我们猜也能猜到了,最开始说的4KB限制,应该是指Cookie设置的一条记录。
当然,我们学理科是很严谨的,我们通过实验去看看结果吧。
笔者写了个测试程序,经过测试,在Chrome浏览器端的条件下发现,大约是4KB的样子。
结果
结论
因为浏览器的种类和版本都很多,所有在写结果之前,笔者会在前面加上“在一定条件下”。看着像句屁话,但它真的很有用,给你后面的话加了一条保险杠的效果。就好比文科作文写“XXX万岁”。
在一定条件下,基于Webkit内核的浏览器,Cookie呈现如下规律,当单个域名下Cookie数到达180个的时候,再次添加会删除最开始的30个Cookie里路,然后从150的基数依次往上增加直至180个后,浏览器会循环前面的操作。
在一定条件下,基于gecko内核的浏览器,Cookie呈现如下规律,当单个域名下Cookie数到达150个后,再次添加它会删除最前面的Cookie记录以腾出位置给添加的Cookie记录。
在一定条件下,Cookie单条记录的Value值允许大小近似于4KB。
最后
最后,附上实验相关地址:https://zhengjiangtao.cn/show/zj/cookie.html
有兴趣的同学也可以看下我打基础写的其他网页,它的项目地址是:https://zhengjiangtao.cn/show
- golang中操作excel
- 企业安全漏洞通告引擎
- 通过httprouter和redis框架搭建restful api服务
- .NET Core 实现定时抓取博客园首页文章信息并发送到邮箱
- 基于 R 语言和 SPSS 的决策树算法介绍及应用
- Android 8.0 中的安全增强功能
- python2 群发 html 或文本邮件
- windows 安装 storm 及 eclipse 调试 TopN 实例
- shell 学习笔记(16)
- 根据ip查找ISP运营商和归属地的几种方法
- windows 安装 spark 及 pycharm 调试 TopN 实例
- storm kafka 编程指南
- 基于Session的身份窃取
- 使用 django-blog-zinnia 搭建个人博客
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法