初识cookie
HTTP Cookie通常直接叫做cookie,是小型的纯文本文件
cookie指某些网站为了辨别用户身份而存储在用户本地终端上的数据(维基百科)
服务器对任意HTTP请求发送Set-Cookie HTTP头作为响应的一部分。浏览器会存储这样的会话信息,并在这之后,通过为每个请求添加Cookie HTTP头部将信息发送回服务器(感觉就像是服务器首先给每个人发一个身份卡,下次你要进来,就得刷卡)
response:
HTTP/1.1 200 OK
Content-type: text/html
Set-Cookie: name=value
Other-header: other-header-value
request:
GET /index.html HTTP/1.1
Cookie: name=value
Other-header: other-header-value
一个登录网站典型的应用,帮助理解cookie存在的意义:
我们浏览网站都遇到过,登录网站,输入用户名和密码。一般还会出现“下次自动登录”这样的选择框,勾选了,下次我们就不需要再输入用户名和密码了。这正是因为在前一次登录时,服务器发送了包含登录凭据(用户名加密码的某种加密形式)的Cookie到用户的硬盘上。第二次登录时,如果该Cookie尚未到期,浏览器会发送该Cookie,服务器验证凭据,于是不必输入用户名和密码就让用户登录了。
创建cookie
Set-Cookie: value[; expires=date][; domain=domain][; path=path][; secure]
web服务器通过发送一个称为 Set-Cookie
的 HTTP 消息头来创建一个 cookie,比如上面代码的示例。这里的value就是名称=值组合的字符串,当然还可以包含可选项(域、路径、失效时间、安全标志。以分号和空格隔开,这些只会在客户端浏览器中使用,不会发送到服务器),也就是方括号部分,具体讲讲可选项。
过期时间(expires)
Set-Cookie: name=Nicholas; expires=Sat, 02 May 2009 23:38:25 GMT
指定了 cookie 何时不会再被发送至服务器,随后浏览器将删除该 cookie(其实相当于服务器给你发的卡,有时间限制的,过期了刷卡就不行了,卡失效了,进不去)
没有设置 expires
选项时,cookie 的生命周期仅限于当前会话中,关闭浏览器意味着这次会话的结束,所以会话 cookie 仅存在于浏览器打开状态之下。如果设置的时间是以前的时间,那么cookie会被立即删除。
域(domain)
cookie对于哪个域有效(相当于给你发的卡,比如一个城堡,哪个门能进,哪个不能进,还是都能进)。默认情况下,domain
会被设置为创建该 cookie 的页面所在的域名,所以当给相同域名发送请求时该 cookie 会被发送至服务器。
路径(path)
指定了请求的资源 URL 中必须存在指定的路径时,才会发送Cookie
消息头。(就是你拿到的卡必须具备某种条件)
安全标志(secure)
这个选项比较特殊,只是一个标记,没有值。只有当一个请求通过 SSL 或 HTTPS 创建时,包含 secure
选项的 cookie 才能被发送至服务器。(不过吧,cookie本来就不适应防止机密的东西,不安全)
在javascript中,我们可以通过document.cookie来读取当前页可用的所有cookie字符串。也可以通过这个属性来设置新的cookie。同名的会被覆盖,不同名的就自动添加在原有cookie后面
cookie缺陷
- 性能:Cookie会被附加在没个HTTP请求中,所以无形中增加了流量。cookie信息越大,完成对服务器的请求时间越长
- 安全性:由于在HTTP请求中的Cookie是明文传递的,所以安全性成问题,除非用HTTPS
- 大小限制:整个cookie长度限制在4095B,对于复杂的存储需求来说是不够的。如果你尝试创建超过最大尺寸限制的cookie,那么该cookie会被悄无声息地丢掉。
cookie的性质和它的局限性使得其并不能作为存储大量信息的理想手段。
所以出现了HTML5 中的存储机制,其实也不是什么新东西了。下一篇文章聊聊
参考资料
《Javascript高级程序设计(第3版)》(博客大多数参考来源)
https://zh.wikipedia.org/wiki/Cookie
https://humanwhocodes.com/blog/2009/05/05/http-cookies-explained/