Cookie概述
HTTP是一種無狀態(tài)的請求/響應協(xié)議,用戶通過瀏覽器訪問Web站點后,Web服務端沒有可用信息來判斷是哪個用戶發(fā)起的請求,更加無法知道下次訪問的還是不是上次訪問的用戶,無法識別當前用戶。最初,為了解決這個問題出現(xiàn)了很多解決方案,例如客戶端IP地址跟蹤、用戶登錄認證、URL中嵌入識別信息等,但都沒有很好的解決根本問題。然而,Cookie的設計實現(xiàn)很好的解決了這個問題。用戶通過瀏覽器訪問Web站點后,服務端會將一些Key/Value組合的鍵值對通過Set-Cookie或Set-Cookie2返回給瀏覽器,用戶再次訪問Web站點時瀏覽器會將符合條件的鍵值對再發(fā)送給服務端,這樣服務端就可以通過這個鍵值信息識別出當前用戶。
Cookie分類
Cookie可以分為兩類:會話Cookie和持久Cookie。會話Cookie是一種臨時Cookie,沒有設置它的有效期,當用戶退出瀏覽器的時候,它將會被刪除。當設置了Cookie的有效期后,它就是持久Cookie,它可以被存儲到硬盤上,當用戶退出瀏覽器或機器重啟時,它依然存在,可以被再次讀取使用。
Cookie版本
當前可使用的Cookie規(guī)范有兩個版本:Cookie版本0和Cookie版本1。Cookie版本1是對Cookie版本0的擴展,版本1可以和版本0互操作,但是Cookie版本1沒有Cookie版本0使用的廣泛。
Cookie版本0屬性
版本0定義了Set-Cookie響應首部、Cookie請求首部。
Set-Cookie響應首部,其實就是服務端返回的Cookie信息,具體的語法如下:
Set-Cookie:key=value;expires=date;domain=domain;path=path;secure
Key/value表示在服務端可跟蹤、可識別的用戶信息;expires表示Cookie的結束日期,如果沒指定,Cookie會在用戶退出瀏覽器時過期;domain告訴瀏覽器這個Cookie可以被發(fā)送到哪個域名,如果沒指定,默認為產生Cookie的服務器主機名,瀏覽器會存儲很多不同網(wǎng)站的Cookie,瀏覽器會根據(jù)domain的值將Cookie發(fā)送到對應的域名下;path指定Cookie對哪些請求路徑生效,如果沒指定,默認為產生Cookie的URL路徑;secure表示在使用SSL安全連接時才發(fā)送Cookie,若沒設置secure,則沒限制。例如:
Set-Cookie:member_id=1496800101;expires=Tuesday 16-Aug-01 22:10:11 GMT;domain=“abc.com";path=/member;secure
Cookie請求首部,就是瀏覽器請求服務端時發(fā)送的Cookie信息,具體語法如下:
Cookie:key1=value1;key2=value2;key3=value3...
例如:
Cookie:member_id=1496800101
Cookie版本1屬性
版本1定義了Set-Cookie2響應首部、Cookie2請求首部。這個版本做了如下一些改動:
為每個Cookie添加了解釋性文本,用于解釋其目的;
用戶退出瀏覽器時,允許不考慮過期時間,將Cookie銷毀;
使用相對秒數(shù)來設置Cookie的生存時間;
對Cookie的生效限制,添加了端口條件,可以通過domain、path和port來共同限制;
在發(fā)送Cookie請求首部時,會將domain、path和port一起發(fā)送到服務端;
為了實現(xiàn)版本的互操作,使用版本號;
使用$前綴來附加服務端返回的Cookie信息。
Set-Cookie2響應首部具體語法如下:
Set-Cookie2:key=value;Version=“1”;Comment=Comment;CommentURL=CommentURL;Discard;Max-Age=age;domain=domain;path=path;Port=Port;secure
Version對于Cookie規(guī)范的版本;Comment說明服務器如何去使用這個Cookie;CommentURL表示一個URL,指向描述該Cookie的文檔;Discard表示如果設置此標識,會在瀏覽器退出時放棄此Cookie;Max-Age使用相對當前時間的秒數(shù)來設置Cookie的生命周期;Port表示對Cookie生效的端口,多個端口可用逗號分隔。
Cookie2請求首部會回傳每個Cookie的附加信息,也就是Set-Cookie2中的屬性信息,例如:
Cookie:$Version=“1”;member_id=14690801;$Domain=“abc.com”;$path=/member
Cookie缺點
雖然Cookie可以很好的解決識別用戶的問題,但是,它也有很多的缺點:
不安全,容易被破壞或盜取;
Cookie存儲在瀏覽器中,瀏覽器對Cookie的數(shù)量和大小有限制;
Cookie中數(shù)據(jù)量很大時對性能和帶寬有所損耗。