JWT简介
JWT(JSON Web Token)是一种开放标准(RFC 7519),它定义了一种紧凑和自包含的方式,用于在各方之间作为 JSON 对象安全地传输信息。JWT 通常用于身份验证和授权。 JWT 可以被用作你的应用和服务之间的一系列安全信息的字符串。这种字符串可以被使用和传送,而不需要易受攻击的授权数据,比如用户名和密码。这可以被用来验证、保证和保护服务和客户端之间的一系列信息。
组成方式
一个JWT是一个纯文本字符串,由三个部分组成,它们之间由句点号(.)分隔:
- Header:由两个参数组成:
alg
和typ
,分别代表算法和token类型。 - Payload:由三部分组成,标准中注册了七个部分(
iss
、sub
、aud
、exp
、nbf
、iat
、jti
),分别代表Issuer、Subject、Audience、Expiration Time、Not Before、Issued At、JWT ID。除此之外还可以定义私有字段,如用户ID、角色等。 - Signature:将.Header和.Payload字符串拼接(由 . 隔开),再加上一个密钥,使用Header中指定的算法(如HMAC SHA256算法)生成一个字符串。
JWT验证流程
在用户登录成功后,服务器将JWT token发送给客户端,客户端将JWT token保存在本地(通常使用localStorage),在每次向服务器请求数据时,将token作为请求头部的Authorization
字段发送到服务器。服务器使用密钥来验证token的合法性,如果token验证通过,则允许操作。
//示例代码
const jwt = require('jsonwebtoken');
const SECRET = 'YOUR_SECRET_KEY';
function createToken(payload) {
return jwt.sign(payload, SECRET);
}
function validateToken(token) {
try {
return jwt.verify(token, SECRET);
} catch (err) {
return false;
}
}
优点和缺点
优点:
- JWT是基于token的机制,无需在服务器端追踪用户状态;
- 基于JSON标准,易于使用和解析;
- 支持跨语言、跨平台;
- 基于标准,支持广泛的开发工具包。 缺点如下:
- 若JWT被泄漏或者被破解,则攻击者可以访问相关资源;
- JWT过期时间需要精细控制;
- JWT一旦签发,无法撤回;
- 在使用JWT时,最好避免在Payload部分存储敏感信息。
应用场景
JWT由于其轻量级、可携带性、易验证和跨语言性等特性,被广泛应用于单点登录、跨域授权、API请求身份验证、移动端验证、网站授权等领域。
总结
从以上几个方面深入理解JWT组成,更好的应用JWT,这将有助于实现更好的用户验证和授权管理。