Session、Cookie和Token

196 阅读4分钟

前言

今天,我们就来梳理一下 session、cookie、token 这三者之间的关系!帮助我们提升开发效率!

为什么会有Session、Cookie、Token呢?

我们都知道,HTTP 协议是无状态的。所谓无状态,指的是客户端每次要和服务端进行通信时,都必须重新建立连接。也就是说,每进行一次请求,客户端和服务端就连接一次,而且下一次请求与上一次请求毫无关联。 这种无状态的特性就会引发一个问题:如何辨别两次请求是否来自同一个人呢?例如,用户在页面 A 发起获取个人信息的请求,之后又在另一个页面B发起相同的获取个人信息请求,我们要如何确定这两个请求是由同一个用户发出的呢? 为了解决这个问题,我们急需一种方法来识别发起请求的客户端究竟是谁。就在这时,cookie、token 和 session 应运而生,它们能够解决客户端标识的问题,进一步说,还能解决权限相关的问题。 它们就像是给每个客户端或者说每个登录用户发放了一张专属的身份证,通过这张 “身份证”,我们就能确定发出请求的到底是谁。 cookie、token 和 session 在复杂的业务场景下,各司其职又紧密协作,解决客户端标识与权限难题,提升用户体验。

一、什么是Cookie?

cookie 是保存在客户端或者说浏览器中的一小块数据,大小限制大致在 4KB 左右,在以前很多开发人员通常用 cookie 来存储各种数据,目前随着更多浏览器存储方案的出现,cookie 存储数据这种方式逐渐被取代,使用较少,主要原因有如下:

  • cookie 有存储大小限制,4KB 左右。
  • 浏览器每次请求会携带 cookie 在请求头中。
  • 字符编码为 Unicode,不支持直接存储中文。
  • 数据可以被轻易查看。

cookie 主要有以下特点: cookie 存储在客户端 cookie 不可跨域,但是在如果设置了 domain,那么它们是可以在一级域名和二级域名之间共享的。

二、什么是Session

Session(会话)是一种用于跟踪用户状态的机制。它允许服务器在一段时间内记住用户相关的信息,使得在用户与应用程序进行交互的整个过程中能够维护连续性。例如,当你登录一个网上购物网站后,网站能够在你浏览不同页面、添加商品到购物车等操作过程中记住你是已经登录的用户身份,这就是通过 Session 实现的。 Session的应用常见远远高于Cookie 前面两节我们介绍了 cookie 和 session,它们两者之间主要是通过 sessionId 关联起来的,所以我们总结出:sessionId 是 cookie 和 session 之间的桥梁。我们日常的系统中如果在鉴权方面如果使用的是 cookie 方式,那么大部分的原理就和我们前面说的一样。

同时session 是基于 cookie 实现的,它们两个主要有以下特点:

  • session 比 cookie 更加安全,因为它是存在服务端的,cookie 是存在客户端的。
  • cookie只支持存储字符串数据,session 可以存储任意数据。
  • cookie 的有效期可以设置较长时间,session 有效期都比较短。
  • session 存储空间很大,cookie 有限制。

系统想要实现鉴权,可以单独使用 cookie,也可以单独使用 session,但是建议结合两者使用。

三、什么是Token

Token即令牌,令牌顾名思义就是确认身份的意思,服务端可以通过令牌来确认身份。 token 其实就是一串字符串而已,只不过它是被加密后的字符串,它通常使用 uid(用户唯一标识)、时间戳、签名以及一些其它参数加密而成。我们将 token 进行解密就可以拿到诸如 uid 这类的信息,然后通过 uid 来进行接下来的鉴权操作。 Token可以防范CSRF攻击!

四、总结

在实际系统鉴权中,可单独使用 Cookie 或 Session,但结合两者使用能发挥各自优势并弥补不足,同时 Token 也为不同场景下的身份验证提供了有力支持,开发者应根据具体业务需求和安全要求合理选择和运用这些技术,以构建高效、安全且用户体验良好的网络应用。

image.png