关于Cookie身份验证与令牌身份验证的混淆,究竟有什么区别?

Confusion about Cookie Authentication vs Token Authentication, what is the difference exactly?

提问人:Qiulang 提问时间:11/8/2023 最后编辑:Qiulang 更新时间:11/10/2023 访问量:63

问:

我阅读了令牌身份验证与 Cookie会话与基于令牌的身份验证

我还阅读了如何使用 HTTP Cookie、会话和令牌进行 Web 身份验证和授权?和 Cookie 与令牌:权威指南

但是,那里的所有答案以及这两篇文章中提出的所有观点都让我对 Cookie 身份验证与令牌身份验证(尤其是 JWT)之间的区别更加困惑,尤其是从身份验证过程的角度来看。毕竟,这两种方法都将从服务器返回一个加密的字符串,之后服务器将验证该字符串。

我有一个项目,它通过以下方式实现了“令牌身份验证”,

  1. 用户输入其登录凭据。服务器验证凭据 是正确的,并返回一个“令牌”,一个长加密的字符串。令牌具有过期时间。
  2. 此令牌存储在用户浏览器的本地存储中。服务器还将此令牌与用户的其他信息(主要是他的权限)一起存储。
  3. 对服务器的后续请求将此令牌包含在自定义请求标头字段中。
  4. 服务器首先验证令牌是否正确,然后验证权限信息,以查看他/她是否可以访问请求的资源。
  5. 用户注销后,令牌将从客户端和服务器端删除。

我知道与 Cookie 身份验证的明显区别在于 cookie 存储在浏览器的 cookie 中,并且 cookie 将具有在 MDN 中定义的 name/path/domain/httponly... 等属性。cookie 将由浏览器自动发送,而我们的客户端 js 代码需要在每个请求中添加令牌。

但除此之外有什么区别?我也感到非常困惑的是,人们总是说使用cookie进行会话控制。我看到人们可以互换使用基于会话的身份验证和基于 Cookie 的身份验证,就好像令牌身份验证不能进行会话控制(因此是无状态的)。

显然,我们的代码使用令牌来执行“会话控制”。如果请求不包含有效令牌或权限不足,则将被拒绝。当用户注销时,令牌将被删除,下次登录服务器时,服务器将为他提供一个新令牌。

我一直认为,在用户登录期间,我们正在进行某种会话控制(直到他注销)。

我的最后一个问题是(除了差异之外)我们的令牌身份验证及其“会话控制”是否存在任何潜在问题?(我怀疑这个项目是很久以前创建的,当时有移动客户端,当时从移动应用程序发送 cookie 并不容易,但我无法确认这一点。

我在这里附上一张网络请求图片,以使我的流程更清晰。在登录期间,有一个从服务器获取令牌的请求,之后的每个请求都将包含令牌标头。

token process

身份验证 安全 会话 Cookie 令牌

评论

0赞 CBroe 11/8/2023
你说“不是特别的 JWT”,但如果我们认为令牌至少在性质上意味着类似的东西,而不管具体的实现如何——那么我会说,主要区别在于令牌本身可以包含(加密)信息,而单纯的会话 ID 是一个“愚蠢”的东西,它只能识别一组特定的存储数据。令牌 = 基于一组特定的数据创建,会话 ID = 随机值,仅用作标识符。(令牌可以用于提供唯一标识符以关联会话数据的相同目的,这当然是正确的。
0赞 Qiulang 11/8/2023
感谢您的评论。我说“不是特别的 JWT”有两个原因。我想知道令牌身份验证的一般情况。令牌身份验证肯定不仅仅是 JWT,对吧?(所以我不希望 JWT 偏离我的问题)。我们的实现不使用 JWT,我的问题也是关于我们的实现的。
0赞 Qiulang 11/8/2023
您的评论也证实了(或添加了我的问题),我的问题是“cookie vs token,为什么人们总是说使用 cookie 进行会话控制,好像 token 不能做会话控制?您的评论似乎将会话 ID 与令牌进行比较(因此确认了其他单词)。
0赞 CBroe 11/8/2023
你说你的令牌是“一个长加密字符串”——所以如果它实际上包含可解密的信息,这与单纯的会话 ID 有很大的区别。即使无法访问存储在服务器端的任何会话数据,也可以在任何上下文中从令牌本身中提取信息,只要该加密的密钥和算法是已知的。
0赞 Qiulang 11/8/2023
我添加了一个网络图片,使我们的流程更加清晰。令牌字符串本身不包含会话 ID。服务器比较令牌并获取用户的权限,以检查他是否可以访问资源。

答:

1赞 ichalov 11/10/2023 #1

立即想到的一个区别是 cookie 是标准化的(例如,在 RFC 6265 中)。因此,它们经过了充分的测试,可以在不同的供应商之间工作。使用自定义令牌的原因可能是需要使用 HTTP 以外的协议进行通信。

会话控制问题似乎是关于不断更改令牌的能力。您可以在每个 API 响应中返回一个新令牌,并且只允许它授权一些后续请求。Cookie 通常在很长一段时间内保持不变,您可以将它们复制到不同的 HTTP 客户端并从那里获得并行访问 - 这可能就是所谓的不受控制的会话。

评论

0赞 Qiulang 11/10/2023
是的,我找不到商定的会话控制定义。但是我曾想过,在用户登录期间,我们正在进行某种会话控制(直到他注销为止)。