一,、session和cookie:現(xiàn)在一般都是session和cookie一起用,一起提,。但是他們倆其實不是一定要在一起,。 session的產(chǎn)生原因是,http協(xié)議是無狀態(tài)的 這就導(dǎo)致了,,不同的用戶在操作時,,服務(wù)端無法知道是哪個用戶發(fā)來的請求,為了做這種區(qū)分,,服務(wù)器就要給每個客戶端分配不同的“身份標(biāo)識”,,然后客戶端每次向服務(wù)器發(fā)請求的時候,都帶上這個“身份標(biāo)識”,,服務(wù)器就知道這個請求來自于誰了,。至于客戶端怎么保存這個“身份標(biāo)識”,可以有很多種方式,,對于瀏覽器客戶端,,大家都默認(rèn)采用 cookie 的方式 session的使用流程一般為: 1.用戶在客戶端登錄后,服務(wù)器會跟據(jù)用戶信息生成一個sessionID 2.然后會把session存儲在redis,,數(shù)據(jù)庫等存儲媒介中 3.然后通過設(shè)置cookie的方式返回給客戶端,,既存放在瀏覽器的cookie中 4.客戶端在下一個請求時,會帶上cookie中的sessionid 5.然后服務(wù)端根據(jù)sessionid去查redis或者數(shù)據(jù)庫,,進行驗證,,來到達用戶校驗的目的 session存在的問題: 1.如果是單一的服務(wù)器,,那么使用session沒有問題,但是如果是集群服務(wù)器的話,,那就要做session同步了,,如果是4-5臺服務(wù)器還是可行的,但是如果集群有上百臺呢,,這樣session同步就會難以接受,,極大的增加了服務(wù)器的性能開銷 2.于是有人就想出,為session獨立部署一個服務(wù)器,,然后其他服務(wù)器訪問這個session服務(wù)來進行存取和驗證邏輯,,這樣就不需要做session同步了,但是這樣也存在風(fēng)險,,萬一這臺服務(wù)器掛了,,那整個系統(tǒng)都會受到牽連。 3.那么為這個session服務(wù)器再擴展,,也做成集群-session集群,,這也是一種可行的方案,但是非常累人 session是服務(wù)器端的,,cookie是瀏覽器端的cookie只是實現(xiàn)session的其中一種方案,。雖然是最常用的,但并不是唯一的方法,。禁用cookie后還有其他方法存儲,,比如放在url中現(xiàn)在后端服務(wù)都是分布式部署,session一般統(tǒng)一放在redis集群中,。這樣有個問題就是一旦redis故障,,可能會影響所有的用戶請求。所以,,在后臺進行session的存儲和運維這件事是非常重要和危險的,,對可靠性的要求非常高。 二,、Token:為了解決session產(chǎn)生的問題,,所以有了token,token意為“令牌”. 簡單來說,,就是服務(wù)端把用戶信息通過加密算法和一個只有服務(wù)端知道的密鑰,,來生成一個字符串,這個就是token. 然后客戶端下一次請求時帶上這個token,服務(wù)端拿到用戶信息后通過相同的算法和密鑰,,生成一個新的token和用戶請求里攜帶的token進行比對,,來完成用戶驗證。 token的流程一般是這樣的: 1.客戶端使用用戶名跟密碼請求登錄,, 2.驗證成功后,,服務(wù)端會通過加密算法,,如HMAC-SHA256,然后通過一個只有服務(wù)端知道的密鑰,,來生成一個token 3.服務(wù)端再把這個Token發(fā)送給客戶端,,服務(wù)端不會保存token 4.客戶端收到 Token 以后可以把它存儲起來,,比如放在 Cookie 里或者 Local Storage 里 5.客戶端每次向服務(wù)端請求資源的時候需要帶著服務(wù)端簽發(fā)的 Token 6.服務(wù)端收到請求,,然后會用相同的算法和密鑰去驗證token,如果通過,,執(zhí)行業(yè)務(wù)操作,,不通過,返回不通過信息 session時通過把所有session存起來,,而token則是通過算法和密鑰來驗證,。這樣的話就解決了session的問題,服務(wù)端不需要在存儲任何信息了,, 擴展起來就更方便,。 三、JWTJWT意為JSON Web Token ,,可以理解成是一種特殊的token,,也可以理解成是根據(jù)token的思路發(fā)展出來的一種具體的解決方案 Jwt原理和實現(xiàn):https://www.cnblogs.com/zhangyafei/p/12855294.html JWT 的幾個特點
|
|