做sgs认证的公司网站,修改wordpress后台文字,烟台网站建设 熊掌号,现在跨境电商最好做的是什么平台文章目录 什么是JWT?JWT的组成部分JWT的使用场景优点缺点 Java中如何实现JWT编解码引入JJWT依赖编码JWT解码JWT使用示例 什么是JWT?
JWT#xff08;JSON Web Tokens#xff09;是一种用于双方之间安全传输信息的简洁的、URL安全的令牌标准。JWT可以传递信息#xff0c;这… 文章目录 什么是JWT?JWT的组成部分JWT的使用场景优点缺点 Java中如何实现JWT编解码引入JJWT依赖编码JWT解码JWT使用示例 什么是JWT?
JWTJSON Web Tokens是一种用于双方之间安全传输信息的简洁的、URL安全的令牌标准。JWT可以传递信息这个信息是经过数字签名的因此可以验证其完整性及被签发人。JWT广泛用于身份验证和信息交换特别是在客户端和服务器之间的通信中。
JWT的组成部分
JWT通常由三部分组成它们之间用.点分隔 Header头部头部包含两部分信息 typ表示令牌的类型对于JWT此值固定为JWT。alg表示签名所使用的算法如HMAC SHA256或RSA。 例如 {alg: HS256,typ: JWT
}然后使用Base64对这个JSON进行编码。 Payload负载负载部分包含声明claims。声明是关于实体通常是用户和其他数据的声明。声明有三种类型注册的、公共的和私有的。 注册声明Registered claims建议但不强制使用的一组预定义声明如iss签发者、exp过期时间、sub主题等。公共声明Public claims可以随意定义。私有声明Private claims用于在同意使用它们的各方之间共享信息既不是注册也不是公共的声明。 例如 {sub: 1234567890,name: John Doe,admin: true
}这部分也使用Base64编码。 Signature签名签名部分是对前两部分的签名以防止数据被篡改。首先需要指定的头部中指定的算法对编码后的头部和编码后的负载进行签名。 签名过程为 对Header和Payload进行Base64编码后的字符串使用.连接。使用Header中指定的签名算法如HMAC SHA256和密钥对连接后的字符串进行签名。
JWT的使用场景
JWT因其简洁、自包含的特点广泛用于以下场景
身份验证JWT允许用户登录后服务器返回一个JWT以后用户只需携带JWT访问资源即可无需携带用户名和密码。信息交换JWT可以在不同服务间安全地传输用户信息无需多次查询数据库。
优点
紧凑可以通过URL、POST参数或在HTTP头部中发送易于传输。自包含负载中包含了所有必要的信息减少了需要查询信息的需求。安全性通过签名可以验证消息的完整性及签发人。
缺点
令牌大小由于包含的信息较多JWT可能会比其他令牌如简单的token字符串更大。性能每次请求都需要验证JWT可能会对性能产生影响。令牌泄露如果JWT被拦截攻击者将能够在令牌有效期内冒充用户。因此必须确保HTTPS的使用来防止中间人攻击。 总的来说JWT提供了一种轻量级、安全的方式用于在双方之间传递信息特别适用于身份验证和信息交换的场景。
Java中如何实现JWT编解码
在Java中实现JWT的编解码你通常会使用一些流行的库如jjwtJava JWT或nimbus-jose-jwt。这些库提供了生成JWT、验证JWT、解析JWT等功能的简便方法。下面我将以jjwt为例介绍如何在Java中实现JWT的编解码。
引入JJWT依赖
首先你需要在你的项目中引入JJWT的依赖。如果你使用的是Maven可以在pom.xml中添加如下依赖
dependencygroupIdio.jsonwebtoken/groupIdartifactIdjjwt/artifactIdversion0.9.1/version !-- 请检查最新版本 --
/dependency编码JWT
编码JWT通常涉及到创建一个Claims对象设置你需要的声明claims然后使用密钥对其进行签名。
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.util.Date;public class JwtUtil {private static final String SECRET_KEY your-256-bit-secret; // 密钥public static String generateToken(String subject) {return Jwts.builder().setSubject(subject) // 设置主题.setIssuedAt(new Date()) // 设置签发时间.setExpiration(new Date(System.currentTimeMillis() 1000 * 60 * 60 * 10)) // 设置过期时间这里设置为10小时后过期.signWith(SignatureAlgorithm.HS256, SECRET_KEY) // 使用HS256算法和密钥进行签名.compact(); // 压缩并返回JWT字符串}
}解码JWT
解码JWT涉及到验证签名并解析JWT中的声明。
public static Claims parseToken(String token) {try {return Jwts.parser().setSigningKey(SECRET_KEY) // 设置用于签名的密钥.parseClaimsJws(token) // 解析JWT.getBody(); // 获取Claims对象} catch (Exception e) {// 可以在这里处理异常比如返回null或抛出运行时异常e.printStackTrace();return null;}
}使用示例
public class Main {public static void main(String[] args) {String token JwtUtil.generateToken(user123);System.out.println(Generated Token: token);Claims claims JwtUtil.parseToken(token);if (claims ! null) {System.out.println(Subject: claims.getSubject());// 你还可以获取其他声明如过期时间、签发时间等}}
}请注意在实际应用中你需要将SECRET_KEY替换为一个安全且难以猜测的密钥。此外JWT的安全性也依赖于密钥的保密性因此请确保你的密钥不被泄露。
此外JWT的过期时间、签发者、受众等声明可以根据你的需求进行设置。JJWT库提供了丰富的API来支持这些功能。