登录鉴权:cookie、session、sessionId和token

1.为什么要使用cookie和session?

cookie和session是一种追踪客户端与服务器端通信的一种方式。

我们知道http链接是无状态链接,每次客户端访问服务端,服务端都不会知道访问者是谁,这样的好处就是http设计简单,缺点也显而易见:每次关闭浏览器后又要重新登录

生成的记录如何返回给客户,客户下次访问又如何传递到服务器中?

这就是利用了cookie。cookie是一段存储在浏览器中的文本,它可以保存用户的信息,服务端通过设置返回头的set-cookie字段就能返回给浏览器并保存cookie,浏览器又自动设置请求头的cookie字段将cookie传递给服务器。

既然cookie就能保存用户的信息,那session又是干什么用的?

cookie是保存在浏览器中的,服务器中没有保存,如果我们在浏览器中伪造一个cookie然后传递给服务器,服务器怎么知道cookie是真是假,所以在服务端中也要有一种机制要记录会话信息。

当用户第一次访问服务器时,在服务器中生成记录并保存在session中,然后将这个记录通过cookie返回给浏览器,浏览器下次访问时带上cookie,服务器再通过session验证传过来的cookie是否正确。另外cookie是存储在浏览器端的,存储的登录信息不够安全任何人都能访问,而存储在服务器端更安全。

1.1cookie和session的区别

①数据库存放位:Cookie 数据存放在客户端(通常是浏览器的缓存)上,Session 数据则放在服务器上。

②安全性:Cookie 不够安全,容易被第三方攻击,如跨站脚本攻击(XSS)。Session 通常被认为是更安全的选项,因为它存储在服务器端,不容易被直接访问或篡改。

③数据存储大小:Cookie 的限制通常较小,单个Cookie的大小不超过4KB,且大多数浏览器限制了一个站点最多保存20个Cookie。Session 可以存储较大的数据量,没有明显的文件大小限制。

④服务器性能:Cookie 对于服务器性能的影响较小,但如果访问量大,也会影响服务器响应速度。Session 会保存在服务器上,随着访问量的增加可能会消耗较多服务器资源。

⑤数据存储方式:Cookie 是键值对的集合,通常用于存储简单数据,如用户名和密码。Session 可以存储任意类型的数据,包括复杂结构化数据。

⑥生命周期:Cookie 可以有特定的过期时间,一旦设定,即使在浏览器关闭的情况下也不会丢失。Session 一般具有较短的生命周期,通常在用户关闭浏览器后就失效。

2.sessionId是什么?

上面所说的用户第一次访问会产生一个记录,这个记录就是这次会话的sessionId,sessionId又通过cookie的形式传递给浏览器。

用户使用账号密码登录,服务端验证账号密码是否正确,若正确生成sessionId并以cookie的形式返回给前台,浏览器保存cookie,并在下次访问自动带上cookie,服务器在session中匹配前台传过来的cookie,有则不用再登录,否则提示未登录。

3.token是什么呢?

因为session用户访问量过多时比较占内容,用户量过大,就会产生大量的sessionid,sessionid是存储在服务端的,当用户很多时会导致服务器压力很大,另外当服务器有多台时还有考虑sessionid在这些服务器之间共享。于是就有另一种解决方案:token。

token是服务端生成的一串字符串,作为客户端进行请求的一个标识,当用户第一次登录后,服务器生成一个 token 并将此 token 返回给客户端,以后客户端只需带上这个 token 前来请求数据即可,无需再次带上用户名和密码。

3.1使用token作为登录验证的方法有以下几个步骤:

①客户端发起登录请求:客户端首先输入用户名和密码并向服务器端发起验证请求。

②服务器端验证身份:服务器端接收到请求后,会根据提供的用户名和密码进行验证。

③服务器生成Token:验证成功后,服务器端会生成一个Token并返回给客户端。

④客户端保存Token:客户端会将服务器返回的Token存储起来,这通常是在本地存储如Cookie或SessionStorage中。

⑤客户端后续请求携带Token:在之后的任何时候,客户端在向服务器发送请求时,会在请求头中包含这个Token。

⑥服务器验证Token:服务器在接收请求后,会检查请求头中的Token是否有效。

这种验证方式的优点包括:

  • 安全性提升:Token的设计使得其几乎不可能被盗用,因为即使泄露,没有正确的权限也无法使用。
  • 减轻服务器压力:不需要频繁地查询数据库,减少了服务器的工作量。
  • 易于扩展:Token的使用不依赖于特定的服务器配置,因此在不同的服务器之间也可以共享。