日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

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

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

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

JWT

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

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

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

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

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

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

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJaSEFOR1hVTiIsImJvZHkiOnsidXNlclJvbGUiOiJhZG1pbiIsInVzZXJpZCI6IjAwMSJ9LCJleHAiOjE2NjI5NTIxNjIsImlhdCI6MTY2Mjk1MTU1NywianRpIjoiZGZhN2MyZjUtNGNjMC00OWFhLWFiMDUtYzZhY2M4M2YxMDViIn0.xOleM21i7-EI0oOq83Xm-nQVOufajHCupY2QjkpwreQ

JWT通常用于身份驗證和授權,因為它們可以包含用戶的信息,并且可以被驗證和信任。通常用于API認證,因為可以在多個系統之間安全地傳遞信息,而無需使用cookie或session。uC928資訊網——每日最新資訊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優缺點

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

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

缺點:uC928資訊網——每日最新資訊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.www897cc.com/showinfo-26-80903-0.htmlJWT在身份驗證與信息交換中的實踐探索

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

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

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

標簽:
  • 熱門焦點
  • MIX Fold3包裝盒泄露 新機本月登場

    小米的全新折疊屏旗艦MIX Fold3將于本月發布,近日該機的真機包裝盒在網上泄露。從圖上來看,新的MIX Fold3包裝盒在外觀設計方面延續了之前的方案,變化不大,這也是目前小米旗艦
  • Mate60手機殼曝光 致敬自己的經典設計

    8月3日消息,今天下午博主數碼閑聊站帶來了華為Mate60的第三方手機殼圖,可以讓我們在真機發布之前看看這款華為全新旗艦的大致輪廓。從曝光的圖片看,Mate 60背后攝像頭面積依然
  • 7月安卓手機性能榜:紅魔8S Pro再奪榜首

    7月份的手機市場風平浪靜,除了紅魔和努比亞帶來了兩款搭載驍龍8Gen2領先版處理器的新機之外,別的也想不到有什么新品了,這也正常,通常6月7月都是手機廠商修整的時間,進入8月份之
  • 2023年Q2用戶偏好榜:12+256G版本成新主流

    3月份的性能榜、性價比榜和好評榜之后,就要輪到2023年的第二季度偏好榜了,上半年的新機潮已經過去,最明顯的肯定就是大內存和存儲的機型了,另外部分中端機也取消了屏幕塑料支架
  • 三言兩語說透柯里化和反柯里化

    JavaScript中的柯里化(Currying)和反柯里化(Uncurrying)是兩種很有用的技術,可以幫助我們寫出更加優雅、泛用的函數。本文將首先介紹柯里化和反柯里化的概念、實現原理和應用
  • JVM優化:實戰OutOfMemoryError異常

    一、Java堆溢出堆內存中主要存放對象、數組等,只要不斷地創建這些對象,并且保證 GC Roots 到對象之間有可達路徑來避免垃 圾收集回收機制清除這些對象,當這些對象所占空間超過
  • 共享單車的故事講到哪了?

    來源丨海克財經與共享充電寶相差不多,共享單車已很久沒有被國內熱點新聞關照到了。除了一再漲價和用戶直呼用不起了。近日多家媒體再發報道稱,成都、天津、鄭州等地多個共享單
  • Counterpoint :OPPO雙旗艦戰略全面落地 高端產品銷量增長22%

    2023年6月30日,全球行業分析機構Counterpoint Research發布的《中國智能手機高端市場白皮書》顯示,中國智能手機品牌正在尋求高質量發展,中國高端智能
  • DRAM存儲器10月價格下跌,NAND閃存本月價格與上月持平

    10月30日,據韓國媒體消息,自今年年初以來一直在上漲的 DRAM 存儲器的交易價格僅在本月就下跌了近 10%,此次是全年首次降價,而NAND 閃存本月價格與上月持平。市
Top 主站蜘蛛池模板: 洪洞县| 安达市| 鄂托克旗| 博野县| 利川市| 乌拉特后旗| 库尔勒市| 曲靖市| 岑巩县| 济源市| 罗平县| 都昌县| 南皮县| 宜宾市| 平陆县| 彭山县| 河津市| 长海县| 烟台市| 邻水| 古浪县| 澜沧| 凤台县| 平舆县| 连云港市| 惠州市| 孟州市| 康定县| 仁化县| 黄平县| 区。| 汉中市| 岱山县| 无极县| 化隆| 广丰县| 鄂尔多斯市| 孝感市| 和平区| 渝中区| 东乡县|