天天看點

jet token過期是定時的還是無操作_精讀:token的會話保持機制,密鑰不能洩露session簡介#基于token的認證#基于JWT的token認證實作#JWT的使用說明#關于JWT的一個問題#

jet token過期是定時的還是無操作_精讀:token的會話保持機制,密鑰不能洩露session簡介#基于token的認證#基于JWT的token認證實作#JWT的使用說明#關于JWT的一個問題#

session簡介#

做過Web開發的程式員應該對Session都比較熟悉,Session是一塊儲存在伺服器端的記憶體空間,一般用于儲存使用者的會話資訊。

jet token過期是定時的還是無操作_精讀:token的會話保持機制,密鑰不能洩露session簡介#基于token的認證#基于JWT的token認證實作#JWT的使用說明#關于JWT的一個問題#

使用者通過使用者名和密碼登陸成功之後,伺服器端程式會在伺服器端開辟一塊Session記憶體空間并将使用者的資訊存入這塊空間,同時伺服器會在cookie中寫入一個Session_id的值,這個值用于辨別這個記憶體空間。

下次使用者再來通路的話會帶着這個cookie中的session_id,伺服器拿着這個id去尋找對應的session,如果session中已經有了這個使用者的登陸資訊,則說明使用者已經登陸過了。

使用Session保持會話資訊使用起來非常簡單,技術也非常成熟。但是也存在下面的幾個問題:

  • 伺服器壓力大:通常Session是存儲在記憶體中的,每個使用者通過認證之後都會将session資料儲存在伺服器的記憶體中,而當使用者量增大時,伺服器的壓力增大。
  • Session共享:現在很多應用都是分布式叢集,需要我們做額外的操作進行Session共享;
  • CSRF跨站僞造請求攻擊:Session機制是基于浏覽器端的cookie的,cookie如果被截獲,使用者就會很容易受到跨站請求僞造的攻擊。

基于token的認證#

基于token的認證機制将認證資訊傳回給用戶端并存儲。下次通路其他頁面,需要從用戶端傳遞認證資訊回服務端。簡單的流程如下:

  • 用戶端使用使用者名跟密碼請求登入;
  • 服務端收到請求,去驗證使用者名與密碼;
  • 驗證成功後,服務端會簽發一個 Token,再把這個 Token 發送給用戶端;
  • 用戶端收到 Token 以後可以把它存儲起來,比如放在 Cookie 裡或者 Local Storage 裡;
  • 用戶端每次向服務端請求資源的時候需要帶着服務端簽發的 Token;
  • 服務端收到請求,然後去驗證用戶端請求裡面帶着的 Token,如果驗證成功,就向用戶端傳回請求的資料;

基于token的驗證機制,有以下的優點:

  • 支援跨域通路,将token置于請求頭中,而cookie是不支援跨域通路的;
  • 無狀态化,服務端無需存儲token,隻需要驗證token資訊是否正确即可,而session需要在服務端存儲,一般是通過cookie中的sessionID在服務端查找對應的session;
  • 無需綁定到一個特殊的身份驗證方案(傳統的使用者名密碼登陸),隻需要生成的token是符合我們預期設定的即可;
  • 更适用于移動端(Android,iOS,小程式等等),像這種原生平台不支援cookie,比如說微信小程式,每一次請求都是一次會話,當然我們可以每次去手動為他添加cookie,詳情請檢視部落客另一篇部落格;
  • 避免CSRF跨站僞造攻擊,還是因為不依賴cookie;

缺點的話一個就是相比較于傳統的session登陸機制實作起來略微複雜一點,另外一個比較大的缺點是由于伺服器不儲存 token,是以無法在使用過程中廢止某個 token,或者更改 token 的權限。也就是說,一旦 token 簽發了,在到期之前就會始終有效,除非伺服器部署額外的邏輯。

退出登陸的話,隻要前端清除token資訊即可。

基于JWT的token認證實作#

JWT(JSON Web Token)就是基于token認證的代表,這邊就用JWT為列來介紹基于token的認證機制。

