1、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 }
請求測試:
1、生成token
2、使用token請求,獲取username
8、問題解答
a、token到底生成什么樣最好?(規則),每個用戶要唯一
三部分組成:頭部、載荷與簽名 header.payload.signature
b、token返回給客戶端之后,服務端還要保存嗎?
服務端不需要保存
c、校驗token時,怎么保證數據並沒有被黑客攔截並篡改?(安全)
signature中有私鑰來進行簽名,可以保證安全性
d、token頒發給客戶端之后,要不要有過期時間?
需要設置token過期時間
e、多次登錄生成的token都是一樣的嗎?都是可用的嗎?
可以再payload加上時間戳,來保證每次生成的token都不一樣,都是可用的
后記
JWT還有很多內容需要挖掘,這里只是入門篇,后面有時間還會看看JWT源碼 以及一些常見的坑。