成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

開發 前端
、不適合存儲敏感信息(Not Suitable for Storing Sensitive Information):由于JWT可以被解碼,因此不適合存儲敏感信息,如密碼等。

JWT

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

JWT工作示意圖:圖片

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

JWT由三部分組成,分別是頭部(header)、載荷(payload)和簽名(signature)。

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

JWT的三部分使用點號(.)連接起來,形成一個完整的JWT令牌。例如:xxxxx.yyyyy.zzzzz

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJaSEFOR1hVTiIsImJvZHkiOnsidXNlclJvbGUiOiJhZG1pbiIsInVzZXJpZCI6IjAwMSJ9LCJleHAiOjE2NjI5NTIxNjIsImlhdCI6MTY2Mjk1MTU1NywianRpIjoiZGZhN2MyZjUtNGNjMC00OWFhLWFiMDUtYzZhY2M4M2YxMDViIn0.xOleM21i7-EI0oOq83Xm-nQVOufajHCupY2QjkpwreQ

JWT通常用于身份驗證和授權,因為它們可以包含用戶的信息,并且可以被驗證和信任。通常用于API認證,因為可以在多個系統之間安全地傳遞信息,而無需使用cookie或session。

JWT使用

<dependency>
    <groupId>com.auth0</groupId>
    <artifactId>java-jwt</artifactId>
    <version>4.4.0</version>
</dependency>
@Slf4j
@RestController
public 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;
    }
}
@Component
public 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優缺點

優點:

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

缺點:

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

2024-02-02 08:56:54

2024-02-23 07:18:40

JWTWeb應用程序

2023-06-01 16:37:34

2012-10-23 16:12:35

2024-05-06 00:00:00

ASP.NET授權機制

2024-05-17 09:51:11

2012-02-20 09:55:41

ibmdw

2010-09-06 11:24:47

CHAP驗證PPP身份驗證

2024-08-07 12:14:39

2025-04-25 07:00:00

身份驗證CISO無密碼

2010-07-17 00:57:52

Telnet身份驗證

2012-04-10 09:36:58

2011-02-21 10:54:45

2013-07-21 18:32:13

iOS開發ASIHTTPRequ

2014-10-30 09:14:28

2009-04-09 23:44:08

軟件身份驗證用戶

2010-07-19 17:30:47

2022-10-31 10:00:00

2022-06-05 00:15:31

驗證身份網絡

2010-11-30 15:31:38

SharePoint Kerberos
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲精品久久久久久一区二区 | 黄色网址av | 日韩影音| 黄色小视频入口 | 国产1区2区 | 99久久精品一区二区成人 | 国产小视频在线观看 | 亚洲精品视频免费观看 | 中文字幕亚洲一区 | 黑人巨大精品 | 激情欧美一区二区三区中文字幕 | 大香在线伊779 | 中文一区二区视频 | 国产亚洲一区二区三区 | 一级毛片视频在线 | 亚洲一区播放 | 国产精品不卡 | 一区二区三区韩国 | 成人免费视频在线观看 | 久久亚洲一区 | 亚洲精品久久久一区二区三区 | 国产在线麻豆精品入口 | 亚洲成人高清 | 色就干| 日本a视频 | 日日摸天天添天天添破 | 成人免费在线小视频 | 久久乐国产精品 | 亚洲精品中文字幕在线 | 国产精品美女 | 久久极品 | 国产黄色网 | 亚洲一区二区三区在线播放 | 日韩在线视频精品 | 国产成人免费在线观看 | 免费啪啪 | 国产999精品久久久 午夜天堂精品久久久久 | 欧美激情精品久久久久久 | 欧美一区二区三区在线 | 欧美日本韩国一区二区 | 中文字幕国产精品 |