幾句話說清session,cookie和token的區(qū)別及說明
一、cookie和session實際上是同一套認(rèn)證流程,相輔相成
cookie保存在客戶端
(通常保存session的sessionID,這個sessionID是一個毫無規(guī)則的隨機(jī)數(shù),由服務(wù)器在客戶端登錄通過后隨機(jī)生產(chǎn)的。
客戶端每次訪問該網(wǎng)站都要帶上這個由sessionID組成的cookie。
服務(wù)器收到請求,首先拿到客戶端的sessionID,然后從服務(wù)器內(nèi)存中查詢它所代表的客戶端(用戶名,用戶組,有哪些權(quán)限等)。)
session保存在服務(wù)器
(用于記錄客戶狀態(tài),比如我們經(jīng)常會用session保存客戶的基本信息、權(quán)限信息等)
二、token則可以服務(wù)器完全不用保存任何登錄信息
客戶端可以將Token保存到任何地方,無限制,無狀態(tài),利于分布式部署。
整體的流程是這樣的:
- 客戶端使用用戶名、密碼做身份驗證;
- 服務(wù)端收到請求后進(jìn)行身份驗證;(也可能是統(tǒng)一登錄平臺、網(wǎng)關(guān))
- 驗證成功后,服務(wù)端會生成一堆客戶端身份信息,包括用戶名、用戶組、有那些權(quán)限、過期時間等等。這個整體就叫做token。簽發(fā)一個Token后返回給客戶端;
- 客戶端收到Token以后可以把它存儲起來(可以放在隨意的數(shù)據(jù)庫中,例如Redis);每次向服務(wù)端發(fā)送請求的時候,都要帶著Token;
- Token會有過期時間,過期后需要重新進(jìn)行驗證;
- 服務(wù)端收到請求,會驗證客戶端請求里面的Token,驗證成功,才會響應(yīng)客戶端的請求;
三、為何誕生這些
由于HTTP無狀態(tài)的特性,如果要實話客戶端和服務(wù)器端的會話保持,那就需要其它機(jī)制來實現(xiàn),于是Cookie和Session應(yīng)運(yùn)而生。
Session和Cookie機(jī)制來保持會話,會存在一個問題:客戶端瀏覽器只要保存自己的SessionID即可,而服務(wù)器卻要保存所有用戶的Session信息,這對于服務(wù)器來說開銷較大,而且不利用服務(wù)器的擴(kuò)展(比如服務(wù)器集群時,Session如何同步存儲就是個問題)!
于是有人思考,如果把Session信息讓客戶端來保管而且無法偽造不就可以解決這個問題了?進(jìn)而有了Token機(jī)制。
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringMVC框架post提交數(shù)據(jù)庫出現(xiàn)亂碼解決方案
這篇文章主要介紹了SpringMVC框架post提交數(shù)據(jù)庫出現(xiàn)亂碼解決方案,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-09-09SpringBoot深入探究四種靜態(tài)資源訪問的方式
這一節(jié)詳細(xì)的學(xué)習(xí)一下SpringBoot的靜態(tài)資源訪問相關(guān)的知識點(diǎn)。像這樣的知識點(diǎn)還挺多,比如SpringBoot2的Junit單元測試等等。本章我們來了解靜態(tài)資源訪問的四種方式2022-05-05Java和MySQL數(shù)據(jù)庫中關(guān)于小數(shù)的保存問題詳析
在Java和MySQL中小數(shù)的精度可能會受到限制,如float類型的小數(shù)只能精確到6-7位,double類型也只能精確到15-16位,這篇文章主要給大家介紹了關(guān)于Java和MySQL數(shù)據(jù)庫中關(guān)于小數(shù)的保存問題,需要的朋友可以參考下2024-01-01簡單談?wù)凧ava中String類型的參數(shù)傳遞問題
這篇文章主要介紹了簡單談?wù)凧ava中String類型的參數(shù)傳遞問題的相關(guān)資料,需要的朋友可以參考下2015-12-12