一、首先我们需要了解一下我们使用cookie的原因
我们都知道,HTTP 协议
是无状态的,服务器无法知道两个请求是否来自同一个浏览器,也不知道用户上一次做了什么,每次请求都是完全相互独立,这严重阻碍了交互式 Web
应用程序的实现。例子:
- 购物车:在典型的网上购物场景中,用户浏览了几个页面,买了一盒饼干和两瓶饮料。最后结帐时,由于
HTTP
的无状态性,不通过额外的手段,服务器并不知道用户到底买了什么。 - 登录状态:我们常用的“记住密码”功能,在以前如果不是用
Cookie
记住了登录凭据,想要实现该功能将会很复杂。
正是为了解决这些交互方面存在的痛点,Cookie
应运而生。
二、我们需要了解一下cookie的限制
1 格式限制Cookie
只能存储纯文本格式,因为:
- 每条
Cookie
的大小有限制 - 为用户信息安全考虑,
Cookie
中存储的是不可执行语句
2 大小和条数限制
由于 Cookie
是保存在客户端上的,所以浏览器加入了一些限制确保 Cookie
不会被恶意使用,同时不会占据太多磁盘空间,所以 Cookie
的数量和大小是有限的。
不同浏览器对 Cookie
数量和大小的限制,是不一样的。一般来说,单个域设置的 Cookie
不应超过 50个,每个 Cookie 的大小不能超过 4KB 。超过限制以后,Cookie
将被忽略,不会被设置。
其限制的原因,主要在于阻止 Cookie
的滥用,而且 Cookie
会被发送到服务器端,如果数量太大的话,会严重影响请求的性能。以上这两个限制条件,就是 Cookie
为什么会被浏览器自动删除的原因了。
3 域限制
不可跨域读取,Cookie
是被哪个域写入的,就只能被这个域及其子域读取。比如:
由 test.com
写入的 Cookie
可以被 test.com
和 test.com/child
读取,而不能被 example.com
读取。
4 路径限制
存储 Cookie
时会指定路径,该路径的子级可以读取该 Cookie
,但是它的父级却读取不到——子可以读取父,但父不能拿到子,例如:
由 test.com/parent/child
存储下的 Cookie
,可以被 test.com/parent/child/child
读取,但不能被 test.com/parent
读取。
一般会将 Cookie
存在根路径下,可以避免这种情况的发生。
5 时效限制
每个 Cookie
都有时效性,默认的有效期是会话级别( Seesion Cookie
):就是当浏览器关闭,那么 Cookie
立即销毁,但是我们也可以在存储的时候手动设置 Cookie
的过期时间,具体设置方法会在下文讲到。