当前位置:首页 > 科技  > 软件

JWT在身份验证与信息交换中的实践探索

来源: 责编: 时间:2024-04-02 17:24:14 254观看
导读JWTJWT是指JSON Web Token,一种用于在网络上安全传输信息的开放标准(RFC 7519),定义了一种紧凑的、自包含的方式,用于作为JSON对象在各方之间安全地传输信息。JWT由三部分组成,分别是头部(Header)、载荷(Payload)和签名(Signatur

JWT

JWT是指JSON Web Token,一种用于在网络上安全传输信息的开放标准(RFC 7519),定义了一种紧凑的、自包含的方式,用于作为JSON对象在各方之间安全地传输信息。JWT由三部分组成,分别是头部(Header)、载荷(Payload)和签名(Signature)。通常被用来在用户和服务器之间传递身份信息,以及在不同的系统之间安全地传递声明。JWT通常被用于身份验证和信息交换,特别是在前后端分离的应用中。BHa28资讯网——每日最新资讯28at.com

JWT工作示意图:图片BHa28资讯网——每日最新资讯28at.com

  1. 用户登录后,服务端会将用户的识别信息进行加密生成一个有有效期的token返回给用户端。
  2. 用户端收到token后将其进行保存,并在以后的每一次请求时将该token带上发送给服务器。
  3. 服务器接收到用户的token后,进行验证用户的身份、权限、有效期等信息,验证通过即放行,验证不通过就拒绝服务。

JWT由三部分组成,分别是头部(header)、载荷(payload)和签名(signature)。BHa28资讯网——每日最新资讯28at.com

  1. 头部(header):包含了令牌的类型(即JWT)和所使用的签名算法(例如HMAC SHA256或RSA)。
  2. 载荷(payload):包含了要传递的信息,以及一些标准的声明和自定义的声明。标准的声明包括令牌的过期时间(exp)、发布时间(iat)等。自定义的声明可以根据需要添加。
  3. 签名(signature):使用头部指定的算法和密钥对头部和载荷进行签名,以确保令牌在传输过程中没有被篡改。

JWT的三部分使用点号(.)连接起来,形成一个完整的JWT令牌。例如:xxxxx.yyyyy.zzzzzBHa28资讯网——每日最新资讯28at.com

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJaSEFOR1hVTiIsImJvZHkiOnsidXNlclJvbGUiOiJhZG1pbiIsInVzZXJpZCI6IjAwMSJ9LCJleHAiOjE2NjI5NTIxNjIsImlhdCI6MTY2Mjk1MTU1NywianRpIjoiZGZhN2MyZjUtNGNjMC00OWFhLWFiMDUtYzZhY2M4M2YxMDViIn0.xOleM21i7-EI0oOq83Xm-nQVOufajHCupY2QjkpwreQ

JWT通常用于身份验证和授权,因为它们可以包含用户的信息,并且可以被验证和信任。通常用于API认证,因为可以在多个系统之间安全地传递信息,而无需使用cookie或session。BHa28资讯网——每日最新资讯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优缺点

优点:BHa28资讯网——每日最新资讯28at.com

  1. 无状态性(Stateless):JWT包含了所有用户的必要信息,服务器不需要存储用户的会话信息,因此可以轻松地扩展应用程序。
  2. 跨域支持(Cross-Origin Support):JWT可以在跨域场景下使用,因为它可以通过HTTP头部进行传递。
  3. 安全性(Security):JWT可以使用签名和加密来验证发送方的身份和确保数据的完整性。
  4. 灵活性(Flexibility):JWT可以用于各种场景,包括身份验证和信息交换。

缺点:BHa28资讯网——每日最新资讯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.28at.com/showinfo-26-80903-0.htmlJWT在身份验证与信息交换中的实践探索

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 一篇文章让你掌握 Go 语言的 Defer 关键字

下一篇: 如何在Jenkins中编写Ansible代码

标签:
  • 热门焦点
  • Redmi Pad评测:红米充满野心的一次尝试

    从Note系列到K系列,从蓝牙耳机到笔记本电脑,红米不知不觉之间也已经形成了自己颇有竞争力的产品体系,在中端和次旗舰市场上甚至要比小米新机的表现来得更好,正所谓“大丈夫生居
  • Java NIO内存映射文件:提高文件读写效率的优秀实践!

    Java的NIO库提供了内存映射文件的支持,它可以将文件映射到内存中,从而可以更快地读取和写入文件数据。本文将对Java内存映射文件进行详细的介绍和演示。内存映射文件概述内存
  • 十个简单但很有用的Python装饰器

    装饰器(Decorators)是Python中一种强大而灵活的功能,用于修改或增强函数或类的行为。装饰器本质上是一个函数,它接受另一个函数或类作为参数,并返回一个新的函数或类。它们通常用
  • 谷歌KDD'23工作:如何提升推荐系统Ranking模型训练稳定性

    谷歌在KDD 2023发表了一篇工作,探索了推荐系统ranking模型的训练稳定性问题,分析了造成训练稳定性存在问题的潜在原因,以及现有的一些提升模型稳定性方法的不足,并提出了一种新
  • 使用LLM插件从命令行访问Llama 2

    最近的一个大新闻是Meta AI推出了新的开源授权的大型语言模型Llama 2。这是一项非常重要的进展:Llama 2可免费用于研究和商业用途。(几小时前,swyy发现它已从LLaMA 2更名为Lla
  • 三分钟白话RocketMQ系列—— 如何发送消息

    我们知道RocketMQ主要分为消息 生产、存储(消息堆积)、消费 三大块领域。那接下来,我们白话一下,RocketMQ是如何发送消息的,揭秘消息生产全过程。注意,如果白话中不小心提到相关代
  • 小红书1周涨粉49W+,我总结了小白可以用的N条涨粉笔记

    作者:黄河懂运营一条性教育视频,被54万人&ldquo;珍藏&rdquo;是什么体验?最近,情感博主@公主是用鲜花做的,火了!仅仅凭借一条视频,光小红书就有超过128万人,为她疯狂点赞!更疯狂的是,这
  • 2纳米决战2025

    集微网报道 从三强争霸到四雄逐鹿,2nm的厮杀声已然隐约传来。无论是老牌劲旅台积电、三星,还是誓言重回先进制程领先地位的英特尔,甚至初成立不久的新
  • AI芯片初创公司Tenstorrent获三星和现代1亿美元投资

    Tenstorrent是一家由芯片行业资深人士Jim Keller领导的加拿大初创公司,专注于开发人工智能芯片,该公司周三表示,已经从现代汽车集团和三星投资基金等
Top