一、概述
1、cookie是一种会话跟踪技术,用于在进行网页访问的时候,存储页面中的某些数据信息。
2、Cookie是一小段文本信息,伴随着用户请求在 Web 服务器和浏览器之间传递。它存储于访问者的计算机中,每当同一台计算机通过浏览器请求某个页面时,就会发送这个 cookie。cookie是浏览器提供的一种机制,它将 document 对象的 cookie 属性提供给 JavaScript。可以使用JavaScript来创建和获取 cookie 的值,因此我们可以通过document.cookie
访问它
二、组成
1、Cookie是一段不超过4KB的小型文本数据,由一个名称(Name)、一个值(Value)和其它几个用于控制Cookie有效期、安全性、使用范围的可选属性组成:
(1)Name/Value:设置Cookie的名称及相对应的值,作为认证的访问令牌
(2)Expires属性:设置Cookie的生存期。有两种存储类型的Cookie:会话性与持久性。
①Expires属性缺省时,为会话性Cookie,仅保存在客户端内存中,并在用户关闭浏览器时失效;
②持久性Cookie会保存在用户的硬盘中,直至生存期(可自行设置)到或用户直接在网页中单击“注销”等按钮结束会话时才会失效
(3)Path属性:定义了Web站点上可以访问该Cookie的目录。
(4)Domain属性:指定了可以访问该 Cookie 的 Web 站点或域
(5)Secure属性:指定是否使用https安全协议(可以保护Cookie在浏览器和Web服务器间的传输过程中不被窃取和篡改)发送Cookie
(6)HTTPOnly 属性 :用于防止客户端脚本通过document.cookie属性访问Cookie,有助于保护Cookie不被跨站脚本攻击窃取或篡改。但是,HTTPOnly的应用仍存在局限性,一些浏览器可以阻止客户端脚本对Cookie的读操作,但允许写操作;此外大多数浏览器仍允许通过XMLHTTP对象读取HTTP响应中的Set-Cookie头
PS:只有cookie
的名字和值是必需的,其他都是可选项
2、详解
(1)domain和path:domain 和 path 这两个选项共同决定了cookie能被哪些页面共享。
①domain
参数是用来控制 cookie对哪个域有效,默认为设置 cookie的哪个域。这个值可以包含子域,也可以不包含它。Domain选项中,可以是".aliyun.com
"(不包含子域,表示它对aliyun.com
的所有子域都有效),也可以是"account.aliyun.com
"(包含子域),仅对子域有效
②path
用来控制cookie发送的指定域的路径,默认为"/",表示指定域下的所有路径都能访问。它是在域名的基础下,指定可以访问的路径。例如cookie设置为"domain=account.aliyun.com; path=/
aliyunid-portal",那么只有"account.aliyun.com /
aliyunid-portal "及"/
aliyunid-portal "下的任一子目录如"/
aliyunid-portal /xxx
"或"/
aliyunid-portal /yyy
"会发送cookie信息,而" account.aliyun.com
"就不会发送,即使它们来自同一个域
(2)expries/max-age失效时刻/有效时长:expries 和 max-age 是用来决定cookie的生命周期,也就是cookie何时会被删除。
①默认情况为Session
,表示浏览器会话结束时(即关闭浏览器)就会删除cookie。
②用户也可以通过expries
设置删除时间。这个值是个GMT
格式的日期,如图中所示,Tue, 07 May 2030 09:22:25 GMT,这表明这个 cookie 将在2030年5月7日星期二09:22:25 GMT失效,在此期间浏览器关闭后此cookie仍会保存在用户的机器中。GMT格式可以通过 toGMTString()
和 toUTCString()
获得。如果设置的失效时间是个以前的时间,则 cookie 会被立即删除,这也是用来删除 cookie 的方法。
③在新的http协议中已经使用 max-age
属性来取代 expries。expries 表示的是失效时间,准确讲是时刻,max-age表示的是生效的时间段,以秒为单位。若 max-age
为正值,则表示 cookie 会在 max-age 秒后失效。如例四中设置"max-age=18000;",也就是有效时长是5个小时,那么 cookie 将在五小时后失效。若 max-age
为负值(max-age的默认值为-1),则cookie将在浏览器会话结束后失效,即 session;若 max-age
为0,则表示立即删除cookie。
(3)secure
secure是 cookie 的安全标志,通过cookie直接包含一个secure单词来指定,也是cookie中唯一一个非名、值对儿的部分。指定后,cookie只有在使用SSL连接(如HTTPS请求)时才会发送到服务器。不指定 secure 选项(默认情况为false),即不论是 http 请求还是 https 请求,均会发送cookie。
PS:只有保证网页是https协议(或其他安全协议)请求时,才能在客户端通过 js 去设置secure 类型的 cookie。
(4)httponly
httponly属性是用来限制客户端脚本对cookie的访问。将 cookie 设置成 httponly 可以减轻xss攻击的危害,防止cookie中的信息被窃取,以增强cookie的安全性。HTTP列用来表示是否设置了httponly属性,默认情况是 httponly为false,即可以通过 js 去访问。当 httponly为true时,js是无法读取和修改 httponly的cookies的,当然也不能设置 cookie 为 httponly,这只能通过服务器端去设置。
三、cookie的设置
1、 服务器端设置
服务器通过发送一个名为 Set-Cookie
的HTTP头来创建一个cookie,作为 Response Headers 的一部分,每个Set-Cookie 表示一个 cookie(如果有多个cookie,需写多个Set-Cookie),每个属性也是以名/值对的形式(除了secure
),属性间以分号加空格
隔开。格式如下:
Set-Cookie: name=value[; expires=GMTDate][; domain=domain][; path=path][; secure]
PS:通过 Set-Cookie 指定的可选项(域、路径、失效时间、secure标志)只会在浏览器端使用,它们都是服务器给浏览器的指示,以指定何时应该发送cookie。这些参数不会被发送至服务器端,只有name和value才会被发送。
2、客户端设置
客户端设置cookie
的格式和服务端Set-Cookie
头中使用的格式一样。若想要添加多个cookie,只能重复执行 document.cookie:
document.cookie = "test1=myCookie1;" //名、值
document.cookie = "test2=myCookie2; domain=.aliyun.com; path=/aliyunid-portal" //名、值、域、路径
document.cookie = "test3=myCookie3; domain=.aliyun.com; expires=Sat, 07 Nov 2020 23:00:00 GMT; secure" //名、值、域、失效时间(2020年11月7日星期六23点整失效)、安全标识(true)
document.cookie = "test4=myCookie4; domain=.aliyun.com; max-age=18000;" //名、值、域、有效时间(18000秒,即5小时,表示有效期为即刻起的5小时)
四、 cookie的修改
不同名:重复执行 document.cookie 是新增
同名:重复执行 document.cookie 是覆盖/修改
修改操作:可以修改原cookie的expries、secure属性,但不能修改domain、path属性。修改cookie时domain、path必须与原cookie保持一致,否则便是新增cookie信息(名字和值可以重复)
五、cookie的删除
将expries
设为一个过去的时间或将max-age
设为0
,都可以删除cookie。同时也要特别注意此cookie的domain、path
要与原来保持一致。
六、cookie编码
若 cookie 的名或值中包含分号、逗号和空格这三个特殊字符,那么它需要经过URL
编码。其他情况下无需编码,一般可以使用encodeURIComponent
进行编码,它对应的解码函数是decodeURIComponent
。若要给 cookie 指定额外的信息,只要将参数追加到该字符串【名和值都需要编码,且有效时间为36000秒,即10小时】
document.cookie = encodeURIComponent("test") + "=" + encodeURIComponent("myCookie") + "; max-age=36000";
七、cookie的优缺点
1、优:兼容性好,方便
2、缺:
(1)安全性【不安全】:由于cookie在HTTP中是明文传递的,其中包含的数据都可以被他人访问,可能会被篡改、盗用(所以尽可能不要在cookie中存储重要和敏感的数据)
(2)大小限制【数据容量有限】:cookie的大小限制在4KB左右,若要做大量存储显然不是理想的选择。
(3)增加流量【请求时长】:cookie每次请求都会被自动添加到Request Header中,无形中增加了流量。cookie信息越大,对服务器请求的时间也越长。