引言:今天被4399面试官问到了 cookie 的相关知识,之前不是很了解,现在补补...
什么是cookie
cookie 译为“小甜饼,具体种类称为酥性甜饼干,这是一种中档配料的产品......”。咦,跑偏了,开个玩笑先,虽然面试过程不爽,但还是得笑对人生(生无可恋)。正经说,当你在浏览网站的时候,WEB 服务器会先送一小小资料放在你的计算机上,cookie 会记录如身份识别号码、密码、用户在 Web 站点购物的方式或用户访问该站点的次数等关键信息,而正因为这些信息的重要性使 cookie 技术成为广大网民和开发人员争论的一个焦点,因为 cookie 将包含但不限于上述的一些信息保存在用户浏览器上的小文本文件上,它包含有关用户的信息。这些相关信息保留下来可以为你下次再次访问该网站时鉴别用户,以便提供一些量身定做的内容。打个比喻就像各大网站如 Google、百度、网易等给客户端颁发一个通行证,客户端需要访问网站时带上自己的通行证。这样服务器就能认出这个客户端是哪个老相好了。
name
这个显而易见,就是代表 cookie 的名字的意思,一个域名下绑定的 cookie ,name 不能相同,相同的 name 的值会被覆盖掉
value
这个就是每个 cookie 拥有的一个属性,它表示该属性的值
domain
这个是指的域名,这个代表的是,cookie 绑定的域名,如果没有设置,就会自动绑定到执行语句的当前域,还有值得注意的点,统一个域名下的二级域名也是不可以交换使用 cookie 的,比如,你设置 www.baidu.com 和 image.baidu.com ,依旧是不能公用的
path
path这个属性默认是/
,当你设置成比如/blog
的时候,其实它会给 “domain+path” 范围内绑定 cookie
Expires/Max-Age
该属性决定 cookie 的有效期,一般浏览器的 cookie 都是默认储存的,当关闭浏览器结束这个会话的时候,这个 cookie 也就会被删除,这就是上图中的—— session (会话储存)。
如果你想要 cookie 存在一段时间,那么你可以通过设置 Expires 属性为未来的一个时间节点,Expires 这个是代表当前时间的,这个属性已经逐渐被我们下面这个主人公所取代——Max-Age。
Max-Age,是以秒为单位的,Max-Age 为正数时,cookie 会在 Max-Age 秒之后被删除。在 Max-Age 之前 cookie 是保存到硬盘上,即使关闭浏览器后再次打开,这些 cookie 仍然有效直到超过设定的过期时间。存储在硬盘上的 cookie 可以在不同的浏览器进程间共享,比如两个 IE 窗口。当 Max-Age 为负数时,表示的是临时储存,不会生出 cookie 文件,只会存在浏览器内存中,且只会在打开的浏览器窗口或者子窗口有效,一旦浏览器关闭, cookie 就会消失,当 Max-Age 为 0 时,又会发生什么呢,删除 cookie ,因为cookie 机制本身没有设置删除 cookie ,失效的 cookie 会被浏览器自动从内存中删除,所以,它实现的就是让 cookie 失效。
secure
这个属性译为安全,http 不仅是无状态的,还是不安全的协议,容易被劫持。所以当这个属性设置为 true 时,此 cookie 只会在 https 和 ssl 等安全协议下传输。但需要强调一下这个属性并不能对客户端的cookie进行加密,不能保证绝对的安全性
http-only
这个属性是面试的时候常考的,如果这个属性设置为true,就不能通过js脚本来获取cookie的值,能有效的防止xss攻击,看MDN的官方文档:
关于JavaScript操作cookie
document.cookie 可以对 cookie 进行读写:
console.log(document.cookie); //读取浏览器中的cookie
document.cookie='myname=liuzhiyu;path=/;domain=.baidu.com'; // 写入 cookie
服务端如何去设置cookie
服务端就是通过 setCookie 来设置 cookie 的,注意点,要设置多个 cookie 时,得多写几个 setCookie ,我们还可以从上图看到,请求可以携带 cookie 给后端。
cookie与session
了解 HTTP 的同学,肯定知道,HTTP 是一个不保存状态的协议,什么叫不保存状态,就是一个服务器是不清楚是不是同一个浏览器在访问他。session 是服务器端使用的一种记录客户端状态的机制,不同的是 cookie 保存在客户端浏览器中,而 session 保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。这就是 session。客户端浏览器再次访问时只需要从该 session 中查找该客户的状态就可以了。如果说 cookie 机制是通过检查客户身上的“通行证”来确定客户身份的话,那么 session 机制就是通过检查服务器上的“客户明细表”来确认客户身份。session 相当于程序在服务器上建立的一份客户档案,客户来访的时候只需要查询客户档案表就可以了。
session对浏览器的要求
虽然 session 保存在服务器中,对客户端是透明的,它的正常运行仍然需要客户端浏览器的支持。这是因为 session 需要使用 cookie 作为识别标志。HTTP 协议是无状态的,session不能依据 HTTP 连接来判断是否为同一客户,因此服务器向客户端浏览器发送一个名为 JSESSIONID 的 cookie,它的值为该 session 的 id。session 依据该cookie 来识别是否为同一用户。该 cookie 为服务器自动生成的,它的 MaxAge 属性一般为–1,表示仅当前浏览器内有效,并且各浏览器窗口间不共享,关闭浏览器就会失效。
session中不使用cookie
URL 地址重写是对客户端不支持从 cookie 的解决方案。URL 地址重写的原理是将该用户 session 的 id 信息重写到 URL 地址中。服务器能够解析重写后的 URL 获取session 的 id。这样即使客户端不支持 cookie,也可以使用 session 来记录用户状态。
cookie session 区别
- cookie 数据存放在客户的浏览器上,session数据放在服务器上
- cookie 不是很安全,别人可以分析存放在本地的 COOKIE 并进行 COOKIE 欺骗考虑到安全应当使用 session
- session 会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能考虑到减轻服务器性能方面,应当使用 COOKIE
- 单个 cookie 保存的数据不能超过 4K,很多浏览器都限制一个站点最多保存20个 cookie。
鉴于上述区别我们建议
- 将登陆信息等重要信息存放为 SESSION
- 其他信息如果需要保留,可以放在 COOKIE 中
参考
最后,如果本文有任何知识性错误,欢迎各位小哥哥小姐姐提出!
最后是广告时间,我的原创博文将同步更新在三大平台上,欢迎大家点击阅读!谢谢
网友评论