cookie
、session
和token
是解決“發(fā)出請求的用戶是誰”問題的三種解決方案稍途。
他們不是完全獨立的雷猪,是互有關(guān)聯(lián)的。
cookie
作為最早解決“發(fā)出請求用戶是誰”問題的方案晰房,使用時求摇,服務(wù)端將用戶的信息直接寫入cookie
射沟,通過請求頭下發(fā)給用戶,用戶發(fā)出請求時与境,會將下發(fā)信息返回服務(wù)端验夯,服務(wù)端取出cookie
中的信息,判斷用戶登錄情況摔刁,eg.當(dāng)用戶登錄成功時挥转,將isLogin=true
存入cookie
,一起下發(fā)給客戶端共屈,然后當(dāng)用戶發(fā)出某個需要登錄以后才能才做的請求時绑谣,服務(wù)端會去檢查cookie
,判斷isLogin
字段是否存在拗引,是否為true
借宵。
由于明文保存敏感信息在cookie
中,存在cookie
中信息被篡改的風(fēng)險矾削,比如存入了用戶id和登錄狀態(tài)后壤玫,用戶id被修改,就可以獲取其他用戶的權(quán)限哼凯,這顯然是不能被接受的欲间,于是出現(xiàn)了安全性更高的session
方法。
session
方法實際上是在cookie
方式上的一種改進(jìn)断部,在用戶登錄成功后猎贴,不再在cookie
中存入敏感信息,而是存入一些標(biāo)識符蝴光,即session_id
她渴,即一串隨機(jī)生成的字符串,如session_id=aasdasdwq112131111
虱疏,將這串字符串作為key
惹骂,將用戶的信息作為value
存入到內(nèi)存或數(shù)據(jù)庫中,當(dāng)用戶發(fā)起需要登錄權(quán)限請求的操作時做瞪,服務(wù)端從cookie
中取出session_id
對應(yīng)的值对粪,將該值作為key
,從之前保存的地方取出用戶信息装蓬,判斷登錄狀態(tài)著拭。
這種方式能夠在一定程度上保證用戶信息的安全,但又會面臨新的問題牍帚,即用戶數(shù)量一旦達(dá)到千萬級儡遮,服務(wù)端內(nèi)存的開銷是非常大的,而且多個服務(wù)器之間session
的維護(hù)是比較麻煩的暗赶,即使使用session
服務(wù)器方式去處理鄙币,也會面臨單點登錄帶來的風(fēng)險肃叶,于是token
驗證方式產(chǎn)生了。
token
方式也是cookie
方式的一種延伸十嘿,當(dāng)?shù)卿浲瓿蓵r因惭,將一些不敏感的信息,加上秘鑰绩衷,進(jìn)行簽名蹦魔,將不敏感信息和簽名通過cookie
一起下發(fā)給客戶端(也可以通過其他方式下發(fā)),客戶端在請求需要登錄權(quán)限接口時咳燕,將之前下發(fā)的信息一起發(fā)給服務(wù)端勿决,服務(wù)端對其中不敏感信息進(jìn)行簽名,然后和客戶端上傳上來的簽名進(jìn)行對比招盲,一致時說明用戶登錄成功低缩。這種方式就很好的解決了多用戶session
內(nèi)存開銷過大,服務(wù)端單點登錄等問題宪肖。
session
和token
本質(zhì)區(qū)別是session
是用空間換時間表制,而token
是用時間換空間健爬,各有利弊控乾。