仅需 5 分钟,彻底理解 cookie、session、token!

仅需 5 分钟,彻底理解 cookie、session、token!
最新回答
晚安旧恋人

2022-06-03 09:43:28

Cookie、Session、Token 本质是Web应用中用于身份验证和会话管理的技术,分别通过客户端存储、悔游歼服务端存储、加密令牌三种方式实现用户状态跟踪,各有其独特的发展背景、实现原理和适用场景。以下是对三者的详细解释:

Cookie
  • 定义与功能:Cookie是浏览器实现的一种数据存储功能,指浏览器里能永久存储的一种数据。服务器生成后发送给浏览器,浏览器以键值对(KV)形式将其保存在本地文本文件中,下次请求同一网站时自动携带该Cookie发送给服务器,以此实现用户状态的简单跟踪。
  • 特点

    存储位置:存在于客户端,浏览器对其有数量、大小等限制,每个域的Cookie数量有限,以保障安全并避免占据过多磁盘空间。

    安全性:浏览器加入限制确保其不被恶意使用,但因数据存储在客户端,仍存在一定安全风险,如被窃取或篡改。

    应用场景:适用于存储少量、非敏感信息,如用户偏好设置、浏览历史等,常用于自动登录、记录用户行为等场景。

Session
  • 定义与功能:Session即会话,服务器为区分不同客户端,给每个客户端分配不同“身份标识”,客户端每次请求携带该标识,服务器据此识别请求来源。对于浏览器客户端,默认采用Cookie方式保存此标识。服务器将用户信息临时保存在服务器上,用户离开网站后Session销毁。
  • 特点

    存储位置:用户信息存储在服务端,相对Cookie更安全,但会占用服务器内存资源。

    可扩展性问题:若Web服务器做负载均衡,下一个请求可能发到另一台服务器,导致Session丢失,需采用Session sticky(让请求一直粘连在某台服务器上)、Session复制(在服务器间同步Session数据)或集中存储(如使用Memcached集中存储Session,但存在单点失败风险)等方式解决,但都增加了系统复杂性和开销。

    应用场景:适用于对安全性要求较高、需要存储较多用户信息的场景,如在线购物网站的购物车信息、用户登录状态等。

Token
  • 定义与功能:Token是一种基于令牌的身份验证方式,服务器在验证用户身份成功后,生成包含用户信息的令牌(Token),并对数据进行签名(如使用HMAC - SHA256算法和只有服务器知道的密钥),将签名和数据一碧冲起作为Token返回给客户端。客户端后续请求时在HTTP头部携带该Token,服务器收到后用相同算法和密钥重新计算签名,与Token中的签名对比验证其合法性,若相同则认为用户已磨笑登录并获取用户信息。
  • 特点

    无状态、可扩展:服务器不存储用户信息,仅负责生成和验证Token,减轻了服务器存储负担,使服务器集群可轻松水平扩展,用户访问量增大时直接加机器即可。

    安全性

    防止伪造:通过签名机制确保Token无法被伪造,只有服务器能生成有效签名。

    防止CSRF攻击:请求中发送Token而非Cookie,可有效防止跨站请求伪造攻击。

    时效性与撤回:Token有时效性,一段时间后需用户重新验证;还可通过Token撤销操作使特定Token或一组相同认证的Token无效。

    多平台跨域:支持移动设备,可跨程序调用,只要用户有有效Token,数据和资源可在任何域上被请求,解决了CORS(跨域资源共享)问题。

    应用场景:适用于多用户、分布式系统、移动应用等场景,如大多数使用Web API的互联网公司(如Facebook、Twitter、Google+、GitHub等)都采用基于Token的身份验证。

三者对比总结
  • Cookie:简单易用,但存储在客户端,安全性较低,适用于存储少量非敏感信息。
  • Session:存储在服务端,安全性较高,但存在可扩展性问题,适用于对安全性要求较高、需存储较多用户信息的场景。
  • Token:无状态、可扩展、安全性高,支持多平台跨域,适用于多用户、分布式系统、移动应用等场景。