Json Web Token (JWT)
Json web token (JWT),它是基于 RFC 7519 标准定义的一种可以安全传输的的JSON对象,由于使用了数字签名,所以是可信任和安全的。
JWT令牌由三部分组成,每部分中间使用点(.)分隔,比如:xxxxx.yyyyy.zzzzz
-
Header头部包括令牌的类型(即JWT)及使用的哈希算法(如HMAC SHA256或RSA)一个例子如下:下边是Header部分的内容
1 2 3 4 | { "alg" : "HS256" , "typ" : "JWT" } |
将上边的内容使用Base64Url编码,得到一个字符串就是JWT令牌的第一部分。
-
Payload第二部分是负载,内容也是一个json对象,它是存放有效信息的地方,它可以存放jwt提供的现成字段,比如:iss(签发者),exp(过期时间戳), sub(面向的用户)等,也可自定义字段。此部分不建议存放敏感信息,因为此部分可以解码还原原始内容。最后将第二部分负载使用 Base64Url 编码,得到一个字符串就是 JWT 令牌的第二部分。一个例子:
1 2 3 4 5 | { "sub" : "1234567890" , "name" : "456" , "admin" : true } |
-
Signature第三部分是签名,此部分用于防止 jwt 内容被篡改。这个部分使用 base64url 将前两部分进行编码,编码后使用点(.)连接组成字符串,最后在 header 中声明签名算法进行签名。一个例子:
1 2 3 4 | HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret) |
base64UrlEncode(header):jwt令牌的第一部分。
base64UrlEncode(payload):jwt令牌的第二部分。
secret:签名所使用的密钥。
JWT实现认证和授权的原理
- 用户调用登录接口,登录成功后获取到JWT的token;
- 之后用户每次调用接口都在http的header中添加一个叫Authorization的头,值为JWT的token;
- 后台程序通过对Authorization头中信息的解码及数字签名校验来获取其中的用户信息,从而实现认证和授权。
Token 的生成
1 2 3 4 5 6 7 8 9 | /** * 根据用户信息生成token */ public String generateToken(UserDetails userDetails) { Map<String, Object> claims = new HashMap<>(); claims.put(CLAIM_KEY_USERNAME, userDetails.getUsername()); claims.put(CLAIM_KEY_CREATED, new Date()); return generateToken(claims); } |
1 2 3 4 5 6 7 8 9 10 | /** * 根据负责生成JWT的token */ private String generateToken(Map<String, Object> claims) { return Jwts.builder() .setClaims(claims) //payload .setExpiration(generateExpirationDate()) //过期时间 .signWith(SignatureAlgorithm.HS512, secret) //加密算法 .compact(); } |
分类:
SpringSecurity
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 理解Rust引用及其生命周期标识(下)
· 从二进制到误差:逐行拆解C语言浮点运算中的4008175468544之谜
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 2025成都.NET开发者Connect圆满结束
· 后端思维之高并发处理方案
· 在 VS Code 中,一键安装 MCP Server!
· 千万级大表的优化技巧
· 10年+ .NET Coder 心语 ── 继承的思维:从思维模式到架构设计的深度解析