Json web token(JWT)简要学习

标签: JWT

1.什么是JSON Web Token?

JSON Web Token(JWT)是一个开放式标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间以JSON对象安全传输信息。这些信息可以通过数字签名进行验证和信任。可以使用加密(使用HMAC算法)或使用RSA的公钥/私钥对对JWT进行签名。

2.JWT的优缺点

优点

随着技术的发展,分布式web应 用的普及,通过session管理用户登录状态成本越来越高,因此慢慢发展成为token的方式做登录身份校验,然后通过token去取redis中的缓存的用户信息,随着之后jwt的出现,校验方式更加简单便捷化,无需通过redis缓存,而是直接根据token取出保存的用户信息,以及对token可用性校验,单点登录更为简单。

  • Compact【紧凑】:体积小,因而传输速度更快
  • Self-contained【自包含】:有效载荷(Playload)包含有关用户的所有必需信息,避免了多次查询数据库。
  • 多样化的传输方式,可以通过URL传输、POST传输、请求头Header传输(常用)
  • 简单方便,服务端拿到jwt后无需再次查询数据库校验token可用性,也无需进行redis缓存校验
  • 在分布式系统中,很好地解决了单点登录问题
  • 很方便的解决了跨域授权问题,因为跨域无法共享cookie
缺点
  • 获取到jwt也就拥有了登录权限,因此jwt是不可泄露的,网站最好使用https,防止中间攻击偷取jwt
  • 在退出登录 / 修改密码时,需要设置JWT Token失效

3.JWT的结构

在紧凑的形式中,JWT包含三个由点(.)分隔的部分,它们分别是:

  • Header
  • Payload
  • Signature

Header: 通常由两部分组成:令牌的类型,即JWT,以及所使用的加密算法。{ "alg": "HS256", "typ": "JWT"}Base64加密后,就变成了:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
Payload: 里面可以放置自定义的信息,以及过期时间、发行人等。
{ "sub": "1234567890", "name": "John Doe", "iat": 1516239022}
Base64加密后,就变成了:eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ
**Signature:**计算此签名需要四部分信息:1)Header里的算法信息2)Header3)Payload4)一个自定义的秘钥

JWT结构通常如下所示:

xxxxx.yyyyy.zzzzz

4.JWT工作原理

在身份验证中,当用户使用他们的凭证成功登录时,JSON Web Token将被返回并且必须保存在本地(通常在本地存储中,但也可以使用Cookie),而不是在传统方法中创建会话 服务器并返回一个cookie。
无论何时用户想要访问受保护的路由或资源,用户代理都应使用承载方案发送JWT,通常在请求头中的Authorization字段,使用Bearer schema:

Authorization: Bearer <token>

这是一种无状态身份验证机制,因为用户状态永远不会保存在服务器内存中。 服务器受保护的路由将在授权头中检查有效的JWT,如果存在,则允许用户访问受保护的资源。 由于JWT是独立的,所有必要的信息都在那里,减少了多次查询数据库的需求。

这使得我们可以完全依赖无状态的数据API,甚至向下游服务提出请求。 无论哪些域正在为API提供服务并不重要,因此不会出现跨域资源共享(CORS)的问题,因为它不使用Cookie。
在这里插入图片描述
工作流程:

  1. 应用程序或客户端向授权服务器请求授权。这里的授权服务器可以是单独的一个应用,也可以和API集成在同一个应用里。
  2. 授权服务器向应用程序返回一个JWT。
  3. 应用程序将JWT放入到请求里(通常放在HTTP的Authorization头里)
  4. 服务端接收到请求后,验证JWT并执行对应逻辑。

5.JWT在线验证

https://jwt.io/

版权声明:本文为weixin_42338555原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_42338555/article/details/82776069