JSON Web Token(JWT)对比Opaque Token

本文探讨了基于token的身份验证,重点比较了JWT和Opaque Tokens两种技术。JWT是自包含的JSON对象,适合分布式微服务环境,但其不可撤销和大小限制可能带来挑战。而Opaque Tokens作为不可读的键,依赖数据库存储用户信息,允许更灵活的角色管理和数据流量控制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

身份验证通常用来验证某人或某事是否如它所说的那样是谁或者是什么。
身份验证技术通过测试查看用户的凭据是否与经过身份验证的用户数据库或服务器中的凭据相匹配,从而提供设备访问控制。
基于token的身份验证的工作原理是,确保每个到服务器的请求后面都有一个签名的令牌,服务器验证该令牌的有效性,然后才响应请求。
token是一段本身没有什么意义或用途的数据,但它根据正确的令牌化方法,在保护应用程序方面发挥了关键作用。

为什么用token而不是传统方式?
  • 令牌是无状态的:令牌是自包含的,包括所需的所有身份验证信息。对于可伸缩性,这是完美的,因为它使您的服务器不必存储会话状态
  • 令牌可以从任何地方生成:令牌的生成与令牌身份验证解耦,允许您在单独的服务器上管理令牌签名,甚至通过另一家公司(如Auth0)
  • 细粒度访问控制:您可以轻松地在令牌有效负载(payload)中定义用户角色和权限,以及用户可以访问的服务
有很多相关技术,但主要是两种:
  1. JWT: Json Web Tokens
  2. Opaque Tokens

让我们学习一下这些令牌是什么,以及在不同情况下做出不同的技术选择。

1.JWT(Json Web Tokens)

实际上,JWT令牌是一个完整的JSON对象,使用base64编码,然后使用对称共享密钥或公共/私有密钥对签名。不同之处在于,如果您的客户需要验证令牌是否已签名,但不允许该客户生成令牌,那么您可以向该客户提供不能生成但仍然验证令牌的公钥。
JWT由三个部分组成: HeaderPayloadSignature
报头和有效负载由Base64编码,然后按时间连接,最后以算法方式对结果进行签名,以header.claims.signature的形式创建一个令牌。报头由用于对令牌进行签名的元数据组成,包括令牌形式和散列算法。有效负载包括关于令牌编码的语句的信息。
看这个JWT:header.claims.signature

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9
.eyJtZXNzYWdlIjoiSldUIFJ1bGVzISIsImlhdCI6MTQ1OTQ0ODExOSwiZXhwIjoxNDU5NDU0NTE5fQ
.-yIVBD5b73C75osbmwwshQNRC7frWUYrqaTjTpza2y4

JWT的优点:
它们可以在没有备用商店的情况下使用。令牌本身内部是验证用户所需的所有信息。它使得在分布式微服务环境中很容易不依赖集中的身份验证服务器和数据库。为了处理令牌的验证,单个微服务只需要一些中间件(JWT库对从Express到JVM MVC框架的任何东西都是公开访问的)和验证所需的密钥。
JWT的缺点:

  • jwt的一个缺点是,如果您需要立即执行操作,那么阻止用户或添加/删除角色会比较困难。要知道,JWT有一个预定义的过期日期,可以设置为未来一周。由于令牌存储在客户端,即使您在数据库中将用户标记为禁用,也没有办法直接使令牌无效。相反,您必须等待它过期。特别是,在开发公共API时,这可能会影响体系结构,而单个高级用户或重要的电子商务应用程序可能无法满足这种需求。
  • 另一方面,如果你有一个包含多个职位的企业应用,比如管理员、项目所有者、服务客户经理,你想要立即产生影响,那么创建它可能会很棘手。特别是,考虑这样一种情况:管理员正在更改其他人(例如他/她的直接报告)的授权角色。因此,如果不刷新JWT,更新后的用户甚至不会意识到他/她的角色发生了变化。
  • 第二个缺点是,随着添加更多字段,令牌将扩展。在无状态应用程序中,令牌几乎对每个请求都发送,因此可能会对数据流量大小产生影响。例如,我们前面提到的企业应用程序可能有几个功能,这可能会增加要存储在令牌中的内容的膨胀和复杂性。考虑设计用于备份AWS或Azure的Web门户的api。对于每个用户的每个资源,您都有目标权限。

2.Opaque Tokens

正如我在前面所解释的,JWT具有可读的内容。每个人都可以解码token并读取其中的信息。另一方面,不透明令牌具有您不打算读取的格式。只有颁发者知道格式。
从字面上看,不透明令牌就像它们听起来那样。不透明令牌只是一个主键,它引用具有数据的数据库条目,而不是在令牌中存储用户标识和声明。像Redis这样的快速键值存储对于利用O(1)搜索payload的内存哈希表来说是完美的。由于角色是直接从数据库中读取的,所以可以修改角色,只要将修改传播到后端,用户就可以看到新的角色。

在Auth0的情况下,不透明令牌可以与/userinfo端点一起使用,以返回用户的配置文件。
如果你收到一个不透明的访问令牌,你不需要验证它。您可以将它与/userinfo端点一起使用,剩下的工作由Auth0负责。

不透明的JWT刷新令牌是一个矛盾。这里的实际意思是,在一些JWT框架中,只有身份验证令牌是JWT,但作为刷新令牌,它们使用不透明令牌。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值