热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

深入解析JWT的实现与应用

本文深入探讨了JSONWebToken(JWT)的实现机制及其应用场景。JWT是一种基于RFC7519标准的开放性认证协议,用于在各方之间安全地传输信息。文章详细分析了JWT的结构、生成和验证过程,并讨论了其在现代Web应用中的实际应用案例,为开发者提供了全面的理解和实践指导。

jwt的学习


1. jwt 是什么

什么是JSON Web令牌?JSON Web Token(JWT)是一种开放标准(RFC7519),它定义了一种紧凑且自包含的方式,用于在各方之间作为JSON对象安全地传输信息。此信息可以验证和信任,因为它是经过数字签名的。JWT可以使用秘密(使用HMAC算法)或使用RSA或ECDSA的公钥/私钥对进行签名

2. jwt 能干什么


  • 授权:这是使用JWT最常见的场景。用户登录后,每个后续请求都将包括JWT,允许用户访问该令牌允许的路由、服务和资源。单点登录是目前广泛使用JWT的一种功能,因为它的开销很小,并且能够轻松地跨不同的域使用。
  • 信息交换:JSON Web令牌是在各方之间安全传输信息的好方法。因为JWT可以签名,例如,使用公钥/私钥对,您可以确保发送者是他们所说的人。此外,由于签名是使用报头和有效载荷计算的,因此您还可以验证内容没有被篡改。

3. jwt的结构

jwt 由三部分组成, 通过 .分隔, 分别由以下三部分组成:


  • Header(头部)
  • Payload(有效载荷)
  • Signature(签名)

所以, 一个jwt结构通常是这样的:

xxxxxx.yyyyyy.zzzzz

​ 结构介绍 :


  1. Header

标头通常由两部分组成:令牌的类型(JWT)和正在使用的签名算法(如HMAC SHA256或RSA)。
例如:
{"alg": "HS256", "typ": "JWT"
}
这个JSON是Base64Url编码的,构成JWT的第一部分。

  1. Payload

令牌的第二部分是有效载荷,其中包含声明。声明是关于实体(通常是用户)和其他数据的声明。索赔有三种类型:登记索赔、公开索赔和私人索赔。
{"sub": "1234567890","name": "John Doe","admin": true
}
然后对有效负载进行Base64Url编码,形成JSON Web令牌的第二部分。

  1. Signature

要创建签名部分,您必须获取编码的报头、编码的有效负载、一个秘密、报头中指定的算法,并对其进行签名。
HMACSHA256(base64UrlEncode(header) + "." +base64UrlEncode(payload),secret)

4. jwt的第一个程序

spring boot 中使用jwt

*** 使用步骤:***


1.pom 中加入jwt相关依赖

com.auth0java-jwt3.18.3

2. 生成token令牌

在test中创建一个测试类

