cookie、session與token

1、詳述概念web

一、Cookie機制算法

cookie機制是採用在客戶端保持狀態的方案(cookie的做用就是爲了解決HTTP協議無狀態的缺陷所做的努力)。cookie的使用是由瀏覽器按照必定的原則在後臺自動發送給服務器的。瀏覽器檢查全部存儲的cookie,若是某個cookie所聲明的做用範圍大於等於將要請求的資源所在的位置,則把該cookie附在請求資源的HTTP請求頭上發送給服務器。後端

cookie的內容主要包括:名字、值、過時時間、路徑和域。api

路徑與域一塊兒構成cookie的做用範圍。瀏覽器

不設置過時時間,則表示這個cookie的生命期爲瀏覽器會話期間,關閉瀏覽器窗口,cookie就消失。這種生命期爲瀏覽器會話期的cookie被稱爲會話cookie.會話cookie通常不存儲在硬盤上而是保存在內存裏,固然這種行爲 並非規範規定的。安全

設置了過時時間,瀏覽器就會把cookie保存在硬盤上,關閉後再次打開瀏覽器,這些cookie仍然有效直到超過設定的過時時間。存儲在硬盤上的cookie能夠在不一樣的瀏覽器進程間共享,好比兩個IE窗口。而對於保存在內存裏cookie,不一樣的瀏覽器有不一樣的處理方式。服務器

 

二、Session機制restful

session機制是一種服務器端的機制,服務器使用一種相似於散列表的結構(也可能就是使用散列表)來保存信息。cookie

當程序須要爲某個客戶端的請求建立一個session時,服務器首先檢查這個客戶端的請求裏是否已包含了一個session標識(稱爲session id),若是已包含則說明之前已經爲此客戶端建立過session,服務器就按照session id把這個session檢索出來使用(檢索不到,會新建一個),若是客戶端請求不包含session id,則爲此客戶端建立一個session而且生成一個與此session相關聯的session id,session id的值應該是一個既不會重複,又不容易被找到規律以僞造的字符串,這個session id將被 在本次響應中返回給客戶端保存。保存這個session id的方式能夠採用cookie,這樣在交互過程當中瀏覽器 能夠自動的按照規則把這個標識發送給服務器。通常這個cookie的名字就是相似於SESSIONID。session

因爲cookie能夠被人爲的禁止,必須有其餘機制以便在cookie被禁止時仍然可以把session id傳遞迴服務器。

兩種方式:

第一種:URL重寫(經常使用),就是把session id直接附加在URL路徑的後面。

第二種:表單隱藏字段(現已不多使用)。就是服務器會自動修改表單,添加一個隱藏字段,以便在表單提交時可以把session id傳遞迴服務器。

三、token

token的意思是「令牌」,是用戶身份的驗證方式,最簡單的token組成:uid(用戶惟一的身份標識)、time(當前時間的時間戳)、sign(簽名,由token的前幾位+鹽以哈希算法壓縮成必定長的十六進制字符串,能夠防止惡意第三方拼接token請求服務器)。還能夠把不變的參數也放進token,避免屢次查庫

2、cookie與session的區別

一、cookie數據存放在客戶端上,session數據放在服務器上

二、cookie不是很安全,別人能夠分析存放在本地的COOKIE並進行COOKIE欺騙
   考慮到安全應當使用session。

三、session會在必定時間內保存在服務器上。當訪問增多,會比較佔用你服務器的性能
   考慮到減輕服務器性能方面,應當使用COOKIE。

四、單個cookie保存的數據不能超過4K,不少瀏覽器都限制一個站點最多保存20個cookie。

五、因此我的建議:
   將登錄信息等重要信息存放爲SESSION
   其餘信息若是須要保留,能夠放在COOKIE中

3、session與token的區別

  session 和 oauth token並不矛盾,做爲身份認證 token安全性比session好,由於每一個請求都有簽名還能防止監聽以及重放攻擊,而session就必須靠鏈路層來保障通信安全了。如上所說,若是你須要實現有狀態的會話,仍然能夠增長session來在服務器端保存一些狀態

  App一般用restful api跟server打交道。Rest是stateless的,也就是app不須要像browser那樣用cookie來保存session,所以用session token來標示本身就夠了,session/state由api server的邏輯處理。 若是你的後端不是stateless的rest api, 那麼你可能須要在app裏保存session.能夠在app裏嵌入webkit,用一個隱藏的browser來管理cookie session.

  Session 是一種HTTP存儲機制,目的是爲無狀態的HTTP提供的持久機制。所謂Session 認證只是簡單的把User 信息存儲到Session 裏,由於SID 的不可預測性,暫且認爲是安全的。這是一種認證手段。 而Token ,若是指的是OAuth Token 或相似的機制的話,提供的是 認證 和 受權認證是針對用戶,受權是針對App 。其目的是讓 某App有權利訪問 某用戶 的信息。這裏的 Token是惟一的。不能夠轉移到其它 App上,也不能夠轉到其它 用戶 上。 轉過來講Session 。Session只提供一種簡單的認證,即有此 SID,即認爲有此 User的所有權利。是須要嚴格保密的,這個數據應該只保存在站方,不該該共享給其它網站或者第三方App。 因此簡單來講,若是你的用戶數據可能須要和第三方共享,或者容許第三方調用 API 接口,用 Token 。若是永遠只是本身的網站,本身的 App,用什麼就無所謂了。

4、打破誤解:

「只要關閉瀏覽器 ,session就消失了」?

不對。對session來講,除非程序通知服務器刪除一個session,不然服務器會一直保留,程序通常都是在用戶作log off的時候發個指令去刪除session。

然而瀏覽器歷來不會主動在關閉以前通知服務器它將要關閉,所以服務器根本不會有機會知道瀏覽器已經關閉,之因此會有這種錯覺,是大部分session機制都使用會話cookie來保存session id,而關閉瀏覽器後這個session id就消失了,再次鏈接服務器時也就沒法找到原來的session。若是服務器設置的cookie被保存在硬盤上,或者使用某種手段改寫瀏覽器發出的HTTP請求頭,把原來的session id發送給服務器,則再次打開瀏覽器仍然可以打開原來的session.

偏偏是因爲關閉瀏覽器不會致使session被刪除,迫使服務器爲session設置了一個失效時間,當距離客戶端上一次使用session的時間超過這個失效時間時,服務器就能夠覺得客戶端已經中止了活動,纔會把session刪除以節省存儲空間。

相關文章
相關標籤/搜索