其實簡單的說就是當用戶經過http協議訪問一個服務器的時候,這個服務器會將一些Name/Value鍵值對返回給客戶端瀏覽器,並將這些數據加上一些限制條件(中間件)。在條件符合時,這個用戶下次再訪問服務器的時候,數據又被完整的帶給服務器。web
由於http是一種無狀態協議,用戶首次訪問web站點的時候,服務器對用戶一無所知。而Cookie就像是服務器給每一個來訪問的用戶貼的標籤,而這些標籤就是對來訪問的客戶端的獨有的身份的一個標識,這裏就如同每一個人的身份證同樣,帶着你的我的信息。而當一個客戶端第一次鏈接過來的時候,服務端就會給他打一個標籤,這裏就如同給你發了一個身份證,當你下載帶着這個身份證來的時候,服務器就知道你是誰了。因此Cookie是存在客戶端的,這裏其實就是在你的瀏覽器中。瀏覽器
Cookie中包含了一個由名字=值(name = value)這樣的信息構成的任意列表,經過Set-Cookie或Set-Cookie2 HTTP響應(擴展)首部將其貼到客戶端身上。以下圖例子所示:安全
其實這裏有一個很是典型的應用,就是關於你登陸不少網站的帳號信息,你讓記住密碼以後,一段時間內,不須要輸入密碼,每次都是登陸狀態服務器
這裏Cookie主要分爲兩種:
會話Cookie:不設置過時時間,保存在瀏覽器的內存中,關閉瀏覽器,Cookie便被銷燬
普通Cookie:設置了過時時間,保存在硬盤上cookie
由於最開始的cookie是網景公司定義的,後來又有了RFC版本因此當前的Cookie有兩個版本:Version 0 Version 1 他們有兩種設置響應頭的標識,分別是:Set-Cookie和Set-Cookie2,這也形成了一些屬性的不一樣,這裏須要注意:經常使用的爲Version 0session
Version 0的屬性性能
NAME = Value :鍵值對設置要保存的Name/Value,這裏的name不能喝其餘屬性的名字同樣
Expires:過時時間
Domain:生成該Cookie的域名
Path: 該Cookie是在當前的哪一個路徑下生成
Secure:若是設置了這個屬性,那麼只會在SSH鏈接時纔會回傳該Cookie網站
Version 1的屬性spa
Name=VALUE:鍵值對設置要保存的Name/Value,這裏的name不能喝其餘屬性的名字同樣
Comment:主是想,用於說明該Cookie有什麼用途
CommentURL:該服務器爲此COokie提供URI註釋
Discard:是否在回話結束丟棄該Cookie,默認爲false
Domain:生成該Cookie的域名
Max-Age:最大失效時間,與Version 0不一樣的是這裏設置的是在多少秒後失效
Path:該Cookie是在當前的哪一個路徑下生成
Port:該 Cookie 在什麼端口下能夠回傳服務端,若是有多個端口,以逗號隔開
Secure:若是設置了這個屬性,那麼只會在SSH鏈接時纔會回傳該Cookie中間件
上面咱們知道了Cookie可讓服務器端跟蹤每一個客戶端的訪問,可是每次客戶端的訪問都必須傳回這些 Cookie,若是 Cookie 不少,這無形地增長了客戶端與服務端的數據傳輸量,而 Session 的出現正是爲了解決這個問題。
同一個客戶端每次和服務端交互時,不須要每次都傳回全部的Cookie值,而是隻要傳回一個ID這個ID是客戶端第一次訪問服務器的時候生成的,並且每一個客戶端是惟一的。這樣每一個客戶端就有了一個惟一的ID,客戶端只要傳回這個ID就好了,這個ID一般是NANE爲JSESIONID的一個Cookie。因此Session實際上是利用Cookie進行信息處理的。