JWT签发全指南:从原理到安全实践

你的系统还在用 Session?不妨试试这种无状态的认证方式

在开发 Web 应用或移动应用时,用户认证几乎是每个项目都绕不开的功能。传统的 Session 认证虽然稳定,但在分布式环境下却显得有些力不从心。而 JWT(JSON Web Token)作为一种轻量级、无状态的认证方案,近年来已成为前后端分离架构中的主流选择。

今天,我们就来全方位聊一聊 JWT 签发这个话题------它到底是什么?如何生成?有什么安全坑需要避开?不同语言又该如何实现?


一、JWT 长什么样?

先看一个典型的 JWT:

复制代码
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

它由三部分组成,用点(.)分隔:

Header(头部):描述令牌类型和签名算法

Payload(载荷):存放实际的数据(如用户ID、过期时间等)

Signature(签名):对前两部分进行签名,防止篡改

这三部分各自经过 Base64Url 编码后拼接而成。可以把它理解为一个"自包含"的身份证------服务端无需存储状态,只需验证签名就能信任其中的信息。


二、JWT 签发流程详解

签发 JWT 的过程并不复杂,核心步骤如下:

第一步:选择签名算法

根据架构和安全需求,选择对称或非对称算法:

类型 常见算法 适用场景
对称 HS256 / HS384 / HS512 单一服务端,或可安全共享密钥的环境
非对称 RS256 / ES256 分布式系统,多个服务需验证令牌

⚠️ 特别提醒:永远不要使用 alg: none,否则任何人都可以伪造令牌!

第二步:准备密钥

对称算法:准备一个足够长的密钥(建议 32 字节以上),存储在环境变量或密钥管理服务中。

非对称算法:生成 RSA 或 ECDSA 密钥对,私钥用于签名,公钥分发给各验证方。

第三步:构建 Header 和 Payload

Header 示例:

复制代码
{
  "alg": "HS256",
  "typ": "JWT"
}

Payload 示例:

复制代码
{
  "sub": "user_123456",
  "name": "张三",
  "role": "admin",
  "iat": 1700000000,
  "exp": 1700003600
}

第四步:计算签名

将 Header 和 Payload 分别 Base64Url 编码后用点拼接,再用密钥和算法生成签名。

第五步:组合输出

将三部分用点连接,返回给客户端。

整个过程可以用一句话概括:把你要传递的信息打包,盖上一个无法伪造的印章


三、那些"官方推荐"的标准声明

JWT 规范定义了一组可选的标准字段,建议在签发时尽量使用,以增强令牌的可移植性和安全性:

字段 名称 含义
iss Issuer 令牌的签发者
sub Subject 令牌的主体(通常是用户标识)
aud Audience 令牌的接收方
exp Expiration Time 过期时间,必须设置!
nbf Not Before 生效时间,在此之前令牌无效
iat Issued At 签发时间
jti JWT ID 唯一标识,可用于防重放

💡 小贴士:时间戳请使用 Unix 秒数(UTC),避免使用浮点数。


四、安全实践:这 6 点一定要记住

1. 密钥管理是重中之重

1)对称密钥要足够随机、足够长

2)非对称私钥要加密存储、限制权限

3)不同环境使用不同密钥,定期轮换

2. 有效期要短

JWT 一旦签发,在过期前无法主动撤销。建议:

1)访问令牌有效期:15 分钟 ~ 2 小时

2)配合 Refresh Token 实现长期会话

3. 不要在 Payload 中放敏感信息

JWT 只是签名,不是加密!Payload 仅经过 Base64 编码,任何人都能解码查看内容。绝对不要存放密码、信用卡号等敏感数据

4. 验证时强制检查算法

有些攻击会尝试将 RS256 降级为 HS256。务必在验证时校验算法是否在白名单内。

5. 始终使用 HTTPS

JWT 在网络中明文传输(即使经过编码),必须通过 HTTPS 防止中间人截获。

6. 选择合适的存储方式

