什么是cookie?
cookie的英文原意是小餅干
是為了應(yīng)對(duì)HTTP是無(wú)狀態(tài)協(xié)議這一特性而創(chuàng)造出來(lái)的方法,用于在客戶端保留信息并在下次請(qǐng)求傳回服務(wù)器
服務(wù)器響應(yīng)(response)的http報(bào)文中可以添加set-cookie字段, 通過(guò)設(shè)置該字段中的屬性可以控制客戶端存儲(chǔ)cookie信息
存有cookie信息的客戶端會(huì)在后續(xù)請(qǐng)求(request)中加入cookie字段
cookie中的屬性
除鍵值對(duì)外都不是必填項(xiàng),各屬性之間通過(guò)一個(gè)分號(hào)和一個(gè)空格隔開(kāi)
"key=value; expires=Thu, 25 Feb 2016 04:18:00 GMT; domain=ppsc.sankuai.com; path=/; secure; HttpOnly"
- key=value
cookie鍵值對(duì)(必需項(xiàng)) - expires=DATE
cookie的有效期(默認(rèn)為瀏覽器關(guān)閉為止)
必須是GMT格式的時(shí)間
expires 是 http/1.0協(xié)議中的選項(xiàng),在新的http/1.1協(xié)議中expires已經(jīng)由 max-age 選項(xiàng)代替获搏,兩者的作用都是限制cookie 的有效時(shí)間台谍。expires的值是一個(gè)時(shí)間點(diǎn)(cookie失效時(shí)刻= expires)鳍置,而max-age 的值是一個(gè)以秒為單位時(shí)間段(cookie失效時(shí)刻= 創(chuàng)建時(shí)刻+ max-age)。
另外蜘醋,max-age 的默認(rèn)值是 -1(即有效期為 session )鞭缭;若max-age有三種可能值:負(fù)數(shù)、0碘举、正數(shù)。負(fù)數(shù):有效期session搁廓;0:刪除cookie引颈;正數(shù):有效期為創(chuàng)建時(shí)刻+ max-age
- path=路徑
用于限制cookie的發(fā)送范圍的文件目錄(若不指定則默認(rèn)為文檔所在的文件目錄) - domain=域名
指定cookie適用對(duì)象的域名(若不指定則默認(rèn)為創(chuàng)建cookie的服務(wù)器的域名)
eg: Set-Cookie: name=value;secure
上例僅在使用HTTPS的情況下才進(jìn)行cookie的回收
特別說(shuō)明1:發(fā)生跨域xhr請(qǐng)求時(shí),即使請(qǐng)求URL的域名和路徑都滿足 cookie 的 domain 和 path枚抵,默認(rèn)情況下cookie也不會(huì)自動(dòng)被添加到請(qǐng)求頭部中。若想知道原因請(qǐng)閱讀本文最后一節(jié))
特別說(shuō)明2:domain是可以設(shè)置為頁(yè)面本身的域名(本域)明场,或頁(yè)面本身域名的父域汽摹,但不能是公共后綴 public suffix。舉例說(shuō)明下:如果頁(yè)面域名為 www.baidu.com, domain可以設(shè)置為“www.baidu.com”苦锨,也可以設(shè)置為“baidu.com”逼泣,但不能設(shè)置為“.com”或“com”。
- secure
用于限制cookie在HTTPS安全鏈接下使用 - HttpOnly?
作用是使JavaScript腳本無(wú)法獲得cookie,防止XSS對(duì)cookie的信息竊取
添加了HttpOnly這條屬性后,js中的document.cookie無(wú)法取到cookie值
在服務(wù)端設(shè)置cookie
在response header的set-cookie字段設(shè)置, 每個(gè)字段對(duì)應(yīng)一個(gè)cookie, 存儲(chǔ)格式為字符串
在服務(wù)端可以設(shè)置cookie的全部6個(gè)屬性
在客戶端設(shè)置cookie
使用document.cookie
document.cookie = "name=Micheal; max-age=3600; "
客戶端無(wú)法設(shè)置HttpOnly屬性
什么樣的數(shù)據(jù)適合放在cookie中?
存儲(chǔ)在cookie中的數(shù)據(jù)舟舒,每次都會(huì)被瀏覽器自動(dòng)放在http請(qǐng)求中拉庶,如果這些數(shù)據(jù)并不是每個(gè)請(qǐng)求都需要發(fā)給服務(wù)端的數(shù)據(jù),瀏覽器這設(shè)置自動(dòng)處理無(wú)疑增加了網(wǎng)絡(luò)開(kāi)銷秃励;但如果這些數(shù)據(jù)是每個(gè)請(qǐng)求都需要發(fā)給服務(wù)端的數(shù)據(jù)(比如身份認(rèn)證信息)氏仗,瀏覽器這設(shè)置自動(dòng)處理就大大免去了重復(fù)添加操作。所以對(duì)于那設(shè)置“每次請(qǐng)求都要攜帶的信息(最典型的就是身份認(rèn)證信息)”就特別適合放在cookie中夺鲜,其他類型的數(shù)據(jù)就不適合了皆尔。
注意:
1.每個(gè)域名下的cookie最大為4kb, 每個(gè)域名下最多有20條cookie(不同的瀏覽器廠商可能會(huì)有所區(qū)別)