JWT
JWT(JSON Web Token)是一种紧凑、URL 安全的令牌格式,由 RFC 7519 定义,常用于登录鉴权和服务间传递身份信息。它由三段用 . 连接的字符串组成:Header.Payload.Signature,每段都是 Base64Url 编码。Header 说明签名算法(如 HS256),Payload 存放声明(claims),Signature 用于校验前两段是否被篡改。
常见的 Payload 声明包括:
iss签发者、sub主题(通常是用户 ID)、aud接收方exp过期时间、iat签发时间(都是 Unix 时间戳)
服务端用密钥(HMAC 对称)或私钥(RSA/ECDSA 非对称)生成签名,验证时重新计算并比对,从而确认令牌可信且未被改动。
最大的误区是把 JWT 当成"加密":它只是编码,Payload 任何人 Base64 解一下就能读,因此不能放密码等敏感信息。签名只保证完整性和来源,不保证保密性。此外,JWT 一旦签发就难以主动作废,应设置较短的 exp;验证时还要固定校验算法,不要盲目信任令牌里自带的 alg(防 alg:none 攻击)。用 jwt-decode 工具可以快速拆开查看 Header 和 Payload,但解码不等于验证签名。
常见问题
JWT 是加密的吗?放在里面的数据安全吗?
不是。JWT 默认只做 Base64Url 编码,并非加密,Payload 谁都能解开阅读。它靠签名保证内容不被篡改,但不保证保密,所以别在里面放密码、密钥等敏感数据。
用户退出登录或令牌泄露了,怎么让 JWT 失效?
JWT 是无状态的,签发后服务端默认无法单独作废某个令牌。常见做法是把 exp 设短、配合 refresh token,或在服务端维护黑名单 / 令牌版本号来强制失效。
jwt-decode 能验证令牌是不是真的吗?
不能。解码只是把三段 Base64 还原成明文,方便你查看 Header 和 Payload;令牌是否合法需要用密钥重新计算签名并校验 exp 等声明,那要由服务端完成。