Cookie是什麼?我想任何一個互聯網的從業者都會很快的告訴你,它是一種瀏覽器本地存儲的一種方式.能夠將一部分資源存放在本地,已達到更好的網絡體驗.瀏覽器
然而隨着HTML5規範的普及,咱們如今彷佛有了更好的解決方案.LocalStorage
和SessionStorage
.它們是專門爲本地存儲而誕生的解決方案.和Cookie相比起來.它們也彷佛更加優秀:安全
對於Cookie來講它只有一個document.cookie
這一個API可使用,不論是讀取Cookie
仍是存儲Cookie
你都只能使用它.而且Cookie
在存儲時只能存儲一段字符串.所在讀取和存儲時你都要另外的區封裝方法已到達你想要的效果.服務器
而LocalStorage
和SessionStorage
不同.以LocalStorage
爲例,你存儲的時候有localStorage.setItem()
,你讀取的時候有localStorage.getItem()
,你想要刪除的時候有localStorage.removeItem()
.此外在存儲時,它們事以鍵值對的形式存儲的.因此更易於使用.cookie
Cookie的存儲大小隻有4KB,而LocalStorage
和SessionStorage
是5MB.網絡
Cookie的存儲是有過時時間的,到期自動刪除,而LocalStorage
是永久存儲,除非主動刪除.併發
通過上述的對比,咱們發現,Cookie從任何方面來講都是完敗於LocalStorage
和SessionStorage
的,或許你會說它在兼容性方面有着優點.可是隨着HTML5標準的日益普及.這一點優點也並無想象中的那麼重要.ide
那麼,既然如此咱們是否是就要徹底的拋棄Cookie,轉投LocalStorage
和SessionStorage
的懷抱了.其實並非.在HTML5的時代,Cookie並不會落伍.依然會具備重要的地位.這是由於Cookie
的本地存儲功能雖然被代替了.可是他的本職工做卻依然無可替代.那它的本質工做是什麼了 ----服務器遠程在瀏覽器端存儲數據並以此跟蹤和識別用戶的機制。網站
然咱們來看看維基百科上對於Cookie的幾段描述:搜索引擎
Cookie(複數形態Cookies),中文名稱爲「小型文本文件」或「小甜餅」[1],指某些網站爲了辨別用戶身份而儲存在用戶本地終端(Client Side)上的數據(一般通過加密)。定義於RFC2109。是網景公司的前僱員盧·蒙特利在1993年3月的發明[2]。加密
由於HTTP協議是無狀態的,即服務器不知道用戶上一次作了什麼,這嚴重阻礙了交互式Web應用程序的實現。在典型的網上購物場景中,用戶瀏覽了幾個頁面,買了一盒餅乾和兩瓶飲料。最後結賬時,因爲HTTP的無狀態性,不經過額外的手段,服務器並不知道用戶到底買了什麼。 因此Cookie就是用來繞開HTTP的無狀態性的「額外手段」之一。服務器能夠設置或讀取Cookies中包含信息,藉此維護用戶跟服務器會話中的狀態。
在剛纔的購物場景中,當用戶選購了第一項商品,服務器在向用戶發送網頁的同時,還發送了一段Cookie,記錄着那項商品的信息。當用戶訪問另外一個頁面,瀏覽器會把Cookie發送給服務器,因而服務器知道他以前選購了什麼。用戶繼續選購飲料,服務器就在原來那段Cookie裏追加新的商品信息。結賬時,服務器讀取發送來的Cookie就好了。
Cookie另外一個典型的應用是當登陸一個網站時,網站每每會請求用戶輸入用戶名和密碼,而且用戶能夠勾選「下次自動登陸」。若是勾選了,那麼下次訪問同一網站時,用戶會發現沒輸入用戶名和密碼就已經登陸了。這正是由於前一次登陸時,服務器發送了包含登陸憑據(用戶名加密碼的某種加密形式)的Cookie到用戶的硬盤上。第二次登陸時,(若是該Cookie還沒有到期)瀏覽器會發送該Cookie,服務器驗證憑據,因而沒必要輸入用戶名和密碼就讓用戶登陸了。
從上面維基百科上對Cookie
描述咱們就能夠看出,Cookie誕生的緣由就是解決辨別用戶身份的問題.而本地存儲只是實現的一個手段而已.並非它的主要目的.只是由於,在當時除了Cookie
以外並無一套有效的解決本地存儲的一個方案.因此Cookie
就被拿來借用.而借用的時間一長,許多人就覺得Cookie
就是爲了實現本地存儲的.反而將它的本職功能給忘記了.
那麼,獲取有人會問了,LocalStorage
和SessionStorage
既然代替了Cookie
的本地存儲功能,那麼是否能將Cookie
的驗證功能也一塊兒代替了了.對此,我能夠很絕對的告訴你這是不行的.由於服務端能夠經過Cookie
來驗證用戶,由於瀏覽器在每次請求的時候都會帶上Cookie
中的信息,這對於最多隻能存儲4KB大小的Cookie
來講.這是能夠的.但對於有着5MB大小的LocalStorage
和SessionStorage
來講是不可想象的.此外,對於Cookie
服務端能夠遠程給瀏覽器端設置,而LocalStorage
和SessionStorage
.因此,基於以上兩點,使用LocalStorage
和SessionStorage
徹底代替Cookie
就目前而言是不可能的.
固然說了這麼多,Cookie
也並非沒有缺陷.仍是借用維基百科上面的資料:
Cookie的缺陷
- Cookie會被附加在每一個HTTP請求中,因此無形中增長了流量。
- 因爲在HTTP請求中的Cookie是明文傳遞的,因此安全性成問題。(除非用HTTPS)
- Cookie的大小限制在4KB左右。對於複雜的存儲需求來講是不夠用的。
反對Cookies者
一些人反對Cookies在網絡中的應用,他們的理由以下:
- 識別不精確
- 識別有時候會發生錯誤
- 隱私,安全和廣告
Cookies在某種程度上說已經嚴重危及用戶的隱私和安全。其中的一種方法是:一些公司的高層人員爲了某種目的(譬如市場調研)而訪問了從未去過的網站(經過搜索引擎查到的),而這些網站包含了一種叫作網頁臭蟲的圖片,該圖片透明,且只有一個像素大小(以便隱藏),它們的做用是將全部訪問過此頁面的計算機寫入Cookie。然後,電子商務網站將讀取這些Cookie信息,並尋找寫入這些Cookie的網站,隨即發送包含了針對這個網站的相關產品廣告的垃圾郵件給這些高級人員。
偷竊Cookies和腳本攻擊
雖然Cookies沒有中電腦病毒那麼危險,但它仍包含了一些敏感消息:用戶名,電腦名,使用的瀏覽器和曾經訪問的網站。用戶不但願這些內容泄漏出去,尤爲是當其中還包含有私人信息的時候。
這並不是危言聳聽,跨站點腳本(Cross site scripting)能夠達到此目的。在受到跨站點腳本攻擊時,Cookie盜賊和Cookie毒藥將竊取內容。一旦Cookie落入攻擊者手中,它將會重現其價值。
Cookie盜賊:蒐集用戶Cookie併發給攻擊者的黑客。攻擊者將利用Cookie消息經過合法手段進入用戶賬戶。
Cookie投毒:通常認爲,Cookie在儲存和傳回服務器期間沒有被修改過,而攻擊者會在Cookie送回服務器以前對其進行修改,達到本身的目的。例如,在一個購物網站的Cookie中包含了顧客應付的款項,攻擊者將該值改小,達到少付款的目的。這就是Cookie投毒。
Cookies的替代品
鑑於Cookie的侷限和反對者的聲音,有以下一些替代方法:
- Brownie方案,是一項開放源代碼工程,由SourceForge發起。Brownie曾被用以共享在不一樣域中的接入,而Cookies則被構想成單一域中的接入。這項方案已經中止開發。
- P3P,用以讓用戶得到更多控制我的隱私權利的協議。在瀏覽網站時,它相似於Cookie。
- 在與服務器傳輸數據時,經過在地址後面添加惟一查詢串,讓服務器識別是否合法用戶,也能夠避免使用Cookie。
個人我的網址: wangyiming.info