Cookie、Session 和 Token 之间真正的区别是什么?为什么没人谈论这一点?
要理解 cookie、session 和 token 之间的区别,我们需要回顾一下基础知识。假设你想登录你的银行账户,你会看到一个登录界面,可以在上面输入用户名和密码,当你点击提交按钮时,你的用户名和密码就会发送到银行服务器。
然后服务器需要验证您的身份,因此银行会将您的凭据与数据库进行比对,如果一切正常,服务器将返回您的账户概览页面,同时在数据库中创建一个包含您登录事件的会话,并将会话 ID 以 cookie 的形式返回给您。换句话说,您用用户名和密码换取了这个包含会话 ID 的 cookie。您发送用户名和密码后,会收到一个包含会话 ID 的 cookie。服务器会将会话信息存储在数据库中,而您只能在存储在计算机文件系统中的 cookie 中获取会话 ID。会话 ID 是随机生成的,因此很难猜测。当您注销时,服务器端会删除该会话,同时也会指示您的浏览器删除包含会话 ID 的 cookie。
下次您登录并请求页面时,您的浏览器会自动发送一个包含 session_id 的 cookie,服务器会检查该 cookie 是否仍然有效。需要注意的是,下次登录时,您不再需要用户名和密码来验证您的身份。
把 cookie 想象成你的健身房会员卡,它存储着你的会员 ID 和其他一些信息。当你扫描 cookie 进入健身房时,它会检查你的会员资格是否仍然有效,并允许你进入。就像你的健身卡一样,包含 session_id 的 cookie 也只能在特定的网站上使用。例如,你不能用健身卡进入办公楼,同样的道理也适用于 cookie,你不能用它登录其他网站。
因此,只要您持续与服务器交互,银行服务器就会保持会话处于活动状态。如果您一段时间不活动,之后访问新页面,服务器会检测到这段不活动时间,并出于安全考虑,提示您重新输入用户名和密码。
上述方法称为基于 Cookie 的身份验证。
因此,这种方法使用服务器端的会话来处理身份验证。Cookie 只是用于传输会话 ID 的媒介,之所以使用它,是因为它很方便,浏览器每次请求都会发送一个 Cookie。会员卡也是如此,使用实体卡比每次都出示身份证更方便,但你也可以将卡加载到手机上,然后用手机登录。所以存储方式虽然改变了,但概念仍然相同。我的意思是,在这种情况下,银行将会话信息存储在服务器端,你无法查看其内容,但同时,它可以使用另一个 Cookie 在客户端(你的浏览器)存储其他信息,例如:你访问的最后一个页面、你偏好的字体大小或颜色,或其他不太敏感的信息。
为什么服务器不在 cookie 中存储大量信息?
但是,我们来谈谈为什么服务器不会在 cookie 中存储大量信息。这是因为 cookie 来自客户端,不可信,所以服务器更喜欢使用数据库,因为理想情况下,数据库中只包含有效信息。
另一种方法是将信息存储在客户端并对其进行签名。在这种情况下,任何持有签名的人都可以快速检查数据是否被篡改。实现此目的的一种方法是使用 JSON Web Tokens。因此,基于 cookie 的身份验证多年来一直运行良好,但至少在某些情况下,它正在逐渐过时。
假设你想在手机上安装一个应用程序,它可以帮助你管理财务,并使用你的银行账户信息来追踪你的支出。你不想把用户名和密码告诉这个与你的银行无关的应用程序。在这种情况下,你的银行会将你重定向到你的银行账户,在那里你输入用户名和密码,然后银行会问你:“嗨,约翰,你想让这个应用程序访问你的交易记录吗?” 如果你点击“是”,应用程序会收到一个令牌,该令牌授予你访问交易记录的权限。但是,该应用程序只能查看交易记录,它无法查看电汇信息或你通常登录银行账户时可以看到的其他详细信息。你可以把这个令牌比作一个随机生成的密码,就像你在酒店获得一个有效期为一天的Wi-Fi密码一样。我相信,当你使用Facebook、Google或Microsoft等第三方网站来获取你的用户信息时,你可能也遇到过类似的流程。
因此,在这种交易中,您无需交换用户名和密码。如果您之后想要撤销对银行账户的访问权限,可以通过使生成的令牌失效来轻松实现。在这种情况下,最常用的协议之一是 OpenID Connect 和 JON Web Tokens。
所以你可能想知道存储在 Cookie 中的令牌和会话 ID 有什么区别:
区别在于,令牌通常遵循标准,而会话则由服务器根据需要实现。
此外,令牌通常不需要在服务器上建立会话,但它们也可以建立会话。
对于 JWT 令牌,它不仅包含会话信息,还包含关于您作为用户的实际数据。
使用令牌时,务必注意,此时交互通常涉及多个参与方,而这些参与方之间可能互不信任。例如,您信任您的银行,并会将您的银行登录信息(用户名和密码)交给银行,但您可能并不信任您在 App Store 中找到的某个第三方应用程序。
另一个区别是,代币的有效期有限,过期后需要生成新的代币,技术术语称之为“刷新”。
令牌还可以授予对特定用户或实体所拥有的数据子集的访问权限,例如:您只授予了对您的交易的访问权限,但没有授予对其他信息的访问权限。
大多数情况下,令牌都是通过 HTTP 标头而不是 cookie 发送的,原因是现在很多交互都是在浏览器之外进行的,例如通过手机上的应用程序,在这种情况下使用 cookie 根本没有意义。
“Cookie 是以 HTTP 标头的形式发送的,但浏览器处理它们的方式与其他标头不同。”
结论
因此,基于会话/Cookie 和基于令牌的方法都很普遍,而且通常会并行使用。例如,在使用网站时采用基于会话/Cookie 的方法,而使用同一服务的应用程序时则优先选择基于令牌的方法。所以,了解这两种方法的工作原理至关重要。
希望这对大家有所帮助,现在你们能够区分 cookie、会话和令牌。
如果您喜欢我的作品,请通过以下方式关注我:
GitHub、
Twitter、
LinkedIn
你们的支持(关注我)给了我继续分享技能的勇气。谢谢!