Cookie,Session 和 Token 究竟是怎么个关系?

以前,我一直搞不清楚 Cookie,Session 和 Token 之间的关系,看了知乎上的这篇文章才懂得了:网络应用中session和token本质是一样的吗,有什么区别?

为了避免用户频繁的登录,所以需要一种方式来记录用户登录信息。Cookie、Session 和 Token 就是为了解决这个问题,发展出来的三种解决方案。

Cookie

Cookie 是服务器创建的,通过在相应头中的 Set-Cookie 选项,发送到用户浏览器。浏览器会将接收到的 Cookie 保存在本地,并且会在下次向同一个服务器发送请求时,通过 Cookie 请求头携带上当前保存的 Cookie。

另外,Cookie 的过期时间、域、路径、有效期、适用站点都可以根据需要来指定。

Cookie 在被用于实现交互状态时,存在的问题有:

  1. 潜在的网络攻击,比如:被劫持、跨站请求伪造(CSRF:Cross-site request forgery)
  2. 网络负载高,每次都要发送很多额外的信息
  3. 数量和容量有限

Session

Session 机制是:服务器生成一个唯一的 SessionID 发送的客户端,客户端在之后请求资源时携带上 SessionID 信息,服务器和客户端就通过 SessionID 进行身份识别。同时,服务器负责存储客户端的状态信息,通常保存在内存(RAM)中,避免了重复的信息传输。

那客户端的 SessionID 信息是怎么存储呢?首选方式是存储在 Cookie 中,也可以通过 URL 重写的方式进行传输。

Session和Cookie的关系就像加班和加班费的关系,看似关系很密切,实际上没啥关系。

Session 存在的问题:

  1. 服务器的存储压力较大(用户信息通常是存储在 RAM 中的)
  2. 分布式系统的信息共享问题

Token

Token 是由服务生成并发送给客户端的令牌,令牌中记录了产生令牌时用的加密算法、客户信息、经过秘钥生成的 sign。客户端将接收到的令牌保存在本地,以后每次请求时都要携带上。服务器接收到 Token 时,解析关键信息,再经过相同的加密算法、客户信息,重新生成一次 sign,然后和客户端发送的 sign 进行对比,一致则认为是有效的,否则拒绝服务。

Token 机制可以避免服务器存储海量的用户登录信息,实现了通过 CPU 加解密的时间换取存储空间(Session 信息一般是存储在内存当中的)。

七牛云使用 Token 的实例

存储在七牛云上的私有资源,当用户想对指定的资源公开一段时间时是如何实现的呢?

在用户登录 Kodo Browser(七牛对象存储提供的图形化管理工具)时,需要提供 AccessKeyId 和 AccessKeySecret。当用户想公开一段时间私有资源时,通过以下步骤生成一个 URL 就可以了:

  1. 在资源的 URL 中拼接上 AccessKeyId,用来标记当前的用户;
  2. 在资源的 URL 中拼接上设置的公开时间;
  3. 通过约定的算法,使用 AccessKeySecret 对 AccessKeyId 和公开时间进行加密生成 sign,并拼接到 URL 上。

当七牛的服务器收到访问请求时,提取出 AccessKeyId 和公开时间,并通过 AccessKeyId 来获取对应的 AccessKeySecret,通过相同的算法计算 sign,如果计算的 sign 值和 URL 中的 sign 值相同,则提供资源信息。

这样就实现了客户在将私有信息设置为公开时,并不需要经过服务器,服务器更不会存储资源的公开信息。

注意:以上过程时凭记忆总结的,可能会有偏差。

总结

Cookie 侧重于客户端对信息的存储行为,Session 和 Token 侧重于服务端用于身份验证的行为。

猜你喜欢

转载自blog.csdn.net/fuyoufang1/article/details/128864497