徹底弄明白 Session 和 Token
大家好,我是了不起。
在構(gòu)建用戶身份管理系統(tǒng)時(shí),選擇會(huì)話(Session)還是令牌(Token)是一個(gè)關(guān)鍵決策,取決于系統(tǒng)的需求和特定的使用場(chǎng)景。本文將深入探討何時(shí)適合使用會(huì)話,何時(shí)適合使用令牌,以幫助開發(fā)人員在實(shí)際應(yīng)用中做出明智的選擇。
什么是Session
眾所周知,HTTP協(xié)議它是無狀態(tài)的協(xié)議,瀏覽器多次請(qǐng)求服務(wù)器,服務(wù)器它無法感知是不是同一用戶的請(qǐng)求,于是就有了Session機(jī)制。
Session機(jī)制是一種在Web開發(fā)中用于跟蹤用戶狀態(tài)的機(jī)制。
- 它的基本工作流程是,當(dāng)用戶第一次請(qǐng)求Web服務(wù)器時(shí),服務(wù)器會(huì)生成一個(gè)唯一的Session,并將其存儲(chǔ)在服務(wù)器端(通常可以持久化到數(shù)據(jù)庫(kù)中)。
- 然后,服務(wù)器通過響應(yīng)頭的方式將該Session的標(biāo)識(shí)符(SessionID)返回給瀏覽器,并存儲(chǔ)在瀏覽器的Cookie中。
- 隨后的每一次請(qǐng)求,瀏覽器都會(huì)將攜帶該SessionID,服務(wù)器通過SessionID找到對(duì)應(yīng)的Session,從而實(shí)現(xiàn)對(duì)用戶狀態(tài)的跟蹤。
然而,Session機(jī)制在分布式部署下存在一定弊端,尤其是在負(fù)載均衡環(huán)境中容易導(dǎo)致會(huì)話驗(yàn)證失敗。
什么是Token
為了解決Session機(jī)制的弊端,Token機(jī)制應(yīng)運(yùn)而生。
Token,也稱為令牌,一般由密鑰、公鑰、時(shí)間戳等元素通過加密算法(如MD5、SHA)生成。
在Token機(jī)制中,用戶在通過身份驗(yàn)證后,服務(wù)器會(huì)生成一個(gè)Token并返回給客戶端。客戶端在后續(xù)的每次請(qǐng)求中都攜帶這個(gè)Token,而服務(wù)器通過驗(yàn)證Token的合法性來判定請(qǐng)求是否有效。
Session與Token
相比Session,Token的優(yōu)勢(shì)在于它可以輕松應(yīng)對(duì)分布式部署和負(fù)載均衡環(huán)境,因?yàn)門oken是無狀態(tài)的,每個(gè)請(qǐng)求都攜帶了足夠的信息進(jìn)行驗(yàn)證,不依賴于特定的服務(wù)器節(jié)點(diǎn)。
這使得Token成為一種更為靈活和可擴(kuò)展的身份驗(yàn)證和授權(quán)機(jī)制。
相同點(diǎn):
- 身份驗(yàn)證手段: Session和Token都是用于用戶身份驗(yàn)證的手段,用于標(biāo)識(shí)用戶并維持其登錄狀態(tài)。
- 過期時(shí)間: 兩者都可以設(shè)置過期時(shí)間,限制了它們的有效期,增加安全性。
不同點(diǎn):
- 存儲(chǔ)位置:
Session: 存儲(chǔ)在服務(wù)器端,可以保存在內(nèi)存、數(shù)據(jù)庫(kù)、NoSQL等持久化存儲(chǔ)中。
Token: 存儲(chǔ)在客戶端,通常存儲(chǔ)在瀏覽器的Cookie中或本地存儲(chǔ)。
- 數(shù)據(jù)持久性:
- Session: 數(shù)據(jù)可以持久化到服務(wù)器端,但如果沒有進(jìn)行持久化,一旦服務(wù)器重啟,Session數(shù)據(jù)可能丟失。
- Token: 由于存儲(chǔ)在客戶端,Token本身是無狀態(tài)的,不受服務(wù)器重啟的影響。
- 數(shù)據(jù)交互方式:
- Session: 通過在請(qǐng)求頭中傳遞SessionID進(jìn)行數(shù)據(jù)交互。
- Token: 通過在請(qǐng)求頭或請(qǐng)求參數(shù)中攜帶Token進(jìn)行數(shù)據(jù)交互。
- 空間換時(shí)間 vs 時(shí)間換空間:
- Session: 采用空間換時(shí)間的策略,因?yàn)樾枰诜?wù)器端存儲(chǔ)Session數(shù)據(jù)。
- Token: 采用時(shí)間換空間的策略,因?yàn)門oken存儲(chǔ)在客戶端,不占用服務(wù)器端空間,每次驗(yàn)證都需要解析Token。
應(yīng)用場(chǎng)景
會(huì)話的應(yīng)用場(chǎng)景:
- Web 應(yīng)用中,通過 cookie 或服務(wù)器端存儲(chǔ)實(shí)現(xiàn)用戶登錄狀態(tài)的跟蹤。
- 需要在用戶訪問期間保持狀態(tài)信息的應(yīng)用,例如購(gòu)物車信息等。
令牌的應(yīng)用場(chǎng)景:
- token主要用于 Restful API 等無狀態(tài)應(yīng)用程序中,例如分布式系統(tǒng),通過 OAuth 進(jìn)行身份驗(yàn)證和授權(quán)。
- 移動(dòng)應(yīng)用或小程序中,使用 JSON Web Token (JWT) 進(jìn)行身份驗(yàn)證。
小結(jié)
session 和 token 本質(zhì)上是沒有區(qū)別的,都是對(duì)用戶身份的認(rèn)證機(jī)制。
在實(shí)際應(yīng)用中,需要根據(jù)具體需求權(quán)衡兩者之間的選擇,并采取相應(yīng)的安全措施來保障用戶身份的安全性和隱私。在不同的業(yè)務(wù)場(chǎng)景中合理選型,才能達(dá)到事半功倍的效果。