JSON Web Tokens (JWT) 与 SessionID 🔐 的区别?2 分钟讲解
有何不同?
为什么选择 JWT?
太棒了!那为什么不使用 JWT Everything 呢?
那么我应该在下一个项目中使用 JWT 吗?
与其他“令牌”一样,JSON Web 令牌 (JWT) 是一种用于身份验证(您是谁)和授权(您可以执行的操作)的机密信息。同样,SessionID 也可以用于身份验证和授权。
有何不同?
主要区别在于 JWT 是自包含的,而 SessionID 不是。
JWT 包含三个部分:<header, payload, signature>
。我不会详细介绍,但主要payload
包含用户身份、用户权限以及signature
验证令牌的有效性。因此,当服务器收到 JWT 时,它可以直接从令牌中获取所有信息,也就是说,JWT 本身就是独立的。
相比之下,SessionID 仅仅是一个很长、唯一的随机字符串。它本身不包含任何用户信息。当服务器收到 SessionID 时,它需要做一些额外的工作来找出它属于哪个用户,以及该用户/服务器可以执行哪些操作。这项额外的工作通常需要进行数据库查询。
另一种看待它的方式是,JWT 是驾驶执照(证明用户是谁,以及他/她可以做什么,驾驶汽车),而 SessionID 是信用卡(只是一个链接到银行账户的随机数,每次交易都需要读卡器与银行对话)。
为什么选择 JWT?
多年来,互联网一直很好地利用了 SessionID。即使在今天,大多数网站仍然在使用 SessionID。然而,在需要处理大量 http 请求的后端系统中,对每个请求中包含的每个 SessionID 进行数据库查找可能会非常昂贵,因为这会增加延迟并降低吞吐量。
这对于 JWT 来说不是问题,因为它本身就包含所有内容。服务器可以直接从 JWT 中读取 JSON 负载,而无需进行任何数据库查找。
太棒了!那为什么不使用 JWT Everything 呢?
首先,JWT 要求你妥善存储和分发用于签名和验证 JWT 的私钥/公钥。而密钥管理很难做到正确,尤其是在大规模分布式系统中。
其次,由于 JWT 是自包含的,因此无法撤销 JWT 令牌。与 SessionID 不同,SessionID 可以直接从数据库中删除,从而移除其与用户的关联。JWT 不会存储在数据库中,因此一旦创建,它就会一直有效,直到过期。这就像信用卡很容易更换,而驾照一旦签发,在任何地方都有效。
最后但同样重要的一点是,由于 JWT 无法撤销,我们倾向于设置较短的过期时间,这需要用户更频繁地重新获取新的 JWT。虽然可以使用刷新令牌,但这会增加客户端的复杂性,而使用 SessionID 时客户端只需存储一个简单的字符串。
那么我应该在下一个项目中使用 JWT 吗?
可能不行。SessionID 应该没问题 :)
文章来源:https://dev.to/getd/json-web-tokens-jwt-vs-sessionid-explained-in-2-mins-1mcn