HTTP是一種無狀態的協議,爲了分辨連接是誰發起的,就須要咱們本身去解決這個問題。否則有些狀況下即便是同一個網站咱們每打開一個頁面也都要登陸一下。而Session和Cookie就是爲解決這個問題而提出來的兩個機制。html
平常登陸一個網站,今天輸入用戶名密碼登陸了,次日再打開不少狀況下就直接打開了。這個時候用到的一個機制就是cookie。api
session的一個場景是購物車,添加了商品以後客戶端處能夠知道添加了哪些商品,而服務器端如何判別呢,因此也須要存儲一些信息,這裏就用到了session。跨域
通俗講,Cookie是訪問某些網站之後在本地存儲的一些網站相關的信息,下次再訪問的時候減小一些步驟。另一個更準確的說法是:Cookies是服務器在本地機器上存儲的小段文本並隨每個請求發送至同一個服務器,是一種在客戶端保持狀態的方案。瀏覽器
Cookie的主要內容包括:名字,值,過時時間,路徑和域。使用Fiddler抓包就能夠看見,比方說咱們打開百度的某個網站能夠看到Headers包括Cookie,以下:安全
BIDUPSID: 9D2194F1CB8D1E56272947F6B0E5D47E PSTM: 1472480791 BAIDUID: 3C64D3C3F1753134D13C33AFD2B38367:FG ispeed_lsm: 2 MCITY: -131: pgv_pvi: 3797581824 pgv_si: s9468756992 BDUSS: JhNXVoQmhPYTVENEdIUnQ5S05xcHZMMVY5QzFRNVh5SzZoV0xMVDR6RzV-bEJZSVFBQUFBJCQAAAAAAAAAAAEAAACteXsbYnRfY2hpbGQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALlxKVi5cSlYZj BD_HOME: 1 H_PS_PSSID: 1423_21080_17001_21454_21408_21530_21377_21525_21193_21340 BD_UPN: 123253 sug: 3 sugstore: 0 ORIGIN: 0 bdime: 0
能夠看見是key, value的形式,也就是咱們說的對應着的名字,值。過時時間是能夠設置的,若是不設置,則瀏覽器關掉就消失了,是存儲在內存當中的,不然就是按照咱們設置的時間來存儲在硬盤上的,當過時後自動清除,比方說咱們開機關機關閉再打開瀏覽器後他都會還存在,前者稱之爲Session cookie 又叫 transient cookie,後者稱之爲Persistent cookie 又叫 permenent cookie。路徑和域就是對應的域名,a網站的cookie天然不能給b用。服務器
Session是存在服務器的一種用來存放用戶數據的類HashTable結構。cookie
當瀏覽器 第一次發送請求時,服務器自動生成了一個HashTable和一個Session ID用來惟一標識這個HashTable,並將其經過響應發送到瀏覽器。當瀏覽器第二次發送請求,會將前一次服務器響應中的Session ID放在請求中一併發送到服務器上,服務器從請求中提取出Session ID,並和保存的全部Session ID進行對比,找到這個用戶對應的HashTable。session
通常這個值會有一個時間限制,超時後毀掉這個值,默認是20分鐘。cors
Session的實現方式和Cookie有必定關係。試想一下,創建一個鏈接就生成一個session id,那麼打開幾個頁面就好幾個了,這顯然不是咱們想要的,那麼該怎麼區分呢?這裏就用到了Cookie,咱們能夠把session id存在Cookie中,而後每次訪問的時候將Session id帶過去就能夠識別了,是否是很方便~
經過上面的簡單敘述,很容易看出來最明顯的不一樣是一個在客戶端一個在服務端。由於Cookie存在客戶端因此用戶能夠看見,因此也能夠編輯僞造,不是十分安全。
Session過多的時候會消耗服務器資源,因此大型網站會有專門的Session服務器,而Cookie存在客戶端因此沒什麼問題。
域的支持範圍不同,比方說a.com的Cookie在a.com下都能用,而www.a.com的Session在api.a.com下都不能用,解決這個問題的辦法是JSONP或者跨域資源共享。
參考連接可能寫的更詳細,建議都看看,可能會了解的更全面。