Cookie意爲「甜餅」,是由W3C組織提出,最先由Netscape社區發展的一種機制。目前Cookie已經成爲標準,全部的主流瀏覽器如IE、Netscape、Firefox、Opera等都支持Cookie。程序員
爲了維持用戶在網站的狀態,好比登錄、購物車等,出現了前後出現了四種技術,分別是隱藏表單域、URL重寫、cookie、session。web
因爲HTTP是一種無狀態的協議,服務器單從網絡鏈接上無從知道客戶身份。怎麼辦呢?就給客戶端們頒發一個通行證吧,每人一個,不管誰訪問都必須攜帶本身通行證。這樣服務器就能從通行證上確認客戶身份了。這就是Cookie的工做原理。數據庫
當你在瀏覽網站的時候,WEB 服務器會先送一小小資料放在你的計算機上,Cookie 會幫你在網站上所打的文字或是一些選擇,都記錄下來。當下次你再光臨同一個網站,WEB 服務器會先看看有沒有它上次留下的 Cookie 資料,有的話,就會依據 Cookie裏的內容來判斷使用者,送出特定的網頁內容給你。 Cookie 的使用很廣泛,許多有提供我的化服務的網站,都是利用 Cookie來辨認使用者,以方便送出使用者量身定作的內容,同時也能夠緩解服務端的壓力,好比使用cookie以後,用戶不須要在短時間內頻繁查詢數據庫進行登陸,他能夠經過cookie進行直接登陸,固然,這也會帶來安全問題,一旦你的cookie被盜用,其餘人也能夠登陸網址。數組
Session 是存放在服務器端的,相似於Session結構來存放用戶數據,當瀏覽器 第一次發送請求時,服務器自動生成了一個Session和一個Session ID用來惟一標識這個Session,並將其經過響應發送到瀏覽器。當瀏覽器第二次發送請求,會將前一次服務器響應中的Session ID放在請求中一併發送到服務器上,服務器從請求中提取出Session ID,並和保存的全部Session ID進行對比,找到這個用戶對應的Session。瀏覽器
通常狀況下,服務器會在必定時間內(默認30分鐘)保存這個 Session,過了時間限制,就會銷燬這個Session。在銷燬以前,程序員能夠將用戶的一些數據以Key和Value的形式暫時存放在這個 Session中。固然,也有使用數據庫將這個Session序列號後保存起來的,這樣的好處是沒了時間的限制,壞處是隨着時間的增長,這個數據庫會急速膨脹,特別是訪問量增長的時候。通常仍是採起前一種方式,以減輕服務器壓力。安全
具體來講cookie機制採用的是在客戶端保持狀態的方案,而session機制採用的是在服務器端保持狀態的方案。同時咱們也看到,因爲採用服務器端保持狀態的方案在客戶端也須要保存一個標識,因此session機制可能須要藉助於cookie機制來達到保存標識的目的,但實際上它還有其餘選擇。服務器
簡單來講,cookie數據保存在客戶端,session數據保存在服務器端。cookie
瀏覽器cookie網絡
若是瀏覽器使用的是 cookie,那麼全部的數據都保存在瀏覽器端,好比你登陸之後,服務器設置了 cookie用戶名(username),那麼,當你再次請求服務器的時候,瀏覽器會將username一塊發送給服務器,這些變量有必定的特殊標記。服務器會解釋爲 cookie變量。因此只要不關閉瀏覽器,那麼 cookie變量便一直是有效的,因此可以保證長時間不掉線。若是你可以截獲某個用戶的 cookie變量,而後僞造一個數據包發送過去,那麼服務器仍是認爲你是合法的。因此,使用 cookie被攻擊的可能性比較大。若是設置了的有效時間,那麼它會將 cookie保存在客戶端的硬盤上,下次再訪問該網站的時候,瀏覽器先檢查有沒有 cookie,若是有的話,就讀取該 cookie,而後發送給服務器。若是你在機器上面保存了某個論壇 cookie,有效期是一年,若是有人入侵你的機器,將你的 cookie拷走,而後放在他的瀏覽器的目錄下面,那麼他登陸該網站的時候就是用你的的身份登陸的。因此 cookie是能夠僞造的。固然,僞造的時候須要主意,直接copy cookie文件到 cookie目錄,瀏覽器是不認的,他有一個index.dat文件,存儲了 cookie文件的創建時間,以及是否有修改,因此你必須先要有該網站的 cookie文件,而且要從保證時間上騙過瀏覽器。session
服務端session,客戶端sessionID
當你登陸一個網站的時候,若是web服務器端使用的是session,那麼全部的數據都保存在服務器上面,客戶端每次請求服務器的時候會發送當前會話的sessionid,服務器根據當前sessionid判斷相應的用戶數據標誌,以肯定用戶是否登陸,或具備某種權限。因爲數據是存儲在服務器 上面,因此你不能僞造,可是若是你可以獲取某個登陸用戶的sessionid,用特殊的瀏覽器僞造該用戶的請求也是可以成功的。sessionid是服務 器和客戶端連接時候隨機分配的,通常來講是不會有重複,但若是有大量的併發請求,也不是沒有重複的可能性,我曾經就遇到過一次。登陸某個網站,開始顯示的 是本身的信息,等一段時間超時了,一刷新,竟然顯示了別人的信息。
Session是由應用服務器維持的一個服務器端的存儲空間,用戶在鏈接服務器時,會由服務器生成一個惟一的SessionID,用該SessionID 爲標識符來存取服務器端的Session存儲空間。而SessionID這一數據則是保存到客戶端,用Cookie保存的,用戶提交頁面時,會將這一 SessionID提交到服務器端,來存取Session數據。這一過程,是不用開發人員干預的。因此一旦客戶端禁用Cookie,那麼Session也會失效。
服務器也能夠經過URL重寫的方式來傳遞SessionID的值,所以不是徹底依賴Cookie。若是客戶端Cookie禁用,則服務器能夠自動經過重寫URL的方式來保存Session的值,而且這個過程對程序員透明。
能夠試一下,即便不寫Cookie,在使用request.getCookies();取出的Cookie數組的長度也是1,而這個Cookie的名字就是SESSIONID,還有一個很長的二進制的字符串,是SessionID的值。
Cookies是屬於Session對象的一種。但有不一樣,Cookies不會佔服務器資源,是存在客服端內存或者一個cookie的文本文件中;而「Session」則會佔用服務器資源。因此,儘可能不要使用Session,而使用Cookies。可是咱們通常認爲cookie是不可靠的,session是可靠的,可是目前不少著名的站點也都用cookie。有時候爲了解決禁用cookie後的頁面處理,一般採用url重寫技術,調用session中大量有用的方法從session中獲取數據後置入頁面。
Cookies的安全性能一直是倍受爭議的。雖然Cookies是保存在本機上的,可是其信息的徹底可見性且易於本地編輯性,每每能夠引發不少的安全問題。因此Cookies到底該不應用,到底該怎樣用,就有了一個須要給定的底線。
session應用場景
cookie應用場景
語法:Set-Cookie: value[; expires=date][; domain=domain][; path=path][; secure]
a、value
value 部分,一般是一個 name=value 格式的字符串。事實上,這種格式是原始規範中指定的格式,可是瀏覽器並不會對 cookie 值按照此格式來驗證。實際上,你能夠指定一個不含等號的字符串,它一樣會被存儲。然而,最經常使用的使用方式是按照 name=value 格式來指定 cookie 的值(大多數接口只支持該格式)。
發送回服務器的cookie只包含cookie設置的值,而不包含cookie的其餘可選項,並且瀏覽器不會對cookie作任何更改,會原封不動的發送回服務器。當存在多個cookie時,用分號和空格隔開:
Cookie: name=value; name1=value1; name2=value2/pre>
b、cookie過時時間
若是不設置cookie過時時間,cookie會在會話結束後銷燬,稱爲會話cookie。若是想將會話cookie設置爲持久cookie,只需設置一下cookie的過時時間便可,該選項的值是一個 Wdy, DD-Mon-YYYY HH:MM:SS GMT 日期格式的值。注意這個失效日期則關聯了以 name-domain-path-secure 爲標識的 cookie。要改變一個 cookie 的失效日期,你必須指定一樣的組合。
持久cookie是沒法改爲會話cookie,除非刪除這個cookie,而後從新創建這個cookie。
c、domain 選項
domian選項設置了cookie的域,只有發向這個域的http請求才能攜帶這些cookie。通常狀況下domain會被設置爲建立該cookie的頁面所在的域名。
像 Yahoo! 這種大型網站,都會有許多 name.yahoo.com 形式的站點(例如:my.yahoo.com, finance.yahoo.com 等等)。將一個 cookie 的 domain 選項設置爲 yahoo.com,就能夠將該 cookie 的值發送至全部這些站點。瀏覽器會把 domain 的值與請求的域名作一個尾部比較(即從字符串的尾部開始比較),並將匹配的 cookie 發送至服務器。
d、path 選項
path選項和domain選項相似,只有包含指定path的http請求才能攜帶這些cookie。這個比較一般是將 path 選項的值與請求的 URL 從頭開始逐字符比較完成的。若是字符匹配,則發送 Cookie 消息頭,例如:
set-cookie:namevalue;path=/blog
因此包含/blog的http請求都會攜帶cookie信息。
e、secure 選項
該選項只是一個標記而沒有值。只有當一個請求經過 SSL 或 HTTPS 建立時,包含 secure 選項的 cookie 才能被髮送至服務器。這種 cookie 的內容具備很高的價值,若是以純文本形式傳遞頗有可能被篡改。
事實上,機密且敏感的信息毫不應該在 cookie 中存儲或傳輸,由於 cookie 的整個機制本來都是不安全的。默認狀況下,在 HTTPS 連接上傳輸的 cookie 都會被自動添加上 secure 選項。
f、HTTP-Only
HTTP-Only 的意思是告之瀏覽器該 cookie 毫不能經過 JavaScript 的 document.cookie 屬性訪問。設計該特徵意在提供一個安全措施來幫助阻止經過 JavaScript 發起的跨站腳本攻擊 (XSS) 竊取 cookie 的行爲。