1、概念理解:html
首先cookie是服務端識別客戶的惟一標識的依據,客戶在訪問網站時候,服務端爲了記住這個客戶,會在服務端按照它的規則製做一個cookie數據,會將這個cookie數據保留在服務端一段時間,同時會給客戶的一份它本身保留,這樣就無需每次都要登陸來認證本身了。 跨域
先來了解幾個概念。瀏覽器
一、無狀態的HTTP協議:安全
協議是指計算機通訊網絡中兩臺計算機之間進行通訊所必須共同遵照的規定或規則,超文本傳輸協議(HTTP)是一種通訊協議,它容許將超文本標記語言(HTML)文檔從Web服務器服務器
傳送到客戶端的瀏覽器。cookie
HTTP協議是無狀態的協議。一旦數據交換完畢,客戶端與服務器端的鏈接就會關閉,再次交換數據須要創建新的鏈接。這
就意味着服務器沒法從鏈接上跟蹤會話。網絡
二、會話(Session)跟蹤:session
會話,指用戶登陸網站後的一系列動做,好比瀏覽商品添加到購物車併購買。會話(Session)跟蹤是Web程序中經常使用的技術,用來跟蹤用戶的整個會話。經常使用的會話跟蹤技術dom
是Cookie與Session。Cookie經過在客戶端記錄信息肯定用戶身份,Session經過在服務器端記錄信息肯定
2、Cookie
因爲HTTP是一種無狀態的協議,服務器單從網絡鏈接上無從知道客戶身份。服務器要想識別每一個客戶端,怎麼辦,那就給每一個訪問個人用戶的客戶的一個通行證,這樣服務器就能從通行證上確認客戶身份了,這個通行證就是cookie的工做原理。
ide
Cookie其實是一小段的文本信息。客戶端請求服務器,若是服務器須要記錄該用戶狀態,就使用response向客戶端瀏覽器頒發一個Cookie。客戶端會把Cookie保存起來。
當瀏覽器再請求該網站時,瀏覽器把請求的網址連同該Cookie一同提交給服務器。服務器檢查該Cookie,以此來辨認用戶狀態。服務器還能夠根據須要修改Cookie的內容。
一、cookie的內容主要包括:名字,值,過時時間,路徑和域。路徑與域一塊兒構成cookie的做用範圍。
#Name 和 Value 屬性由程序設定,默認值都是空引用。
#Domain屬性的默認值爲當前URL的域名部分,無論發出這個cookie的頁面在哪一個目錄下的。
#Path屬性的默認值是根目錄,即 」/」 ,無論發出這個cookie的頁面在哪一個目錄下的。能夠由程序設置爲必定的路徑來進一步限制此cookie的做用範圍。
#Expires 屬性,這個屬性設置此Cookie 的過時日期和時間。
二、Path和Domain屬性
--path: 若是http://www.china.com/test/index.html 創建了一個cookie,那麼在http://www.china.com/test/目錄裏的全部頁面,以及該目錄下面任何子目錄裏 的頁面均可以訪問這個cookie。這就是說,在http://www.china.com/test/test2/test3 裏的任何頁面均可以訪問http://www.china.com/test/index.html 創建的cookie。可是,若是http://www.china.com/test/ 須要訪問http://www.china.com/test/index.html設置的cookes,該怎麼辦? 這時,咱們要把cookies的path屬性設置成「/」。在指定路徑的時候,凡是來自同一服務器,URL裏有相同路徑的全部WEB頁面均可以共享cookies。 --Domain: 好比: http://www.baidu.com/xxx/login.aspx 頁面中發出一個cookie,Domain屬性缺省就是www.baidu.com ,能夠由程序設置此屬性爲須要的值。 值是域名,好比www.china.com。這是對path路徑屬性的一個延伸。若是咱們想讓 www.china.com可以訪問bbs.china.com設置的cookies,該怎麼辦? 咱們能夠把 domain屬性設置成「china.com」, 並把path屬性設置成「/」。 3、會話Cookie和持久Cookie 若不設置過時時間,則表示這個cookie的生命期爲瀏覽器會話期間,關閉瀏覽器窗口,cookie就消失。這種生命期爲瀏覽器會話期的cookie被稱爲會話cookie。會話cookie通常不存儲在 硬盤上而是保存在內存裏,固然這種行爲並非規範規定的。 若設置了過時時間,瀏覽器就會把cookie保存到硬盤上,關閉後再次打開瀏覽器,這些cookie仍然有效直到超過設定的過時時間。存儲在硬盤上的cookie能夠在瀏覽器的不一樣進程間共享。 這種稱爲持久Cookie。
Cookie具備不可跨域名性
就是說,瀏覽器訪問百度不會帶上谷歌的cookie。
三. Session
Session是另外一種記錄客戶狀態的機制,不一樣的是Cookie保存在客戶端瀏覽器中,而Session保存在服務器上。客戶端瀏覽器訪問服務器的時候,服務器把客戶端信息以某種形式記錄
在服務器上。這就是Session。客戶端瀏覽器再次訪問時只須要從該Session中查找該客戶的狀態就能夠了。
每一個用戶訪問服務器都會創建一個session,那服務器是怎麼標識用戶的惟一身份呢?事實上,用戶與服務器創建鏈接的同時,服務器會自動爲其分配一個SessionId。
①、咱們須要知道:
1)SessionId的重要性:
什麼東西可讓你每次請求都把SessionId自動帶到服務器呢?顯然就是cookie了,若是你想爲用戶創建一次會話,能夠在用戶受權成功時給他一個惟一的cookie。當一個用戶提交了表單時,瀏覽器會將用戶的SessionId自動附加在HTTP頭信息中,(這是瀏覽器的自動功能,用戶不會察覺到),當服務器處理完這個表單後,將結果返回給SessionId所對應的用戶。試想,若是沒有 SessionId,當有兩個用戶同時進行註冊時,服務器怎樣才能知道究竟是哪一個用戶提交了哪一個表單呢。
2)儲存須要的信息。服務器經過SessionId做爲key,讀寫到對應的value,這就達到了保持會話信息的目的。
②、session的建立:
當程序須要爲某個客戶端的請求建立一個session時,服務器首先檢查這個客戶端的請求裏是否已包含了sessionId,若是已包含則說明之前已經爲此客戶端建立過session,服務器就按照sessionId把這個session檢索出來使用(檢索不到,會新建一個),若是客戶端請求不包含sessionId,則爲此客戶端建立一個session而且生成一個與此session相關聯的sessionId,sessionId的值是一個既不會重複,又不容易被找到規律以仿造的字符串,這個sessionId將被在本次響應中返回給客戶端保存。
③、禁用cookie和session共享
禁用cookie: 若是客戶端禁用了cookie,一般有兩種方法實現session而不依賴cookie。 1)URL重寫,就是把sessionId直接附加在URL路徑的後面。 2)表單隱藏字段。就是服務器會自動修改表單,添加一個隱藏字段,以便在表單提交時可以把session id傳遞迴服務器。好比: <form name="testform" action="/xxx"> <input type="hidden" name="jsessionid" value="ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764"> <input type="text"> </form> Session共享: 對於多網站(同一父域不一樣子域)單服務器,咱們須要解決的就是來自不一樣網站之間SessionId的共享。因爲域名不一樣(aaa.test.com和bbb.test.com),而SessionId又分別儲存在各自的cookie中,所以服務器會認爲對於兩個子站的訪問,是來自不一樣的會話。解決的方法是經過修改cookies的域名爲父域名達到cookie共享的目的,從而實現SessionId的共享。帶來的弊端就是,子站間的cookie信息也同時被共享了。
4、總結:
一、咱們須要知道cookie在客戶端,session在服務端,cookie的產生是在服務端產生的
二、cookie只是一個通行證,但並非安全的,任何安全的校驗必需要在服務端上完成,cookie只是存在客戶端上面的一個惟一標識它且由服務端定製的信息,本地能夠改,可是無論怎麼改,最後仍是須要把它拿上發送給服務端進行匹配校驗
三、session和cookie的存儲都存在時效性,這是頗有必要的
四、單個cookie保存的數據不能超過4kb,不少瀏覽器都限制了一個站點最多保存20個cookie
五、不論是cookie仍是session,都是創建在安全性的大前提下,session中不只僅有cookie的信息,同時會有該用戶的相關重要且安全的信息存儲,因此session是在服務器的,而cookie只是服務器將一些不重要的信息拿出來丟給客戶的存在,以備之後快速匹配校驗用。