@Test
public void contextLoads() {Map<String, Object> map &#61; new HashMap<>();Calendar calendar &#61; Calendar.getInstance();calendar.add(Calendar.MINUTE,10);String token &#61; JWT.create().withHeader(map) // Header.withClaim("username", "小三") // Payload.withClaim("userId", "4893210") //Payload.withExpiresAt(calendar.getTime())//令牌过期时间.sign(Algorithm.HMAC256("hahaha")); // Signature// "hahaha"为密钥System.out.println(token);}

运行测试&#xff0c;结果如: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gwhv8rYU-1647054628015)(C:\Users\孙肖飞\AppData\Roaming\Typora\typora-user-images\image-20220312105444212.png)]


3. 验证token令牌

&#64;Testpublic void test01(){JWTVerifier jwtVerifier &#61; JWT.require(Algorithm.HMAC256("hahaha")).build();//使用相同的算法和相同的密钥DecodedJWT verify &#61; jwtVerifier.verify(String token);// token 为上步运行生成的tokenSystem.out.println(verify.getClaim("username"));System.out.println(verify.getClaim("userId"));}

运行测试&#xff0c;结果&#xff1a;
在这里插入图片描述


5. jwt封装


  1. private static final String signal &#61; "hahaha";//密钥/*** 生成token* &#64;param map* &#64;return*/public static String getToken(Map<String, String> map){String token &#61; null;JWTCreator.Builder builder &#61; JWT.create();//PayloadSet<String> stringSet &#61; map.keySet();for(String s : stringSet){builder.withClaim(s,map.get(s));}Calendar calendar &#61; Calendar.getInstance();calendar.add(Calendar.SECOND, 10);builder.withExpiresAt(calendar.getTime());//设置过期时间token &#61; builder.sign(Algorithm.HMAC256(signal));return token;}

  2. /*** 验证token*/public static void verifyToken(String token){JWTVerifier require &#61; JWT.require(Algorithm.HMAC256(signal)).build();require.verify(token);}


推荐阅读
  • Explore how Matterverse is redefining the metaverse experience, creating immersive and meaningful virtual environments that foster genuine connections and economic opportunities. ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • DNN Community 和 Professional 版本的主要差异
    本文详细解析了 DotNetNuke (DNN) 的两种主要版本:Community 和 Professional。通过对比两者的功能和附加组件,帮助用户选择最适合其需求的版本。 ... [详细]
  • 本文深入探讨了Linux系统中网卡绑定(bonding)的七种工作模式。网卡绑定技术通过将多个物理网卡组合成一个逻辑网卡,实现网络冗余、带宽聚合和负载均衡,在生产环境中广泛应用。文章详细介绍了每种模式的特点、适用场景及配置方法。 ... [详细]
  • 2023年京东Android面试真题解析与经验分享
    本文由一位拥有6年Android开发经验的工程师撰写,详细解析了京东面试中常见的技术问题。涵盖引用传递、Handler机制、ListView优化、多线程控制及ANR处理等核心知识点。 ... [详细]
  • libsodium 1.0.15 发布:引入重大不兼容更新
    最新发布的 libsodium 1.0.15 版本带来了若干不兼容的变更,其中包括默认密码散列算法的更改和其他重要调整。 ... [详细]
  • 深入解析 Apache Shiro 安全框架架构
    本文详细介绍了 Apache Shiro,一个强大且灵活的开源安全框架。Shiro 专注于简化身份验证、授权、会话管理和加密等复杂的安全操作,使开发者能够更轻松地保护应用程序。其核心目标是提供易于使用和理解的API,同时确保高度的安全性和灵活性。 ... [详细]
  • 作为一名专业的Web前端工程师,掌握HTML和CSS的命名规范是至关重要的。良好的命名习惯不仅有助于提高代码的可读性和维护性,还能促进团队协作。本文将详细介绍Web前端开发中常用的HTML和CSS命名规范,并提供实用的建议。 ... [详细]
  • 深入理解Redis的数据结构与对象系统
    本文详细探讨了Redis中的数据结构和对象系统的实现,包括字符串、列表、集合、哈希表和有序集合等五种核心对象类型,以及它们所使用的底层数据结构。通过分析源码和相关文献,帮助读者更好地理解Redis的设计原理。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文深入探讨了 Java 中的 Serializable 接口,解释了其实现机制、用途及注意事项,帮助开发者更好地理解和使用序列化功能。 ... [详细]
  • Scala 实现 UTF-8 编码属性文件读取与克隆
    本文介绍如何使用 Scala 以 UTF-8 编码方式读取属性文件,并实现属性文件的克隆功能。通过这种方式,可以确保配置文件在多线程环境下的一致性和高效性。 ... [详细]
  • 本文详细介绍了如何准备和安装 Eclipse 开发环境及其相关插件,包括 JDK、Tomcat、Struts 等组件的安装步骤及配置方法。 ... [详细]
  • Python 异步编程:ASGI 服务器与框架详解
    自 Python 3.5 引入 async/await 语法以来,异步编程迅速崛起,吸引了大量开发者的关注。本文将深入探讨 ASGI(异步服务器网关接口)及其在现代 Python Web 开发中的应用,介绍主流的 ASGI 服务器和框架。 ... [详细]
author-avatar
拍友2502902623
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有