什么是JWT
1、什么是JWT?
JWT
(JSON WEB TOKEN)是一个开放标砖(RFC 7519)。它作为一种Token格式,定义 了一种紧凑的、自包含的方式,用于在多方之间安全的传输JSON格式的信息。由于所传输的信息会被签名,因此Token能够被验证并信任;它支持使用HMAC算法
或者是RSA
的公私密钥对进行签名。JWT可用于多种目的,比如作为Bearer Token
用来实现认证功能,这也是JWT最创建的用法;此外,它还可以用于安全地传递信息。
JWT由3部分组成,头部(Header)、负载(Payload)、签名(Signature),每部分之间以.
分隔。
- Header
- 声明类型,这里是jwt
- 声明加密的算法 通常直接使用 HMAC SHA256
例如:
{
'typ': 'JWT',
'alg': 'HS256'
}
- Playload
负载部分包括要 传输的信息,通常由多个Claim(声明)
构成,Claim是 与实体(通常是用户)相关的信息以及其他元数据,每个Claim包括两部分:类型名
和值
。在负载中的Claim由3中类型:已注册、公共、私有。
已注册的常见类型如下表
代 码 | 名 称 | 描 述 |
---|---|---|
iss | Issuer | 签发者 |
sub | Subject | 主题 |
aud | Audience | 接收方 |
exp | Expriation time | 过期时间 |
nbf | Not before | JWT有效的开始时间 |
iat | Issue at | 签发JWT时的时间 |
jti | JWTID | JWT的唯一标识符 |
上述代码中都是3个字符,就是为了保证JWT的紧凑性
例如:
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}
- 签名(Signature)
Signature是用来验证发送者的JWT的同时也能确保在期间不被篡改。
一个典型的 JWT内容如下:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1bmlxdWVfbmFtZSI6ImFkbWluIiwiZW1haWwiOiJ4aGwuam9ubnlAZ21haWwuY29tIiwiTWFuYWdlSWQiOiJhZG1pbiIsInJvbGUiOiJhZG1pbiIsIm5iZiI6MTU4NjE1Mjc1OSwiZXhwIjoxNTg2MTUyOTM5LCJpYXQiOjE1ODYxNTI3NTl9.Mk2OxomGOGYFt5tttIneuOq-K59RfgXGekDNPNYcegc
注意:由于Token中的内容都是通过Base64编码,因此它也是很容易被解码,所以不应该在Token中包含敏感信息,如用户密码等。
2、总结
2.1、优点
- 因为JSON的通用性,所以JWT是可以进行跨语言支持的。
- 因为有了payload部分,所以JWT可以在自身存储一些其他业务逻辑所必要的非敏感信息。
- 便于传输,JWT的构成非常简单,字节占用很小,所以它是非常便于传输的。
- 不需要在服务端保存会话信息,。
2.2、安全相关
- 不应该在jwt的payload部分存放敏感信息,因为该部分是客户端可解密的部分。
- 保护好secret私钥,该私钥非常重要。
参考文档:https://www.jianshu.com/p/576dbf44b2ae
ASP.NET Core 与RESTful API开发实战(杨万青 著)