一、JWT简介
JWT(JSON Web Token)是一种开放标准(RFC 7519),它定义了一种紧凑和自包含的方式,用于在各方之间作为 JSON 对象安全地传输信息。JWT 通常用于身份验证和授权。
JWT 可以被用作你的应用和服务之间的一系列安全信息的字符串。这种字符串可以被使用和传送,而不需要易受攻击的授权数据,比如用户名和密码。这可以被用来验证、保证和保护服务和客户端之间的一系列信息。
二、组成方式
一个JWT是一个纯文本字符串,由三个部分组成,它们之间由句点号(.)分隔:
1. Header:由两个参数组成:alg和typ,分别代表算法和token类型。
2. Payload:由三部分组成,标准中注册了七个部分(iss、sub、aud、exp、nbf、iat、jti),分别代表Issuer、Subject、Audience、Expiration Time、Not Before、Issued At、JWT ID。除此之外还可以定义私有字段,如用户ID、角色等。
3. 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; } }
四、优点和缺点
优点:
1. JWT是基于token的机制,无需在服务器端追踪用户状态;
2. 基于JSON标准,易于使用和解析;
3. 支持跨语言、跨平台;
4. 基于标准,支持广泛的开发工具包。
缺点如下:
1. 若JWT被泄漏或者被破解,则攻击者可以访问相关资源;
2. JWT过期时间需要精细控制;
3. JWT一旦签发,无法撤回;
4. 在使用JWT时,最好避免在Payload部分存储敏感信息。
五、应用场景
JWT由于其轻量级、可携带性、易验证和跨语言性等特性,被广泛应用于单点登录、跨域授权、API请求身份验证、移动端验证、网站授权等领域。
六、总结
从以上几个方面深入理解JWT组成,更好的应用JWT,这将有助于实现更好的用户验证和授权管理。