JWT原理 使用(入門篇)

一、JWT簡介

JWT:Json Web Token,是基於Json的一個公開規範,這個規範容許咱們使用JWT在用戶和服務器之間傳遞安全可靠的信息,他的兩大使用場景是:認證和數據交換
使用起來就是,由服務端根據規範生成一個令牌(token),而且發放給客戶端。此時客戶端請求服務端的時候就能夠攜帶者令牌,以令牌來證實本身的身份信息。
做用:相似session保持登陸狀態 的辦法,經過token來表明用戶身份。
 

2,JWT生成

 

3,JWT校驗

 

4,一些問題

a、token到底生成什麼樣最好?(規則),每一個用戶要 惟一
b、token返回給客戶端以後,服務端還要 保存嗎?
c、校驗token時,怎麼保證數據並無被黑客攔截並篡改?( 安全
d、token頒發給客戶端以後,要不要有 過時時間
e、 屢次登陸生成的token都是同樣的嗎?都是可用的嗎?
 

5,JWT規則詳解

一個JWT實際上就是一個字符串,它由三部分組成:頭部、載荷與簽名 header.payload.signature
一個正常的token爲: eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOjYyNywiZXhwIjoxNTcwMDE0ODg1fQ.vPbQh4syxNCzkKXKPSM93LzzLqoJdzPDNeKz8tz9cFM4NzhIOdPrJcH2DG-9-9MCUufCgrAhhGjuo85GKV4bOQ
 
 

 

6,JWT令牌的優勢:

a、jwt基於json,很是方便解析
b、能夠再令牌中自定義豐富的內容,易擴展(payload能夠擴展)
c、經過簽名,讓JWT防止被篡改,安全性高
d、資源服務使用JWT可不依賴認證服務便可完成受權
 
 

7,demo測試

 1 /**
 2 * JWT 測試controller  3 *  4 * @author wangmeng  5 * @date 2019/9/2  6 */
 7 @RestController  8 @RequestMapping(value = "/user", produces = { "application/json; charset=UTF-8" })  9 public class JWTController { 10  
11  
12     private static final String SECRET = "wangmengtest.@163.com"; 13  
14  
15     @RequestMapping("/login/{username}/{password}") 16     public Map login(@PathVariable String username, @PathVariable String password) { 17         Map result = new HashMap(); 18         if (username.equals("admin") && password.equals("123456")) { 19             String jwt = Jwts.builder(). 20  setSubject(username). 21  signWith(SignatureAlgorithm.HS512, SECRET). 22  compact(); 23             result.put("token", jwt); 24         } else { 25             result.put("message", "帳號密碼錯誤"); 26  } 27  
28  
29         return result; 30  } 31  
32  
33     @RequestMapping("/goods/{token}") 34     public Map verifyToken(@PathVariable String token) { 35         Map result = new HashMap(); 36         Jws<Claims> claimsJws = Jwts.parser().setSigningKey(SECRET).parseClaimsJws(token); 37         result.put("username", claimsJws.getBody().getSubject()); 38         return result; 39  } 40 }

 

 

請求測試:

一、生成token
 
二、使用token請求,獲取username
 
 

八、問題解答

a、token到底生成什麼樣最好?(規則),每一個用戶要惟一
三部分組成:頭部、載荷與簽名 header.payload.signature
 
b、token返回給客戶端以後,服務端還要保存嗎?
服務端不須要保存
 
c、校驗token時,怎麼保證數據並無被黑客攔截並篡改?(安全)
signature中有私鑰來進行簽名,能夠保證安全性
 
d、token頒發給客戶端以後,要不要有過時時間?
須要設置token過時時間
 
e、屢次登陸生成的token都是同樣的嗎?都是可用的嗎?
能夠再payload加上時間戳,來保證每次生成的token都不同,都是可用的
 

 後記

JWT還有不少內容須要挖掘,這裏只是入門篇,後面有時間還會看看JWT源碼 以及一些常見的坑。

原文出處:https://www.cnblogs.com/wang-meng/p/11452620.htmlhtml

相關文章
相關標籤/搜索