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

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

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

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

JWT

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

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

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

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

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

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

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJaSEFOR1hVTiIsImJvZHkiOnsidXNlclJvbGUiOiJhZG1pbiIsInVzZXJpZCI6IjAwMSJ9LCJleHAiOjE2NjI5NTIxNjIsImlhdCI6MTY2Mjk1MTU1NywianRpIjoiZGZhN2MyZjUtNGNjMC00OWFhLWFiMDUtYzZhY2M4M2YxMDViIn0.xOleM21i7-EI0oOq83Xm-nQVOufajHCupY2QjkpwreQ

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

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

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

缺點:qTA28資訊網——每日最新資訊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代碼

標簽:
  • 熱門焦點
  • 天貓精靈Sound Pro體驗:智能音箱沒有音質?來聽聽我的

    這幾年除了手機作為智能生活終端最主要的核心之外,第二個可以成為中心點的產品是什么?——是智能音箱。 手機在執行命令的時候有兩種操作方式,手和智能語音助手,而智能音箱只
  • vivo TWS Air開箱體驗:真輕 臻好聽

    在vivo S15系列新機的發布會上,vivo的最新款真無線藍牙耳機vivo TWS Air也一同發布,本次就這款耳機新品給大家帶來一個簡單的分享。外包裝盒上,vivo TWS Air保持了vivo自家產
  • 三言兩語說透設計模式的藝術-簡單工廠模式

    一、寫在前面工廠模式是最常見的一種創建型設計模式,通常說的工廠模式指的是工廠方法模式,是使用頻率最高的工廠模式。簡單工廠模式又稱為靜態工廠方法模式,不屬于GoF 23種設計
  • Rust中的高吞吐量流處理

    作者 | Noz編譯 | 王瑞平本篇文章主要介紹了Rust中流處理的概念、方法和優化。作者不僅介紹了流處理的基本概念以及Rust中常用的流處理庫,還使用這些庫實現了一個流處理程序
  • 三言兩語說透柯里化和反柯里化

    JavaScript中的柯里化(Currying)和反柯里化(Uncurrying)是兩種很有用的技術,可以幫助我們寫出更加優雅、泛用的函數。本文將首先介紹柯里化和反柯里化的概念、實現原理和應用
  • 19個 JavaScript 單行代碼技巧,讓你看起來像個專業人士

    今天這篇文章跟大家分享18個JS單行代碼,你只需花幾分鐘時間,即可幫助您了解一些您可能不知道的 JS 知識,如果您已經知道了,就當作復習一下,古人云,溫故而知新嘛。現在,我們就開始今
  • 三分鐘白話RocketMQ系列—— 如何發送消息

    我們知道RocketMQ主要分為消息 生產、存儲(消息堆積)、消費 三大塊領域。那接下來,我們白話一下,RocketMQ是如何發送消息的,揭秘消息生產全過程。注意,如果白話中不小心提到相關代
  • 馮提莫簽約抖音公會 前“斗魚一姐”消失在直播間

    來源:直播觀察提起&ldquo;馮提莫&rdquo;這個名字,很多網友或許聽過,但應該不記得她是哪位主播了。其實,作為曾經的&ldquo;斗魚一姐&rdquo;,馮提莫在游戲直播的年代影響力不輸于現
  • iQOO Neo8 Pro評測:旗艦雙芯加持 最強性能游戲旗艦

    【Techweb評測】去年10月,iQOO推出了一款Neo7手機,該機搭載了聯發科天璣9000+,配備獨顯芯片Pro+,帶來了同價位段最佳的游戲體驗,一經上市便受到了諸多用
Top 主站蜘蛛池模板: 遵化市| 高密市| 资阳市| 合肥市| 清水河县| 邛崃市| 镶黄旗| 鄂州市| 高雄市| 龙门县| 镇雄县| 岳池县| 临安市| 佛坪县| 册亨县| 松滋市| 攀枝花市| 绵阳市| 阜新市| 米脂县| 肃南| 应城市| 西吉县| 舟山市| 沂源县| 开阳县| 蒲城县| 赤城县| 苏尼特右旗| 香河县| 碌曲县| 浑源县| 南郑县| 陆良县| 宁乡县| 祁门县| 石景山区| 乾安县| 涿州市| 新和县| 吉水县|