需要引入JWT的依賴

Copycom.auth0  java-jwt  3.8.2
           

生成token和驗證token的工具類如下:

Copypublic class JWTTokenUtil {    //設定過期時間    private static final long EXPIRE_DATE=30*60*100000;    //token秘鑰    private static final String TOKEN_SECRET = "ZCfasfhuaUUHufguGuwu2020BQWE";    public static String token (String username,String password){        String token = "";        try {            //過期時間            Date date = new Date(System.currentTimeMillis()+EXPIRE_DATE);            //秘鑰及加密算法            Algorithm algorithm = Algorithm.HMAC256(TOKEN_SECRET);            //設定頭部資訊            Map header = new HashMap<>();            header.put("typ","JWT");            header.put("alg","HS256");            //攜帶username,password資訊,生成簽名            token = JWT.create()                    .withHeader(header)                    .withClaim("username",username)                    .withClaim("password",password).withExpiresAt(date)                    .sign(algorithm);        }catch (Exception e){            e.printStackTrace();            return  null;        }        return token;    }    public static boolean verify(String token){        /**         * @desc   驗證token,通過傳回true         * @params [token]需要校驗的串         **/        try {            Algorithm algorithm = Algorithm.HMAC256(TOKEN_SECRET);            JWTVerifier verifier = JWT.require(algorithm).build();            DecodedJWT jwt = verifier.verify(token);            return true;        }catch (Exception e){            e.printStackTrace();            return  false;        }    }    public static void main(String[] args) {        String username ="name1";        String password = "pw1";        //注意,一般不會把密碼等私密資訊放在payload中,這邊隻是舉個列子        String token = token(username,password);        System.out.println(token);        boolean b = verify(token);        System.out.println(b);    }}
           

執行結果如下:

CopyConnected to the target VM, address: '127.0.0.1:11838', transport: 'socket'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJwYXNzd29yZCI6IjEyMyIsImV4cCI6MTU5NzM5Nzc0OCwidXNlcm5hbWUiOiJ6aGFuZ3NhbiJ9.LI5S_nX-YcqtExI9UtKiP8FPqpQW_ccaws2coLzyOS0true
           

關于DecodedJWT這個類,大家可以重點看下,裡面包含了解碼後的使用者資訊。

JWT的使用說明#

用戶端收到伺服器傳回的 JWT,可以儲存在 Cookie 裡面,也可以儲存在 localStorage。

此後,用戶端每次與伺服器通信,都要帶上這個 JWT。你可以把它放在 Cookie 裡面自動發送,但是這樣不能跨域,是以更好的做法是放在 HTTP 請求的頭資訊Authorization字段裡面。

Copy

Authorization: Bearer

另一種做法是,跨域的時候,JWT 就放在 POST 請求的資料體裡面。

JWT 本身包含了認證資訊,一旦洩露,任何人都可以獲得該令牌的所有權限。為了減少盜用,JWT 的有效期應該設定得比較短。對于一些比較重要的權限,使用時應該再次對使用者進行認證。

為了減少盜用,JWT 不應該使用 HTTP 協定明碼傳輸,要使用 HTTPS 協定傳輸。(或者是對JWT在前後端之間進行加密之後在傳輸)

關于JWT的一個問題#

上面生成JWT token的過程關鍵點就是密鑰,假如這個密鑰洩露了,那是不是就可以僞造token了。

最後

剛整理 2020 年全套最新精品技術資料免費發給你! (原價最少6999,超200G!)

jet token過期是定時的還是無操作_精讀:token的會話保持機制,密鑰不能洩露session簡介#基于token的認證#基于JWT的token認證實作#JWT的使用說明#關于JWT的一個問題#

初級-中級-進階前端工程師從入門到大神

jet token過期是定時的還是無操作_精讀:token的會話保持機制,密鑰不能洩露session簡介#基于token的認證#基于JWT的token認證實作#JWT的使用說明#關于JWT的一個問題#

領取幹貨:

1. 點贊+評論

2. 點頭像關注後,私信小編,回複:1024

繼續閱讀