有人或許還停留在它們只是驗證身份信息的機制,但是它們之間的關系你真的弄懂了么?
發展史:
Coolie:
? ? ? ?Netscape Communications 公司引入了 Cookie 概念,作為在客戶端存儲狀態信息的一種方法。初始目的是為了解決 HTTP 的無狀態性,使網站能夠記住用戶并保持狀態。
Session:
HTTP 1.0 引入了基本的會話管理,通過在請求頭中添加 "Cookie" 字段來傳遞會話標識符。
Token:
? ? ? ?隨著移動應用和 API 的興起,基于 Token 的身份驗證得到了更多關注和應用。OAuth 2.0 的標準化推動了令牌在 web 開發中的應用,支持無狀態的身份驗證和授權。
? ? ? ?在以前,你去登錄一個網站,沒有個人的分別,所以也區不區分也無關緊要,但是隨著互聯網的發展,互聯網越來越重視你是誰?所以cookie就誕生了,它是一個存儲在客戶端的一小段數據,當用戶登錄的時候,由服務端發送給客戶端并存儲在客戶端本地,這樣就可以驗證用戶信息
但是這樣豈不對程序員美滋滋,我們假設有一個小窮(程序員)還有一個老富(頂級富豪)
賬戶轉錢:
老富:
?小窮:
?有一天,小窮通過技術手段搞到了老富的cookie,結果小窮差點吃公家飯?
?
? ? ? ?基于cookie這種不安全性,session逐漸問世,它是一種會話機制,用戶信息存儲在服務器上,這樣就相對于cookie比較安全
?小窮這時候留下了悔恨的眼淚!!!
? ? ? ?但是隨著時代的發展,由于用戶越來越多,一臺服務器已經扛不住了,單體架構逐漸被淘汰,分布式逐漸登上了歷史的舞臺,這時候,問題又來了,由于分布式是采取負載均衡的方式采取服務器請求的,所以我們不能僅限于一臺服務器進行存儲session,總不能每次發送請求的時候都要進行一次身份驗證,那么當時就有兩種情況可以解決這個問題:
1.單獨拎出來一個服務器,專門作為session的驗證
2.在每個服務器上都存儲一份session
? ? ? ?這兩種方式顯然對資源的一種浪費,數以千萬計的用戶的session占用的內存可不是一個小數目,所以我們的下一個主角又登場了——Token
? ? ? ? ?Token是一種輕量級的身份驗證和授權機制,一般是一小段字符串,當每次用戶成功登錄或請求時,服務器會生成一個Token(用戶ID、角色、權限以及一些元數據),通過使用密鑰對其進行加密和簽名確保安全性,下一次客戶端訪問時攜帶Token,服務器用相同的密鑰進行解密和檢驗簽名,確保安全性
?使用Token的效果既保障了安全問題又避免了資源浪費
?Token的優點真的數不勝數,列幾點:
- 安全性:經過了層層加密(加密和簽名)確保完整性和安全性
- 無狀態:服務器不需要在本地存儲會話數據,不需要維護會話狀態,更加容易擴展與分布式部署
- 跨域支持:Token可以通過HTTP請求頭、URL參數或者Cookie發送
- 靈活性:攜帶自定義的用戶信息
- 性能:無需服務器存儲和查詢會話狀態,提供服務器的性能和響應速度
- 輕量級:比傳統的會話更加輕量級(不需要在服務器上存儲狀態信息)
- 可擴展性:方便的擴展以及適應不同的需求
- 單點登錄:登錄一次訪問多個關聯應用
- 可移植性:不依賴于特定的編程語言
Cookie:
? ? ? ?Cookie是存儲在用戶瀏覽器中的小段數據,由服務器發送給客戶端并存儲在客戶端本地。它通常用于持久性存儲一些用戶相關的信息,如登錄憑證、用戶偏好設置等,Cookie可以設置過期時間,可以是會話級別的(在用戶關閉瀏覽器后過期)或者是長期的(設置特定的過期時間),由于存儲在客戶端,Cookie可以在用戶訪問不同頁面時被瀏覽器自動發送到服務器
Session:
? ? ? ?會話是一種服務器機制,用于跟蹤用戶在網站上的活動,服務器在用戶訪問網站時為每個用戶創建一個唯一的會話標識(Session ID),這個標識存儲在Cookie中或者通過URL參數傳遞,然后,服務器可以根據會話標識來識別特定的用戶,并在服務器端存儲用戶狀態信息,以便跟蹤用戶的狀態和數據,會話數據通常在服務器上存儲,因此相對安全
Token:
? ? ? ?Token是一種輕量級的身份驗證和授權機制,廣泛用于構建于API的 應用和單點登錄系統,用戶登錄后,服務器會頒發一個Token,包含有關用戶身份的信息和一些元數據,這個Token被用戶保存,并在每次向服務器發送請求時隨請求一起發送,服務器可以驗證Token的有效性,并根據Token中的信息執行身份驗證和授權,Token可以是短期的,也可以是長期的,但是為了安全性通常會有過期時間