淘客网站 wordpress,网站app建设方案,网站开发流程三部分,小程序码JWT#xff08;JSON Web Token#xff09; 是一种用于在各方之间传输信息的紧凑、安全的方式#xff0c;常用于身份验证和授权。它以令牌的形式将用户信息编码后传输#xff0c;可以确保数据的完整性和安全性。
1.JWT的结构 JWT 是一个基于 JSON 的令牌#xff0c;由三部… JWTJSON Web Token 是一种用于在各方之间传输信息的紧凑、安全的方式常用于身份验证和授权。它以令牌的形式将用户信息编码后传输可以确保数据的完整性和安全性。
1.JWT的结构 JWT 是一个基于 JSON 的令牌由三部分组成通过点号 (.) 分隔 header.payload.signature 每部分都是经过 Base64Url 编码的字符串分别对应以下三个部分
1Header头部 头部包含令牌的元数据通常包括令牌类型和签名算法。 例子 { alg: HS256, typ: JWT } alg: 签名使用的算法如 HMAC SHA256。 typ: 声明令牌类型为 JWT。
2Payload有效载荷 有效载荷包含用户的声明claims也就是实际传输的数据。它通常包含身份验证或授权所需的信息。 { sub: 1234567890, name: John Doe, admin: true, iat: 1516239022 }
常见的标准声明
iss (issuer)签发者sub (subject)面向的用户aud (audience)接收的受众exp (expiration)过期时间iat (issued at)签发时间nbf (not before)生效时间
自定义声明可以根据需求添加任何信息。
3Signature签名 签名用于验证令牌的真实性并确保令牌在传输过程中没有被篡改。 签名的生成方式 HMACSHA256( base64UrlEncode(header) . base64UrlEncode(payload), secret ) 签名使用头部中声明的算法和一个秘密密钥secret key生成。
2.JWT的工作流程
2.1.生成JWT 用户登录后服务器生成一个包含用户身份信息的 JWT使用密钥对其进行签名。
2.2.客户端存储JWT 生成的 JWT 会返回给客户端客户端通常将其存储在浏览器的 localStorage 或 sessionStorage 中或者存储在 Cookie 中。
2.3.客户端请求时携带JWT 在后续的请求中客户端将 JWT 附加在请求头的 Authorization 字段中 Authorization: Bearer token
2.4.服务器验证JWT 服务器接收到 JWT 后会使用相同的密钥对签名进行验证确保令牌的完整性和真实性。 如果 JWT 有效服务器允许访问资源如果令牌无效或过期返回 401 未授权状态。
3.JWT的优势 1无状态JWT 是无状态的所有信息都保存在令牌中服务器不需要维护会话数据。 2跨域支持由于 JWT 不依赖于特定的存储机制适合跨域认证。 3紧凑性JWT 的结构紧凑便于在 URL、HTTP 请求头等地方传输。 4灵活性JWT 可以包含任意声明支持灵活的身份和权限管理。
4.JWT的使用场景 1身份认证用户登录后生成 JWT之后每次请求时验证 JWT 以实现认证。 2授权通过 JWT 传递用户权限信息确保用户只能访问被授权的资源。 3信息传递JWT 可以安全地传输一些加密的信息。
5. JWT 的安全性注意事项 签名算法建议使用强大的签名算法如 HS256 或 RS256避免使用不安全的算法。 HTTPSJWT 中可能包含敏感信息传输时必须使用 HTTPS 来防止令牌被截获。 令牌过期为 JWT 设置合理的过期时间exp 声明防止长期有效的令牌被滥用。 刷新令牌使用短期有效的访问令牌和长期有效的刷新令牌Refresh Token机制以便在访问令牌过期后请求新的令牌。
6.Java代码实现生成和验证JWT
6.1.添加Maven依赖 如果你使用 Maven 构建项目首先在 pom.xml 中添加 JJWT 库的依赖 dependency groupIdio.jsonwebtoken/groupId artifactIdjjwt-api/artifactId version0.11.5/version /dependency dependency groupIdio.jsonwebtoken/groupId artifactIdjjwt-impl/artifactId version0.11.5/version scoperuntime/scope /dependency dependency groupIdio.jsonwebtoken/groupId artifactIdjjwt-jackson/artifactId version0.11.5/version /dependency
6.2.生成和验证 JWT 的 Java 代码 package com.me.mengyu.auth.net.jwt; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; import io.jsonwebtoken.Claims; import io.jsonwebtoken.security.Keys; import javax.crypto.SecretKey; import java.util.Date; public class JwtExample { // 生成一个密钥用于签名 private static final SecretKey SECRET_KEY Keys.secretKeyFor(SignatureAlgorithm.HS256); // 创建 JWT public static String createJwt(String subject) { // 设置 JWT 过期时间 long expirationTime 1000 * 60 * 60; // 1 小时 return Jwts.builder() .setSubject(subject) // 设置主题可以是用户ID等信息 .setIssuer(your-app) // 设置发行者 .setIssuedAt(new Date()) // 设置签发时间 .setExpiration(new Date(System.currentTimeMillis() expirationTime)) // 设置过期时间 .signWith(SECRET_KEY) // 使用密钥签名 .compact(); // 生成 JWT } // 验证 JWT 并提取信息 public static void validateJwt(String token) { try { // 解析 JWT Claims claims Jwts.parserBuilder() .setSigningKey(SECRET_KEY) // 设置密钥 .build() .parseClaimsJws(token) // 验证令牌 .getBody(); // 输出从 JWT 中提取的信息 System.out.println(Subject: claims.getSubject()); System.out.println(Issuer: claims.getIssuer()); System.out.println(Expiration: claims.getExpiration()); } catch (Exception e) { System.out.println(Invalid JWT token: e.getMessage()); } } public static void main(String[] args) { // 创建 JWT String jwt createJwt(1234567890); // 这里的主题可以是用户的ID System.out.println(Generated JWT: jwt); // 验证 JWT validateJwt(jwt); } }
代码说明 1createJwt 方法生成一个带有签名的 JWT包含用户身份信息subject签发者issuer签发时间和过期时间。使用 HS256 算法和一个密钥签名。 2) validateJwt 方法验证 JWT 是否有效并从中提取 claims 信息如 subjectissuerexpiration。如果令牌无效例如过期或签名不匹配会抛出异常。
运行结果示例: Generated JWT: eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwiaXNzIjoieW91ci1hcHAiLCJpYXQiOjE3MjcwMTcyNDYsImV4cCI6MTcyNzAyMDg0Nn0.tNylO-O5Jbazd0QzR85X8OB7p1mDy0IGtyl97Ro0FYQ Subject: 1234567890 Issuer: your-app Expiration: Mon Sep 23 00:00:46 CST 2024
说明 生成的 JWT格式为 header.payload.signature其中 payload 包含 sub用户ID、iss发行者等信息。 验证输出 Subject、Issuer 和 Expiration表明 JWT 验证成功并解析出了信息。
6.3.注意事项 1密钥管理在生产环境中应该安全地管理密钥避免泄露。 2过期时间务必设置合理的过期时间防止长时间有效的令牌带来安全风险。 3异常处理应当详细处理验证失败的情况比如过期令牌、签名错误等。