1.1.學習心得程序員
本文不可能將cookie每一個細節講的面面俱到,學習亦是。本人以爲學習Cookie主要在於兩大方面,一方面是運用二是安全方面,而不是一上來就死記硬背它的那些特色。運用方面須要實操演練cookie的細節特性,也就是本文中的「Cookie的關鍵項組成」章節中的五個屬性而且要作到經過DEMO實際去驗證該屬性的一些特色,在深刻領悟了其中的道理和相關的涉及面就能夠很好的運用cookie;安全方面這塊涉及到不少網絡知識,我以爲做爲程序員學習能夠基本瞭解下,等到項目中緊密涉及到在進行深刻,否則該方面會橫向拓展涉及不少知識面,考慮到時間成本上並不划算。跨域
1.2.簡介Cookie瀏覽器
我理解最簡單的一句話歸納:一種能夠用於客戶端與服務器之間傳輸的數據存儲功能,從而實現WEB的狀態保持和會話跟蹤。安全
而且該數據最終會以文本文件存放在客戶端上,而且每一個cookie存儲數據量不能超過4KB。服務器
在數據存儲方面,cookie存儲的是明文數據而且客戶端是具有一些修改cookie的能力,因此不建議將敏感的數據存放在cookie中。cookie
1.3存在的價值網絡
和不少其餘的保存WEB狀態的對象同樣,因爲HTTP是一個無狀態的協議,簡單來比喻說:服務器中的WEB頁面是沒有記憶的,他記不住你來過仍是第一次來,因此它須要藉助一些相似存儲性質的手段來實現記憶,當你來過期(狀態),避免下次在來的時候作一些重複的工做(保持狀態)。這一特性是每一個WEB狀態對象都具有的,然而在根據每一個狀態對象的細節特性能夠運用實現不一樣的功能,如Cookie能夠運用到「記住用戶名」、「單點登陸」等場景中。學習
1.4.Cookie之廣告說網站
咱們每一個人可能都會經歷以下一種場景,例如你在百度搜索了一些你感興趣的東西(如手機)來了解一些詳情資料,而後當你在去登陸淘寶貨京東之類的電商網站時他就會自動給你推送你曾經在百度上搜索的一些商品廣告。這塊的技術實現就使用到了Cookie,電商網站會根據在訪問百度瀏覽時存儲的cookie數據從而跟每一個不一樣的人推送感興趣的商品。ui
2.Cookie在客戶端和服務器之間的交互
以一個記住用戶名的一個運用場景繪製一個客戶端瀏覽器和服務器的交互圖:
在這個交互的過程當中咱們要記住如下:
1.關於報文
cookie的數據在傳輸過程當中都放在在報文頭中,當服務器建立cookie響應給瀏覽器時,cookie的內容是在響應報文的請求頭中並在Set-Cooke屬性中,這裏還要強調一點是若是存在多個Cookie響應,那麼Set-Cookie就存在多個;而且瀏覽器只要請求服務器就會將於服務器有關聯的Cookie數據放在請求報文的請求頭中,發送給服務器。
2.關於存儲
Cookie執行的存儲操做是一種物理形式,該操做是瀏覽器來完成的,服務器中建立的cookie只是組織數據告知瀏覽器來實際的執行。
3.Cookie的關鍵項組成
3.1.Name/Value屬性
Cookie存儲和讀取數據都是以鍵值對的形式進行操做的,例如:Request.Cookies[「uid」]=」bob」;
Name便是鍵Value則是指。在存儲數據時大多數瀏覽器對數據有大小的限制都在4KB之內,若是出現相同的鍵則後存儲的會將上一個覆蓋。
3.2.Expires屬性
用於設置Cookie的到期時間,超過該時間cookie會失效。
根據該屬性的設置與否,將cookie分爲了兩種性質:
第一種是會話性cookie,即沒有設置該屬性時,cookie的數據是保存在客戶端的內存中,而且當用戶關閉瀏覽器時cookie就失效。顧名思義,就像一段電話同樣,電話打完了相關的語音即刻就斷掉。
第二種是持久性cookie,即設置了該屬性cookie有了指定失效的時間,此時的cookie的數據是保存在電腦的硬盤上,當到了失效時間或者用戶手動經過瀏覽器清除時cookie在會失效。
Cookie的刪除其實就是經過將該屬性設置爲一個已通過期的時間,從而瀏覽器會對cookie進行清除。
3.3.Path屬性
用於設置某個Cookie容許訪問的目錄,例如你只想讓此Cookie讓網站下某個指定目錄下代碼頁面進行訪問,就能夠設置該屬性。默認的狀況下也就是沒有指定此屬性時,設置的Cookie在對應的站點中全部頁面都可訪問。
這裏還有一個細節須要注意,若是設置指定目錄才能訪問,那麼瀏覽器在發送請求時除了指定目錄會發送cookie,其餘的頁面瀏覽器不會發送cookie請求報文頭中也不會存在cookie的數據。
實操驗證:
示例說明:
經過請求Test.ahsx頁面建立一個cookie並設置了指定容許訪問的目錄A,頁面請求後瀏覽器接收到服務器返回的cookie在響應報文頭中,接下來分別請求A目錄和B目錄的兩個頁面,因爲cookie只容許A目錄的頁面才能訪問,因此在請求A.ahsx頁面時成功的輸出了cookie中的數據,並觀察到只有在請求A目錄的頁面時瀏覽器的請求報文中才會有cookie數據。
另外,經過設置該屬性能夠縮小訪問的範圍從而提升必定的安全性。
3.4.Domain屬性
指定了能夠訪問該Cookie的域名,默認值是當前站點所在服務器的域。
簡單來講cookie的訪問不能跨域例如,www.baidu.com站點建立的cookie在www.sina.com站點中是不能訪問的。
可是不能跨域不表明不能跨服務器或站點,由於域名能夠指向多臺服務器或多個不一樣的網站系統,由於cookie機制並未嚴格遵照同源策略,例如www.baidu.com:801站點建立的cookie能夠在www.baidu.com:802站點中進行讀取,然而此特性對於實現單點登陸很是有用。
下圖示例兩個不一樣的站點共享cookie數據,由於兩個站點都在同域下。
另外這裏還補充一點:
上述說cookie不能跨域名訪問,而且不能跨瀏覽器訪問不一樣瀏覽器設置的cookie都是不相關的,例如你在谷歌瀏覽器在博客園上進行了登陸,博客園使用cookie記錄你的用戶名,而後你在IE瀏覽器訪問博客園此時IE不能獲取你在谷歌瀏覽記住的用戶名,須要從新輸入。
3.4.Secure屬性
指定是否使用HTTTPS安全協議發送Cookie。使用HTTP安全協議,能夠保護Cookie在瀏覽器和Web服務器之間傳輸過程當中不被竊取和篡改。我的以爲Domain屬性的特性在必定範圍上拓展了Cookie的使用範圍可是會形成必定的安全隱患,最簡單的方式就是將站點部署爲HTTPS的站點併爲Cookie設置該屬性。
3.5HTTPOnly屬性
用於防止客戶端經過JS腳本document.cookie屬性訪問cookie,有助於保護Cookie不被跨站腳本攻擊竊取或篡改。可是,HTTPOnly的應用仍存在侷限性,一些瀏覽器能夠被阻止使JS讀取cookie,但容許寫的操做;此外大多數瀏覽器仍容許經過XMLHTTP對象讀取HTTP響應中的Set-Cookie頭從而獲取cookie數據,我的以爲該屬性的存在沒有太大的實際意義。
4.在ASP.NET中使用Cookie
使用Cookie很簡單,也根本不用記住,仍是秉承着「要什麼點什麼」的原則就行,如:Request.Cookies。
下面仍是官方的寫下代碼:
1 HttpCookie cookieUid = Request.Cookies["uid"]; 2
3 if (cookieUid==null) //第一次訪問,則建立
4 { 5 cookieUid = new HttpCookie("uid", Request["uid"]); 6 cookieUid.Expires = DateTime.Now.AddDays(1); 7 } 8 else // 非第一次,則直接讀取
9 { 10 string uid = cookieUid.Value; 11 Response.Write("當前登陸用戶名:"+uid); 12 }
在寫代碼時須要注意: