面试的时候经常会被问到一个问题:你了解cookie吗?了解哪些知识?今天正好看到一篇关于cookie的文章,索性来整理一下。
定义
首先cookie表示“饼干,小甜点”,以此来表示服务器发送给浏览器的小量信息。 是作为HTTP协议的一种扩展实现的,能够记录服务器和客户端交互的信息,Cookie规范定义了服务器和客户端交互信息的格式、生存期、使用范围、和安全性。
因为cookie多用在客户端和服务端之间进行通信,所以除了JavaScript以外,服务端的语言(如PHP)也可以存取 cookie。在JavaScript中可以通过document.cookie来读取cookie。
作用
能够跟踪会话,记录用户身份,也能够记录跟踪购物车的商品信息(数量),记录用户访问次数等。
客户端初次发送请求到服务器时,如果服务器需要记住该用户状态,就向客户端浏览器发送cookie,浏览器会把Cookie保存起来。当浏览器再次向服务器发送请求时,会通过HTTP头部将请求的网址连同该Cookie一同提交给服务器,服务器根据Cookie中的sessionId来确定是否是该用户。
Cookie属性:有效期和作用域
cookie的默认有效期很短暂,它只能持续在Web浏览器的会话期间,一旦用户关闭浏览器,cookie保存的数据就丢失了。这点与sessionStorage的有效期是有区别的,sessionStorage的有效期是浏览器的单个窗口。可以通过max-age属性延长cookie的有效期。
Cookie c = new Cookie("username","程维");// 新建一个Cookie对象
c.setMaxAge(24*60*60); // 设置过期时间1天,以秒为单位
response.addCookie(c); // 保存cookie到客户端
Cookie类的各方法详解:
Cookie的作用域
cookie的作用域是通过cookie的path和domain属性配置的,默认情况下,cookie和创建它的Web页面有关,并对该Web页面以及Web页面的同目录或者子目录的其他页面可见,
setPath()与setDomain()的区别?
setDomain()主要用来确定两个不同名称但后缀相同的网站地址是否能使用同一个Cookie。
例: www.agx.com和 bbs.agx.com只要有cookie.setDomain(“.zjut.edu.cn”);就都能使用该cookie
setPath()主要用来确定地址里什么后缀下能够使用这个Cookie
归结起来就是:setDomain决定允许访问Cookie的域名,而setPath决定允许访问Cookie的路径(ContextPath)
Cookie的跨域:
1.正常情况下Cookie不可跨域名,如域名www.google.com颁发的Cookie不会被提交到域名www.baidu.com去。这是由Cookie的隐私安全机制决定的。即使在同一个一级域名下的两个二级域名如www.agx.com和images.agx.com也不能交互使用Cookie,因为二者的域名并不严格相同。如果想所有agx.com名下的二级域名都可以使用该Cookie,则需要设置Cookie的domain参数为”.agx.com”,例如:
Cookie cookie = new Cookie(“name”,”peter”); // 新建Cookie
cookie.setDomain(“.agx.com”); // 设置域名
cookie.setPath(“/“); // 设置路径
cookie.setMaxAge(Integer.MAX_VALUE); // 设置有效期为永久
response.addCookie(cookie); // 输出到客户端
Cookie 安全性
通常 cookie 信息都是使用HTTP连接传递数据,这种传递方式很容易被查看,在控制台下运行document.cookie,一目了然;所以 cookie 存储的信息容易被窃取。假如 cookie 中所传递的内容比较重要,那么就要求使用加密的数据传输。所以 cookie 的这个属性的名称是“secure”,默认的值为空。如果一个 cookie 的属性为secure,那么它与服务器之间就通过HTTPS或者其它安全协议传递数据。语法如下:
document.cookie = “username=Darren;secure”
把cookie设置为secure,只保证 cookie 与服务器之间的数据传输过程加密,而保存在本地的 cookie文件并不加密。如果想让本地cookie也加密,得自己加密数据。
注: 就算设置了secure 属性也并不代表他人不能看到你机器本地保存的 cookie 信息,所以说到底,别把重要信息放cookie就对了。
Cookie 基础知识
1、cookie 是有大小限制的,大多数浏览器支持最大为 4096 字节的 Cookie(具体会有所差异,可以使用这个好用的工具:http://browsercookielimits.squawky.net/ 进行测试);如果 cookie 字符串的长度超过最大限制,则该属性将返回空字符串。
2、由于 cookie 最终都是以文件形式存放在客户端计算机中,所以查看和修改 cookie 都是很方便的,这就是为什么常说 cookie 不能存放重要信息的原因。
3、每个 cookie 的格式都是这样的:cookieName = Vaue;名称和值都必须是合法的标示符。
4、cookie 是存在 有效期的。在默认情况下,一个 cookie 的生命周期就是在浏览器关闭的时候结束。如果想要 cookie 能在浏览器关掉之后还可以使用,就必须要为该 cookie 设置有效期,也就是 cookie 的失效日期。
5、alert(typeof document.cookie)结果是 string
6、cookie 有域和路径这个概念。域就是domain的概念,因为浏览器是个注意安全的环境,所以不同的域之间是不能互相访问 cookie 的(当然可以通过特殊设置的达到 cookie 跨域访问)。路径就是routing的概念,一个网页所创建的 cookie 只能被与这个网页在同一目录或子目录下得所有网页访问,而不能被其他目录下得网页访问(这句话有点绕,一会看个例子就好理解了)。
7、其实创建cookie的方式和定义变量的方式有些相似,都需要使用 cookie 名称和 cookie 值。同个网站可以创建多个 cookie ,而多个 cookie 可以存放在同一个cookie 文件中。
8、 cookie 存在两种类型:①:你浏览的当前网站本身设置的 cookie ②来自在网页上嵌入广告或图片等其他域来源的 第三方 cookie (网站可通过使用这些 cookie 跟踪你的使用信息)
9、cookie 有两种清除方式:①:通过浏览器工具清除 cookie (有第三方的工具,浏览器自身也有这种功能) ②通过设置 cookie 的有效期来清除 cookie.注:删除 cookie 有时可能导致某些网页无法正常运行。
10、浏览器可以通过设置来接受和拒绝访问 cookie。出于功能和性能的原因考虑,建议尽量降低 cookie 的使用数量,并且要尽量使用小 cookie。
Cookie和Session问答
1、Cookie运行在客户端,Session运行在服务端,对吗?
A:不完全正确。Cookie是运行在客户端,有客户端进行管理;Session虽然是运行在服务器端,但是sessionID作为一个Cookie是存储在客户端的。
2、浏览器禁止Cookie,Cookie就不能用了,但Session不会受浏览器影响,对吗?
A:错。浏览器禁止Cookie,Cookie确实不能用了,Session会受浏览器端的影响。很简单的实验,在登录一个网站后,清空浏览器的Cookie和隐私数据,单机后台的连接,就会因为丢失Cookie而退出。当然,有办法通过URL传递Session。
3、浏览器关闭后,Cookie和Session都消失了,对吗?
A:错。存储在内存中额Cookie确实会随着浏览器的关闭而消失,但存储在硬盘上的不会。更顽固的是Flash Cookie,不过现在很多系统优化软件和新版浏览器都已经支持删除Flash Cookie。百度采用了这样的技术记忆用户:Session在浏览器关闭后也不会消失,除非正常退出,代码中使用了显示的unset删除Session。否则Session可能被回收,也有可能永远残留在系统中。
4、Session 比 Cookie 更安全吗? 不应该大量使用Cookie吗?
A:错误。Cookie确实可能存在一些不安全因素,但和JavaScript一样,即使突破前端验证,还有后端保障安全。一切都还要看设计,尤其是涉及提权的时候,特别需要注意。通常情况下,Cookie和Session是绑定的,获得Cookie就相当于获得了Session,客户端把劫持的Cookie原封不动地传给服务器,服务器收到后,原封不动地验证Session,若Session存在,就实现了Cookie和Session的绑定过程。因此,不存在Session比Cookie更安全这种说法。如果说不安全,也是由于代码不安全,错误地把用作身份验证的Cookie作为权限验证来使用。
5、Session是创建在服务器上的,应该少用Session而多用Cookie,对吗?
A:错。Cookie可以提高用户体验,但会加大网络之间的数据传输量,应尽量在Cookie中仅保存必要的数据。
6、如果把别人机器上的Cookie文件复制到我的电脑上(假设使用相同的浏览器),是不是能够登录别人的帐号呢?如何防范?
A:是的。这属于Cookie劫持的一种做法。要避免这种情况,需要在Cookie中针对IP、UA等加上特殊的校验信息,然后和服务器端进行比对。
7、在IE浏览器下登录某网站,换成Firefox浏览器是否仍然是未登录状态?使用IE登录了腾讯网站后,为什么使用Firefox能保持登录状态?
A:不同浏览器使用不同的Cookie管理机制,无法实现公用Cookie。如果使用IE登录腾讯网站,使用Firefox也能登录,这是由于在安装腾讯QQ软件时,你的电脑上同时安装了针对这两个浏览器的插件,可以识别本地已登录QQ号码进而自动登录。本质上,不属于共用Cookie的范畴。
setcookie各个参数详解
语法:
setcookie(name,value,expire,path,domain,secure)