什么是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开发实战(杨万青 著)

posted @ 2020-04-06 14:10  Jonny-Xhl  阅读(352)  评论(0编辑  收藏  举报