AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當前位置:首頁 > 科技  > 軟件

JWT在身份驗證與信息交換中的實踐探索

來源: 責編: 時間:2024-04-02 17:24:14 212觀看
導讀JWTJWT是指JSON Web Token,一種用于在網絡上安全傳輸信息的開放標準(RFC 7519),定義了一種緊湊的、自包含的方式,用于作為JSON對象在各方之間安全地傳輸信息。JWT由三部分組成,分別是頭部(Header)、載荷(Payload)和簽名(Signatur

JWT

JWT是指JSON Web Token,一種用于在網絡上安全傳輸信息的開放標準(RFC 7519),定義了一種緊湊的、自包含的方式,用于作為JSON對象在各方之間安全地傳輸信息。JWT由三部分組成,分別是頭部(Header)、載荷(Payload)和簽名(Signature)。通常被用來在用戶和服務器之間傳遞身份信息,以及在不同的系統之間安全地傳遞聲明。JWT通常被用于身份驗證和信息交換,特別是在前后端分離的應用中。TKh28資訊網——每日最新資訊28at.com

JWT工作示意圖:圖片TKh28資訊網——每日最新資訊28at.com

  1. 用戶登錄后,服務端會將用戶的識別信息進行加密生成一個有有效期的token返回給用戶端。
  2. 用戶端收到token后將其進行保存,并在以后的每一次請求時將該token帶上發送給服務器。
  3. 服務器接收到用戶的token后,進行驗證用戶的身份、權限、有效期等信息,驗證通過即放行,驗證不通過就拒絕服務。

JWT由三部分組成,分別是頭部(header)、載荷(payload)和簽名(signature)。TKh28資訊網——每日最新資訊28at.com

  1. 頭部(header):包含了令牌的類型(即JWT)和所使用的簽名算法(例如HMAC SHA256或RSA)。
  2. 載荷(payload):包含了要傳遞的信息,以及一些標準的聲明和自定義的聲明。標準的聲明包括令牌的過期時間(exp)、發布時間(iat)等。自定義的聲明可以根據需要添加。
  3. 簽名(signature):使用頭部指定的算法和密鑰對頭部和載荷進行簽名,以確保令牌在傳輸過程中沒有被篡改。

JWT的三部分使用點號(.)連接起來,形成一個完整的JWT令牌。例如:xxxxx.yyyyy.zzzzzTKh28資訊網——每日最新資訊28at.com

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJaSEFOR1hVTiIsImJvZHkiOnsidXNlclJvbGUiOiJhZG1pbiIsInVzZXJpZCI6IjAwMSJ9LCJleHAiOjE2NjI5NTIxNjIsImlhdCI6MTY2Mjk1MTU1NywianRpIjoiZGZhN2MyZjUtNGNjMC00OWFhLWFiMDUtYzZhY2M4M2YxMDViIn0.xOleM21i7-EI0oOq83Xm-nQVOufajHCupY2QjkpwreQ

JWT通常用于身份驗證和授權,因為它們可以包含用戶的信息,并且可以被驗證和信任。通常用于API認證,因為可以在多個系統之間安全地傳遞信息,而無需使用cookie或session。TKh28資訊網——每日最新資訊28at.com

JWT使用

<dependency>    <groupId>com.auth0</groupId>    <artifactId>java-jwt</artifactId>    <version>4.4.0</version></dependency>
@Slf4j@RestControllerpublic class TokenController {    @Autowired    private TokenUtil tokenUtil;    @PostMapping("/login")    public String login(@RequestParam String username, @RequestParam String password){        if(!"admin".equals(username) || !"123".equals(password)){            log.info("賬號或者密碼錯誤!");        }        // 模擬從數據庫中獲取的用戶識別信息        String userId = "001";        String userRole = "admin";        Map<String,Object> dataMap = new HashMap<>();        dataMap.put("userId", userId);        dataMap.put("userRole", userRole);        // 將用戶識別信息存儲到token中        String token = tokenUtil.createToken(dataMap);        log.info("生成的token為:{}", token);        return token;    }    @PostMapping("/getUserInfo")    public String getUserInfo(@RequestParam String token){        if(ObjectUtils.isEmpty(token)){            log.info("token不能為空!");            return "token不能為空!";        }        log.info("收到的token為:{}", token);        Map<String, Object> dataMap = tokenUtil.parseToken(token);        String userRole = dataMap.get("userRole").toString();        if(!"admin".equals(userRole)){            log.info("非管理員角色,不允許訪問!");            return "非管理員角色,不允許訪問!";        }        String userId = dataMap.get("userId").toString();        return "允許登錄,用戶為:" + userId;    }}
@Componentpublic class TokenUtil {    private static final String DEFAULT_SECRET = "666";    private static final String DEFAULT_DATA_KEY = "body";    private static final String DEFAULT_ISSUER = "REATHIN";    private static final Long DEFAULT_EXPIRE_TIME = 7*24*60*60L;    public String createToken(Map<String, Object> dataMap){        return createToken(dataMap, DEFAULT_SECRET);    }    public String createToken(Map<String, Object> dataMap, String secret){        // 指定使用的加密算法        Algorithm algorithm = Algorithm.HMAC256(secret);        return JWT.create()                .withClaim(DEFAULT_DATA_KEY, dataMap)                .withIssuer(DEFAULT_ISSUER)                .withIssuedAt(new Date())                .withExpiresAt(new Date(System.currentTimeMillis() + DEFAULT_EXPIRE_TIME * 1000))                .withJWTId(UUID.randomUUID().toString())                .sign(algorithm);    }    public Map<String, Object> parseToken(String token){        return parseToken(token, DEFAULT_SECRET);    }    public Map<String, Object> parseToken(String token, String secret){        // 指定使用的加密算法        Algorithm algorithm = Algorithm.HMAC256(secret);        JWTVerifier jwtVerifier = JWT.require(algorithm).build();        DecodedJWT decodedJWT = jwtVerifier.verify(token);        return decodedJWT.getClaim(DEFAULT_DATA_KEY).asMap();    }}

JWT優缺點

優點:TKh28資訊網——每日最新資訊28at.com

  1. 無狀態性(Stateless):JWT包含了所有用戶的必要信息,服務器不需要存儲用戶的會話信息,因此可以輕松地擴展應用程序。
  2. 跨域支持(Cross-Origin Support):JWT可以在跨域場景下使用,因為它可以通過HTTP頭部進行傳遞。
  3. 安全性(Security):JWT可以使用簽名和加密來驗證發送方的身份和確保數據的完整性。
  4. 靈活性(Flexibility):JWT可以用于各種場景,包括身份驗證和信息交換。

缺點:TKh28資訊網——每日最新資訊28at.com

  1. 無法撤銷(Non-Revocable):一旦JWT被簽發,就無法撤銷,除非設置短期過期時間。
  2. 增加網絡負擔(Increased Network Overhead):由于JWT包含了用戶信息,因此會增加網絡傳輸的負擔。
  3. 潛在安全風險(Potential Security Risks):如果JWT被盜取,攻擊者可以獲得用戶的所有信息,因此需要謹慎存儲和傳輸JWT。
  4. 不適合存儲敏感信息(Not Suitable for Storing Sensitive Information):由于JWT可以被解碼,因此不適合存儲敏感信息,如密碼等。

本文鏈接:http://www.tebozhan.com/showinfo-26-80903-0.htmlJWT在身份驗證與信息交換中的實踐探索

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 一篇文章讓你掌握 Go 語言的 Defer 關鍵字

下一篇: 如何在Jenkins中編寫Ansible代碼

標簽:
  • 熱門焦點
Top