Cookie、Token與Session介紹(非原創)

文章大綱

一、Cookie介紹
二、Token介紹
三、Session介紹
四、Token、Cookie與Session比較
五、參考文章

 

一、Cookie介紹

1. Cookie是什麼

cookie機制是採用在客戶端保持狀態的方案(cookie的作用就是爲了解決HTTP協議無狀態的缺陷所作的努力)。cookie的使用是由瀏覽器按照一定的原則在後臺自動發送給服務器的。瀏覽器檢查所有存儲的cookie,如果某個cookie所聲明的作用範圍大於等於將要請求的資源所在的位置,則把該cookie附在請求資源的HTTP請求頭上發送給服務器。
cookie的內容主要包括:名字、值、過期時間、路徑和域。
路徑與域一起構成cookie的作用範圍。
若不設置過期時間,則表示這個cookie的生命期爲瀏覽器會話期間,關閉瀏覽器窗口,cookie就消失。這種生命期爲瀏覽器會話期的cookie被稱爲會話cookie.會話cookie一般不存儲在硬盤上而是保存在內存裏,當然這種行爲 並不是規範規定的。
若設置了過期時間,瀏覽器就會把cookie保存在硬盤上,關閉後再次打開瀏覽器,這些cookie仍然有效直到超過設定的過期時間。存儲在硬盤上的cookie可以在不同的瀏覽器進程間共享,比如兩個IE窗口。而對於保存在內存裏cookie,不同的瀏覽器有不同的處理方式。

2. cookie缺點

(1)CSRF(跨站請求僞造)攻擊,這個也好解決,很多框架都屏蔽這個問題
(2)有的客戶端不支持cookie,需要手動設置,比如小程序
(3)瀏覽器對cookie有限制,不能手動設置cookie,對於混合嵌套的開發有問題,比如小程序跳轉H5頁面,不能攜帶cookie
(4)瀏覽器對單個cookie保存的數據不能超過4K,很多瀏覽器都限制一個站點最多保存20個cookie

二、Token介紹

1. Token是什麼

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

2. Token生成過程

請求過程:
1、客戶端向服務器請求,發送用戶名和密碼
2、服務器根據用戶信息通過加密生成token,用戶信息包括賬號,token過期時間等,具體由服務器自定義。
3、服務器返回token給客戶端
4、客戶端用cookie存儲token,以後的請求都帶上這個token
5、服務器把token解密,確認用戶信息是否正確,如經過正確就說明驗證通過。
6、服務器把驗證結果返回客戶端

 

三、Session介紹

1. Session是什麼

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

2. Session生成過程

請求過程:
1、客戶端向服務器請求,發送用戶名和密碼
2、服務器生成sessionId,綁定用戶數據存儲在數據庫
3、服務器返回sessionId給客戶端
4、客戶端用cookie存儲sessionId,以後的請求都帶上這個sessionId
5、服務器如果收到這個sessionId,那麼就去數據庫查找用戶數據,如果找到了說明驗證通過
6、服務器把驗證結果返回客戶端

 

3. Session缺點

(1)負載均衡多服務器的情況,不好確認當前用戶是否登錄,因爲多服務器不共享seesion。這個問題也可以將session存在一個服務器中來解決,但是就不能完全達到負載均衡的效果。
(2)每個客戶端只需存儲自己的session id,但是服務端卻需要存儲所有用戶session id,對服務器也是一個壓力

四、Token、Cookie與Session比較

1. Cookie與Session的區別

(1)cookie數據存放在客戶端上,session數據放在服務器上。
(2)cookie不是很安全,別人可以分析存放在本地的COOKIE並進行COOKIE欺騙
考慮到安全應當使用session。
(3)session會在一定時間內保存在服務器上。當訪問增多,會比較佔用你服務器的性能
考慮到減輕服務器性能方面,應當使用COOKIE。
(4)單個cookie保存的數據不能超過4K,很多瀏覽器都限制一個站點最多保存20個cookie。
(5)所以個人建議:
將登陸信息等重要信息存放爲SESSION
其他信息如果需要保留,可以放在COOKIE中

2. 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,用什麼就無所謂了。
  “只要關閉瀏覽器 ,session就消失了”?不對。對session來說,除非程序通知服務器刪除一個session,否則服務器會一直保留,程序一般都是在用戶做log off的時候發個指令去刪除session。
  然而瀏覽器從來不會主動在關閉之前通知服務器它將要關閉,因此服務器根本不會有機會知道瀏覽器已經關閉,之所以會有這種錯覺,是大部分session機制都使用會話cookie來保存session id,而關閉瀏覽器後這個session id就消失了,再次連接服務器時也就無法找到原來的session。如果服務器設置的cookie被保存在硬盤上,或者使用某種手段改寫瀏覽器發出的HTTP請求頭,把原來的session id發送給服務器,則再次打開瀏覽器仍然能夠打開原來的session.
  恰恰是由於關閉瀏覽器不會導致session被刪除,迫使服務器爲session設置了一個失效時間,當距離客戶端上一次使用session的時間超過這個失效時間時,服務器就可以以爲客戶端已經停止了活動,纔會把session刪除以節省存儲空間。

五、參考文章

    1. https://junyiseo.com/php/757.html
    2. https://blog.csdn.net/Double2hao/article/details/83744659
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章