有狀态登入和無狀态登入詳解
-
- 一 有狀态登入
- 二 無狀态登陸
-
- 無狀态登陸介紹:
- 無狀态token生成方式
-
- 一 Jwt方式
- 二 RSA256非對稱加密方式
- 三 差別與差異
- 四 參考連接配接
一 有狀态登入
有狀态登入(Session): 傳統上,我們會使用 Session 和 Cookie 來儲存使用者的授權資訊。
第一步,登入過程,使用者使用使用者名和密碼來登入系統,伺服器會來驗證使用者名和密碼是否正确,如果正确,伺服器會給這個使用者建立一個包含使用者登入資訊、角色、權限的一個叫做 Session 的東西,然後把這個 Session 儲存起來,同時把這個 Session 的 ID 以 Cookie 的形式發送給前端,表示使用者驗證成功,登入完成了;
第二步,接下來如果使用者希望通路某些資源,前端要向後端發起一個 HTTP 的請求,同時相應的 Cookie 也會跟随請求一起發送給伺服器,而伺服器取得 Cookie 以後就會去查找是否有 Session ID ,然後通過 Session ID 提取相應的 Session 來确定使用者的身份與權限,如果 Session 與 ID 相符,同時使用者的資訊也能提供相應的權限,伺服器就會認為這個使用者已經登入了,随後資源資訊就會通過 HTTP 響應給前端。
二 無狀态登陸
無狀态登陸介紹:
第一步:同樣是登陸,使用者使用使用者名和密碼登陸,如果登陸成功,伺服器就會傳回一個加密文檔,這個文檔就是 JWT ,其中包含使用者密碼以外,全部的認證資訊,包括使用者名、Email、角色、權限等等,而前端在拿到 這個JWT 以後就可以把它儲存起來了,可以儲存到 Cookie 中,也可以儲存到浏覽器的 LocaStorage 裡面,而生成的 JWT 不需要在後端儲存;
第二步:使用者如果需要通路某些權限的時候,這時候,使用者就要把 JWT 放在 HTTP 請求 herder 中與請求一起發送給伺服器,伺服器取得 JWT 以後 會使用私鑰給 JWT 文檔解密 ,如果解密成功而且資料依然有效則代表使用者已經登陸了,如果 JWT 所描述的使用者權限允許該使用者通路資源,那麼伺服器就會把資源的資訊,通過 HTTP 響應發回給前端。
無狀态token生成方式
一 Jwt方式
JWT其實是無狀态token實作方式之一。
上述JWT實際上通過JwtBuilder将使用者資訊、秘鑰和JWTID等建構成一個加密的字元串。 後續驗證時使用同一秘鑰建立JwtParser對JWT進行解析擷取相應的資訊。
二 RSA256非對稱加密方式
當然也可以使用其他加密方式對使用者資訊進行加密作為無狀态token來使用,
比如采用RSA256非對稱加密來生成公鑰私鑰,采用公鑰和使用者資訊進行加密生成無狀态Token,
采用私鑰對Token進行解密。
三 差別與差異
傳統上使用者登陸狀态會以 Session 的形式儲存在伺服器上,而 Session ID 則儲存在前端的 Cookie 中;而使用 JWT 以後,使用者的認證資訊将會以 Token 的形式儲存在前端,伺服器不需要儲存任何的使用者狀态,這也就是為什麼 JWT 被稱為無狀态登陸的原因,無狀态登陸最大的優勢就是完美支援分布式部署,可以使用一個 Token 發送給不同的伺服器,而所有的伺服器都會傳回同樣的結果。
四 參考連接配接
單點登陸和無狀态登陸
下述文章詳細的介紹了session 、token、jwt、cookie網上有些部落格混淆概念
token與JWT詳細介紹