首页 > 其他分享 >4. JWT(JSON Web Token)鉴权

4. JWT(JSON Web Token)鉴权

时间:2023-02-17 14:13:21浏览次数:40  
标签:Web 加密 JWT Token JSON 签名 服务端 客户端

通过第三节,知道了 Token 的使用方式以及组成,不难发现,服务端验证客户端发送过来的 Token 时,还需要查询数据库获取用户基本信息,然后验证 Token 是否有效;
这样每次请求验证都要查询数据库,增加了查库带来的延迟等性能消耗;
那么这时候业界常用的 JWT 就应运而生了!!!

4.1 什么是 JWT

JWT 是 Auth0 提出的通过 对 JSON 进行加密签名来实现授权验证的方案;
就是登录成功后将相关用户信息组成 JSON 对象,然后对这个对象进行某种方式的加密,返回给客户端;
客户端在下次请求时带上这个 Token;
服务端再收到请求时校验 token 合法性,其实也就是在校验请求的合法性。

4.2 JWT 的组成

JWT 由三部分组成: Header 头部、 Payload 负载 和 Signature 签名
它是一个很长的字符串,中间用点(.)分隔成三个部分。列如 :

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

Header 头部:

在 Header 中通常包含了两部分:
typ:代表 Token 的类型,这里使用的是 JWT 类型;
alg:使用的 Hash 算法,例如 HMAC SHA256 或 RSA.

{
  "alg": "HS256",
  "typ": "JWT"
}

Payload 负载:

它包含一些声明 Claim (实体的描述,通常是一个 User 信息,还包括一些其他的元数据) ,用来存放实际需要传递的数据,JWT 规定了 7 个官方字段:
iss (issuer):签发人
exp (expiration time):过期时间
sub (subject):主题
aud (audience):受众
nbf (Not Before):生效时间
iat (Issued At):签发时间
jti (JWT ID):编号

除了官方字段,还可以在这个部分定义私有字段,下面就是一个例子。

{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true
}

Signature 签名

Signature 部分是对前两部分的签名,防止数据篡改。
首先,需要指定一个密钥(secret)。这个密钥只有服务器才知道,不能泄露给用户。然后,使用 Header 里面指定的签名算法(默认是 HMAC SHA256),按照下面的公式产生签名。

HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret);

4.3 JWT 的使用方式

客户端收到服务器返回的 JWT,可以储存在 Cookie 里面,也可以储存在 localStorage。
此后,客户端每次与服务器通信,都要带上这个 JWT。你可以把它放在 Cookie 里面自动发送,但是这样不能跨域,所以更好的做法是放在 HTTP 请求的头信息 Authorization 字段里面。

Authorization: Bearer <token>

4.4 JWT 的认证流程图

其实 JWT 的认证流程与 Token 的认证流程差不多,只是不需要再单独去查询数据库查找用户用户;简要概括如下:

4.5 JWT 的优点

不需要在服务端保存会话信息(RESTful API 的原则之一就是无状态),所以易于应用的扩展,即信息不保存在服务端,不会存在 Session 扩展不方便的情况;
JWT 中的 Payload 负载可以存储常用信息,用于信息交换,有效地使用 JWT,可以降低服务端查询数据库的次数

4.6 JWT 的缺点

加密问题: JWT 默认是不加密,但也是可以加密的。生成原始 Token 以后,可以用密钥再加密一次。
到期问题: 由于服务器不保存 Session 状态,因此无法在使用过程中废止某个 Token,或者更改 Token 的权限。也就是说,一旦 JWT 签发了,在到期之前就会始终有效,除非服务器部署额外的逻辑。

4.7 前端常用的 JWT 库推荐

使用 express:express-jwt
使用 koa:koa-jwt

标签:Web,加密,JWT,Token,JSON,签名,服务端,客户端
From: https://www.cnblogs.com/wp-leonard/p/17129917.html

相关文章

  • 【博学谷学习记录】超强总结,用心分享 | 前端开发 web APIs(四)
    WebAPIs-第4天进一步学习DOM相关知识,实现可交互的网页特效能够插入、删除和替换元素节点能够依据元素节点关系查找节点1日期对象掌握Date日期对象的使用,......
  • 通过flask完成web实时播放视频
    defgen():r=redis.StrictRedis(host=REDIS_HOST,port=REDIS_PORT,db=REDIS_DB,password=PASS_WORD)whileTrue:try:#print(r.get(......
  • 2023前端开发最新面试题收集-Webpack篇
    webpack整理谈谈webpack的理解webpack是一个静态模块打包器。当webpack处理应用程序时,会递归构建一个依赖关系图,其中包括应用程序所需的所有模块,最后将这些模块打包成一......
  • WebAPI例子
    1.WebApiConfig配置API路由usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Web.Http;namespaceWebAPIDemo1{publicstatic......
  • .Net Core WebAPI 序列化时忽略空值字段
    特定实体publicclassAPIResponseModel{///<summary>///返回标识,200:成功,其它:失败///</summary>publicstringCo......
  • webim 实现实时通讯的 4 种方式
    本文前半段主要节选自:WebSocket,后半段总结和概括自沈剑大佬的两篇文章和文章评论http如何像tcp一样实时的收消息?、网页端收消息,究竟是推还是拉?,完整参考见文末。webim是......
  • uniapp开发在hbuilderx运行小程序时微信开发者工具编辑出错:error:game.json:未找到gam
      uniapp开发在hbuilderx运行小程序时微信开发者工具编辑出错:error:game.json:未找到game.json文件,或者文件读取失败处理。是因为我当前登录微信开发者账号是开发小程......
  • day11-JSON处理和HttpMessageConverter<T>
    JOSN处理和HttpMessageConverter1.JSON处理-@ResponseBody说明:在实际开发中,我们往往需要服务器返回的数据都是JSON格式。SpringMVC提供了@ResponseBody注解,用来标......
  • JWT(生成Token令牌)
    .NetCore配置使用什么是JWT(详情在面试.md中有)JWT是目前最流行的跨域身份验证解决方案,JWT的原则是在服务器身份验证之后,会返回一个Json数据,,之后,当用户与服务器通......
  • python处理json
    importjson#str----->jsonstr='{"name":"御姐","age":18}'j=json.loads(str)print(j)print(type(j))#str----->json------>strstr='{"name":"御姐",......