Cookie的起源
??早期的Web應用面臨的最大問題之一就是如何維持狀態(tài),即服務器無法知道兩個請求是否來自同一個瀏覽器俭缓。當時最簡單的方法就是在請求的頁面中插入一個token,然后在下次請求時將這個token返回至服務器,這需要通過頁面的form表單或者URL的query來進行傳遞,手動操作容易出錯纠屋。
??1994年,網(wǎng)景通訊的Lou Montulli將"magic cookies"的概念應用到Web通訊中。他的原始說明文檔提供了cookie工作原理的基本信息,該文檔后來被作為規(guī)范納入RFC 2109中,最終納入RFC 2965±塘現(xiàn)在所有的Web瀏覽器都支持cookie伴箩。
Cookie詳解
??HTTPCookies, 通常稱之為'Cookie',是在遠程瀏覽器端存儲數(shù)據(jù)并以此跟蹤和識別用戶的機制猴抹。從實現(xiàn)上來說,Cookie是存儲在客戶端上的一小段文本文件,瀏覽器通過HTTP協(xié)議和服務端進行Cookie交互,即一個Web頁面或服務器告知瀏覽器按照一定的規(guī)范來存儲這些cookie信息,并在隨后的請求中將這些信息發(fā)送至服務器,服務器通過這些信息來識別不同的用戶≌埃現(xiàn)在大多數(shù)需要登錄的網(wǎng)站在用戶驗證成功之后都會設置一個cookie,只要這個cookie存在并且有效,用戶就可以自由瀏覽這個網(wǎng)站的任何頁面,若cookie被刪除或者過期,則需要用戶重新登錄。
Cookie創(chuàng)建
??服務器通過發(fā)送名為Set-Cookie
的HTTP消息頭來創(chuàng)建一條cookie信息,其格式如下:
Set-Cookie:<cookie-name>=<cookie-value>;
Expires=<date>;
Max-Age=<non-zero-digit>;
Domian=<domain-value>;
path=<path-value>;
secure;
HttpOnly=<httponly-value>
- 消息第一部分通常是一個key=value格式的字符串,也是原始規(guī)范中指定的格式脆侮。
-
Expires
為過期時間,指定了cookie何時不會再被發(fā)送至服務器,隨后瀏覽器將會刪除該cookie,該選項是一個Wdy, DD-Mon-YYYY HH:MM:SS GMT
的日期格式锌畸。例如:
Set-Cookie: name=Nicholas; expires=Sat, 02 May 2009 23:38:25 GMT
-
domain
指定了cookie將要被發(fā)送至哪個或者哪些域。默認情況下,domain會被設置為創(chuàng)建該cookie的頁面所在的域名,所以給相同域名發(fā)送請求時,該cookie會被發(fā)送至服務器 -
path
指定了請求資源URL中必須存在該path路徑,才會發(fā)送cookie消息頭靖避。通常是將path選項的值與請求URL從頭開始逐個字符比較,如果字符匹配,則發(fā)送cookie消息頭潭枣。例如:
Set-Cookie:name=Nicholas;path=/blog
??該例中, path
值會與 /blog
, /blogtest
等相匹配,任何以 /blog
開頭的選項都是符合規(guī)則的。需要注意的是,只有在 domain
選項過濾之后才會對 path
選項進行比對幻捏。
-
secure
該選項只是一個標記,沒有具體的值,表示一個請求只有通過SSL或者HTTPS創(chuàng)建時,包含secure
選項的cookie才會被發(fā)送至服務器盆犁。 - HttpOnly指定該cookie無法通過JavaScript腳本讀取,即
document.cookie
、XMLHttpRequest
對象和 Request API均無法讀取cookie,只有瀏覽器發(fā)出HTTP請求時,才會帶上該cookie篡九。
Cookie的使用
??cookie一般用于采用HTTP作為信息交換協(xié)議的客戶端和服務端來記錄需要持久化的信息谐岁。一般由服務端創(chuàng)建,傳遞到客戶端,客戶端從HTTP消息中讀取cookie信息,并保存到本地,當客戶端再次訪問服務器時,會從本地讀取存儲的cookie信息,附加到HTTP消息中發(fā)送請求,服務端再從接收到的HTTP消息中讀取cookie,進行下一步操作。
由于cookie信息以明文方式保存在文本文件中瓮下,對一些敏感信息如口令翰铡、銀行帳號如果要保存在本地cookie文件中钝域,最好采用加密形式讽坏。
??與cookie類似的另一個概念是會話(Session),會話一般是記錄客戶端和服務器端從客戶端瀏覽器連接上服務器端到關閉瀏覽器期間的持久信息例证。會話一般保存在內存中路呜,不保存到磁盤上。會話可以通過cookie機制來實現(xiàn)织咧,對于不支持cookie的客戶端胀葱,會話可以采用URL重寫方式來實現(xiàn)◇厦桑可以將會話理解為內存中的cookie抵屿。
??使用會話會對系統(tǒng)伸縮性造成負面影響,當服務器端要在很多臺服務器上同步復制會話對象時捅位,系統(tǒng)性能會受到較大傷害轧葛,尤其會話對象較大時。這種情況下可以采用cookie艇搀,將需要記錄的信息保存在客戶端尿扯,每次請求時發(fā)送到服務器端,服務器端不保留狀態(tài)信息焰雕,避免在服務器端多臺機器上復制會話而造成的性能下降
Cookie路徑概念
??cookie 一般都是由于用戶訪問頁面而被創(chuàng)建的衷笋,可是并不是只有在創(chuàng)建 cookie 的頁面才可以訪問這個 cookie。
默認情況下矩屁,只有與創(chuàng)建 cookie 的頁面在同一個目錄或子目錄下的網(wǎng)頁才可以訪問辟宗,這個是因為安全方面的考慮爵赵,造成不是所有頁面都可以隨意訪問其他頁面創(chuàng)建的 cookie。舉個例子:
在 "http://www.reibang.com/u/" 這個頁面創(chuàng)建一個cookie慢蜓,那么在"/u/"這個路徑下的頁面如: "http://www.reibang.com/u/cb09084735af"這個頁面默認就能取到cookie信息亚再。
可在默認情況下, "http://www.reibang.com"或者 "http://www.reibang.com/xxxx/" 就不可以訪問這個 cookie(光看沒用晨抡,實踐出真理_)氛悬。
那么如何讓這個 cookie 能被其他目錄或者父級的目錄訪問類,通過修改 cookie 的路徑就可以實現(xiàn)耘柱。例子如下
document.cookie = "name=value;path=superpath/otherpath"
最常用的是讓cookie在根目錄下,不管在哪個頁面創(chuàng)建cookie,所有頁面都可以使用
document.cookie = "name=Darren;path=/"
Cookie域概念
??同域之間cookie共享可以通過domain屬性實現(xiàn),例如:"www.qq.com" 與 "sports.qq.com" 公用一個關聯(lián)的域名"qq.com"如捅,我們如果想讓 "sports.qq.com" 下的cookie被 "www.qq.com" 訪問,我們就需要用到 cookie 的domain屬性调煎,并且需要把path屬性設置為 "/"镜遣。例:
document.cookie = "username=Darren;path=/;domain=qq.com"
注:一定的是同域之間的訪問,不能把domain的值設置成非主域的域名,會造成cookie污染士袄。
Cookie安全性
??通常 cookie 信息都是使用HTTP連接傳遞數(shù)據(jù)悲关,這種傳遞方式很容易被查看,所以 cookie存儲的信息容易被竊取娄柳。假如 cookie 中所傳遞的內容比較重要寓辱,那么就要求使用加密的數(shù)據(jù)傳輸。
??cookie 的屬性“secure”赤拒,默認的值為空秫筏。如果一個 cookie 的屬性為secure,那么它與服務器之間就通過HTTPS或者其它安全協(xié)議傳遞數(shù)據(jù)挎挖。語法如下:
document.cookie = "username=Darren;secure"
??把cookie設置為secure这敬,只保證 cookie 與服務器之間的數(shù)據(jù)傳輸過程加密,而保存在本地的 cookie文件并不加密蕉朵。如果想讓本地cookie也加密崔涂,得自己加密數(shù)據(jù)。
注:就算設置了secure 屬性也并不代表他人不能看到你機器本地保存的 cookie 信息始衅,所以說到底冷蚂,別把重要信息放cookie就對了,囧...
Cookie自動刪除
cookie會被瀏覽器自動刪除,有幾下幾個原因:
- 會話cookie(Session cookie)會在會話結束時(瀏覽器關閉)被刪除
- 持久化cookie(Persistent cookie)在達到失效日期時被刪除
- 如果瀏覽器中cookie數(shù)量達到限制,那么cookie會被刪除以為新的cookie創(chuàng)建空間
對于自動刪除來說,Cookie管理十分重要,因為這些刪除都是無意識的.
Cookie的限制條件
- cookie屬性:
- cookie的大小:原始規(guī)范中限定每個域名下不超過 20 個 cookie觅闽,早期的瀏覽器都遵循該規(guī)范帝雇,并且在 IE7 中有更近一步的提升。在微軟的一次更新中蛉拙,他們在 IE7 中增加 cookie 的限制數(shù)量到 50 個尸闸,與此同時 Opera 限定 cookie 數(shù)量為 30 個,Safari 和 Chrome 對與每個域名下的 cookie 個數(shù)沒有限制。
發(fā)向服務器的所有 cookie 的最大數(shù)量(空間)仍舊維持原始規(guī)范中所指出的:4KB吮廉。所有超出該限制的 cookie 都會被截掉并且不會發(fā)送至服務器