提问人:Qiulang 提问时间:11/8/2023 最后编辑:Qiulang 更新时间:11/10/2023 访问量:63
关于Cookie身份验证与令牌身份验证的混淆,究竟有什么区别?
Confusion about Cookie Authentication vs Token Authentication, what is the difference exactly?
问:
我阅读了令牌身份验证与 Cookie 和会话与基于令牌的身份验证。
我还阅读了如何使用 HTTP Cookie、会话和令牌进行 Web 身份验证和授权?和 Cookie 与令牌:权威指南
但是,那里的所有答案以及这两篇文章中提出的所有观点都让我对 Cookie 身份验证与令牌身份验证(尤其是 JWT)之间的区别更加困惑,尤其是从身份验证过程的角度来看。毕竟,这两种方法都将从服务器返回一个加密的字符串,之后服务器将验证该字符串。
我有一个项目,它通过以下方式实现了“令牌身份验证”,
- 用户输入其登录凭据。服务器验证凭据 是正确的,并返回一个“令牌”,一个长加密的字符串。令牌具有过期时间。
- 此令牌存储在用户浏览器的本地存储中。服务器还将此令牌与用户的其他信息(主要是他的权限)一起存储。
- 对服务器的后续请求将此令牌包含在自定义请求标头字段中。
- 服务器首先验证令牌是否正确,然后验证权限信息,以查看他/她是否可以访问请求的资源。
- 用户注销后,令牌将从客户端和服务器端删除。
我知道与 Cookie 身份验证的明显区别在于 cookie 存储在浏览器的 cookie 中,并且 cookie 将具有在 MDN 中定义的 name/path/domain/httponly... 等属性。cookie 将由浏览器自动发送,而我们的客户端 js 代码需要在每个请求中添加令牌。
但除此之外有什么区别?我也感到非常困惑的是,人们总是说使用cookie进行会话控制。我看到人们可以互换使用基于会话的身份验证和基于 Cookie 的身份验证,就好像令牌身份验证不能进行会话控制(因此是无状态的)。
显然,我们的代码使用令牌来执行“会话控制”。如果请求不包含有效令牌或权限不足,则将被拒绝。当用户注销时,令牌将被删除,下次登录服务器时,服务器将为他提供一个新令牌。
我一直认为,在用户登录期间,我们正在进行某种会话控制(直到他注销)。
我的最后一个问题是(除了差异之外)我们的令牌身份验证及其“会话控制”是否存在任何潜在问题?(我怀疑这个项目是很久以前创建的,当时有移动客户端,当时从移动应用程序发送 cookie 并不容易,但我无法确认这一点。
我在这里附上一张网络请求图片,以使我的流程更清晰。在登录期间,有一个从服务器获取令牌的请求,之后的每个请求都将包含令牌标头。
答:
立即想到的一个区别是 cookie 是标准化的(例如,在 RFC 6265 中)。因此,它们经过了充分的测试,可以在不同的供应商之间工作。使用自定义令牌的原因可能是需要使用 HTTP 以外的协议进行通信。
会话控制问题似乎是关于不断更改令牌的能力。您可以在每个 API 响应中返回一个新令牌,并且只允许它授权一些后续请求。Cookie 通常在很长一段时间内保持不变,您可以将它们复制到不同的 HTTP 客户端并从那里获得并行访问 - 这可能就是所谓的不受控制的会话。
评论