简介
用户提供用户名和密码给认证服务器,服务器验证用户提交的信息的合法性,如果验证成功则返回一个 token , 用户可以使用这个 token 访问服务器上受保护的资源。
示例代码:https://github.com/ddzyan/node-project/tree/master/jwt-auth
token 结构
header.claims.signature
为了安全的在 url 中使用,所有部分都用 base64 URL-safe 进行编码处理
Header
简单声明了类型以及产生签名所使用的算法
{
"alg" : "AES256",
"typ" : "JWT"
}
Claims 声明
表示要发送的用户详细信息。
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}
Signature
签名的目的是为了保证上边两部分信息不被篡改。一般使用一个私钥通过非对称加密算法对 Header 和 Claims 进行混淆产生签名信息。
一般有两个选择:
- HS256
- RS256
RS256 (采用 SHA-256 的 RSA 签名) 是一种非对称算法, 它使用公共/私钥对: 标识提供方采用私钥生成签名, JWT 的使用方获取公钥以验证签名。
HS256 (带有 SHA-256 的 HMAC 是一种对称算法, 双方之间仅共享一个 密钥。由于使用相同的密钥生成签名和验证签名, 因此必须注意确保密钥不被泄密
在开发应用的时候启用 JWT,使用 RS256 更加安全,可以将公钥提供给 JWT 使用方进行解密验签,而无需担心私钥丢失。而如果使用 HS256 则必须将密钥提供给 JWT 使用方进行验签,从而可能导致私钥丢失或者泄漏。
优点
- 服务器无状态化,可用于多台服务器之间的登录
- 减少客户端登录次数,降低服务器压力
缺点
- 用于加密的密钥如果破解,则用户可以随意伪造
- 由于客户端保存认证信息,则服务器认证通过后,在一段时间内将无法取消用户登录权限
node 模块
- jsonwebtoken