身份验证:Cookie 与 Token
身份验证是一个交换过程,用户提供凭证(用户名、电子邮件、密码等)作为身份信息。这些身份信息应该包含在 HTTP 请求中,用于检查用户是否有权查看内容或调用某些操作。在本文中,我将简要介绍在 Cookie 和 token 中添加身份数据的区别。
曲奇饼
Web Cookie 是一小段数据,默认情况下包含在浏览器的 HTTP 请求中。浏览器可以存储它并返回给服务器,以表明该请求来自同一个浏览器,并使用相同的身份信息来确保用户的身份得到验证。
HTTP 是一种无状态协议,Cookie 有助于记住重要信息。不久前,在没有存储管理 API 的情况下,Cookie 被用来保存所有客户端状态。由于每次浏览器请求都会发送 Cookie,这可能会对性能造成影响,尤其是在使用较弱的移动网络时。
Cookie 是任何请求标头中的一个属性。服务器可以选择在其中放置一条唯一信息,用于向特定服务器标识用户。例如,用户登录网站后,其凭证会被发送到服务器,服务器会将唯一信息(例如 ID12345)添加到 Cookie 中,并返回给浏览器。下次用户访问同一域名(例如www.example.com)时,浏览器会向服务器发送一个包含唯一标识符 ID12345 的 Cookie 请求。这将告知服务器该请求来自受信任的浏览器,服务器无需提供其他凭证。
每个域名的 Cookie 都是独一无二的。这意味着 google.com 和 facebook.com 的 Cookie 会有所不同。因此,如果您访问 facebook.com,您的浏览器会发送一个包含 Cookie 的请求,该 Cookie 仅与 Facebook 域名关联,并且无法访问 Google 的 Cookie。这是默认行为,因此劫持 Cookie 会更加困难。
代币
与 Cookie 相对的是令牌的概念。当 Cookie 开始变得不再实用时,令牌就被引入作为替代品。
与 Cookie 的区别之一是手动实现。要使用 token(一组字符和数字),我们必须在每次发出请求时专门将它们添加到 header 中。因此,每次设置 token 时您都必须手动操作,而 Cookie 会自动为您添加。
令牌的优势在于,我们可以将它们发送到任何我们想要的域名。例如,如果您在 example.com 域名上,并且想要将经过身份验证的请求发送到一个完全不同的、不相关的域名,则必须使用令牌。在发送请求之前,在标头中添加一个唯一的标识令牌,这样您就可以在该域名上进行身份验证。
如果我们构建分布式系统,这将非常方便,其中服务器托管在不同的域上,但我们希望同一个用户在所有域上都进行身份验证。
总结
存储经过身份验证的信息很大程度上取决于您的需求。虽然 Cookie 在会话管理(登录、购物车)、个性化设置(偏好设置、主题)甚至追踪方面都表现出色,并且会自动添加到请求中,但所有这些都只适用于单个域名级别。
另一方面,当需要通过跨域请求验证用户身份时,令牌非常有用,但需要为每个请求手动实现。
文章来源:https://dev.to/spukas/authentication-cookies-vs-tokens-13f