天天看點

有狀态登入和無狀态登入詳解

有狀态登入和無狀态登入詳解

    • 一 有狀态登入
    • 二 無狀态登陸
      • 無狀态登陸介紹:
      • 無狀态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詳細介紹