Cookie :设置 HttpOnly + Secure + SameSite,可防御 XSS,但需防范 CSRF

localStorage:易受 XSS 攻击,谨慎使用


五、代码实战:四种语言签发示例

1. Node.js(jsonwebtoken)

javascript 复制代码
const jwt = require('jsonwebtoken');

const payload = { sub: '1234567890', name: 'John Doe', role: 'admin' };
const secret = 'your-256-bit-secret';

const token = jwt.sign(payload, secret, { expiresIn: '1h', issuer: 'myapp' });
console.log(token);

2. Python(PyJWT)

python 复制代码
import jwt
import datetime

payload = {
    'sub': '1234567890',
    'name': 'John Doe',
    'exp': datetime.datetime.utcnow() + datetime.timedelta(hours=1)
}
token = jwt.encode(payload, 'your-256-bit-secret', algorithm='HS256')
print(token)

3. Java(jjwt)

java 复制代码
String token = Jwts.builder()
    .setSubject("1234567890")
    .claim("name", "John Doe")
    .setExpiration(new Date(System.currentTimeMillis() + 3600000))
    .signWith(SignatureAlgorithm.HS256, "your-256-bit-secret")
    .compact();

4. Go(golang-jwt)

Go 复制代码
claims := jwt.MapClaims{
    "sub":  "1234567890",
    "name": "John Doe",
    "exp":  time.Now().Add(time.Hour).Unix(),
}
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
tokenString, _ := token.SignedString([]byte("your-256-bit-secret"))

六、常见误区盘点

以为 JWT 是加密的

其实只是签名,任何人都能解码查看内容。如需加密,请使用 JWE。

不设置过期时间

一旦泄露,令牌永久有效,风险极高。

密钥硬编码在代码中

应该通过环境变量或配置中心注入。

没有退出机制

JWT 在过期前无法主动失效,建议配合短期令牌 + refresh token + 黑名单。


七、总结

JWT 签发是现代应用实现无状态认证的核心技术。它让服务端不再需要存储 Session,极大地提升了分布式系统的扩展性。但在享受便利的同时,也别忘了:

1)选择合适算法,管好密钥

2)设置合理有效期,避免永久令牌

3)敏感信息不放载荷,传输全程走 HTTPS

4)使用成熟的第三方库,不要自己造轮子

相关推荐
2401_840192276 小时前
k8s的crd、operator、cr分别是什么?
运维·分布式·kubernetes·prometheus
lifejump7 小时前
Dede(织梦)CMS渗透测试(all)
前端·网络·安全·web安全
星幻元宇VR7 小时前
VR文旅大空间|沉浸式体验重塑文旅新场景
科技·学习·安全·vr·虚拟现实
紫金桥软件7 小时前
组态软件新势力,安全可靠高性能经多行业认证紫金桥软件RealSCADA
安全·scada·组态软件·国产工业软件·监控组态软件
HKT_China7 小时前
物联网安全管理方案 助力企业实施智慧安全管理
物联网·安全·数字化转型
HackTwoHub8 小时前
AI提示词注入绕过工具:一键绕过Codex/Claude安全限制,CTF夺旗与渗透测试必备神器
网络·人工智能·安全·web安全·系统安全·网络攻击模型·安全架构
诺未科技_NovaTech8 小时前
Microsoft 365 E7 ,“AI+安全+身份”三位一体,打造 AI 时代的一站式操作系统
人工智能·安全·microsoft
天纵软件8 小时前
竞赛复盘与效果转化!让安全知识竞赛不止于“一场活动”
安全·知识竞赛承办·技能知识竞赛·知识竞赛活动公司·高端知识竞赛·安全知识竞赛
jiayong238 小时前
Tool Permission 与 Sandbox 的安全流水线:Agent 工具系统的工程边界
java·数据库·安全·agent
sensen_kiss8 小时前
CAN302 Technologies for E-Commerce 电子商务技术 Pt.8 网络安全(Secure the Web)
网络·学习·安全·web安全