JSON Web Token (简称JWT)是一个开放标准(RFC 7519),它定义了一种紧凑的、自包含的方式,用于作为JSON对象在各方之间安全地传输信息。该信息可以被验证和信任,因为它是数字签名的。
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c结构上长这样xxxxx.yyyyy.zzzzz,用两个.划分为三个部分:分别是Header、Payload以及Signature。可以通过JWT官方提供的在线工具jwt.io/#debugger-i…进行在线解密插件(这也说明了jwt的信息都是明文的 建议不要放敏感信息)
{ "alg": "HS256", "typ": "JWT" }然后再使用Base64Url编码得到第一节信息:
$ echo -n '{"alg":"HS256","typ":"JWT"}' | base64 | tr '/+' '_-' | tr -d '=' eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9Payload:
{ "sub": "1234567890", "name": "John Doe", "iat": 1516239022 }然后再使用Base64Url编码得到第二节信息:
$ echo -n '{"sub":"1234567890","name":"John Doe","iat":1516239022}' | base64 | tr '/+' '_-' | tr -d '=' eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQSignature
HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
JWT流行的原因在于其无状态,具备去中心化的认证优势。回想下传统的基于session+cookie的认知方法,一是有服务端横向扩展限制,一般需要引入redis来存储这些session信息;二是在涉及跨域场景中会有问题,因为cookie的跨域限制。
JWT优势在于通过统一的认证中心签发JWT后,当用户携带这些JWT访问子资源或者其他SSO内站点时,这些服务端系统可以通过JWT签名验证客户端身份,这避免了中心化的认知流程,降低了系统间的耦合度。
但是JWT也不是非常的完美,一是一旦JWT被泄漏,拥有JWT方就能掌握你的全部认证信息,进行敏感资源操作,所以一般JWT的过期时间不宜太长;二是JWT的撤销机制比较差,一旦JWT被签发出来,由于都是基于公钥的验证机制,此时如果管理员由于泄漏风险需要撤销此JWT,单纯依赖JWT的机制是不能实现的,只能引入第三方的消息通知机制一一通知到下游系统撤销该JWT,整个过程会比较繁琐。
所以建议在极端敏感的场景下,推荐基于共享session方案实现跨域认证。实际大部分业务中,通过签发短实效性的JWT是完成能够满足安全性要求的。
如果在不同后端系统间调用时需要使用JWT,其实现方案一般是每个系统维护自己的一套公私钥,并提供获取公钥方法(可以提前将公钥注册到其他系统,或者提供API以获取公钥)。
假设有A、B两系统,A需要访问B的API,则A系统提前在B系统上注册好自己的身份,并注册公钥绑定到其身份上。请求前,A利用私钥签发JWT,并包含身份信息,将JWT放置在header中和请求一起发送给B。B收到后,先从JWT中获取身份信息,并利用其身份对应的公钥验证JWT,验证通过即完成了对请求方A身份的验证
JWT更加适用于API调用的场景,用于身份认证;Oauth2适用于在浏览器、移动端、PC端等需要多端共享资源或者认证的情况下使用,Oauth2的典型场景是第三方登录(如某博客网站可以利用微信账号进行登录)
总结:
JWT(JSON Web Token)是一种轻量级的身份验证协议,它具有许多优点,因此在现代应用程序中越来越受欢迎。以下是为什么现在流行使用JWT进行身份验证的一些原因:
跨语言兼容性:JWT使用JSON格式编写,这意味着它可以在不同语言和平台之间轻松传输和解析。
易于解析和验证:JWT可以使用内置于大多数编程语言中的库来解析和验证。它的结构也很简单,易于理解和解析。
无需共享状态:由于JWT不需要在服务之间共享状态,因此它是一种无状态的身份验证方法。这意味着您不需要维护会话状态,从而简化了应用程序的设计和实现。
安全性强:JWT使用加密签名来确保消息的完整性和真实性。这使得JWT很难被篡改或伪造。
轻量级:JWT不需要大型数据库查询或复杂的计算,因此它是一种轻量级的身份验证方法。这使得它在处理大量用户身份验证时非常有效。
支持多租户:JWT可以包含丰富的信息,例如用户角色、租户ID等,这使得它非常适合支持多租户应用程序。
综上所述,JWT是一种高效、安全、轻量级的身份验证方法,适用于各种类型的应用程序。