自学内容网 自学内容网

一文读懂:Session、Cookie与Token

我是小白刚刚接触JWT,看了b站一些相关视频、查了中国知网和csdn其他人的文章之后,总结出了这篇文章。写文章的初心是为了检验自己是否透彻了解了知识点以及之后复习。如果标题党了,斯米马赛请原谅!!!欢迎大家批评指导!

引言

由于HTTP协议本身是无状态的,当服务器对用户请求进行响应后,便会断开与客户端的连接。当用户通过相同的客户端再次访问服务器时,服务器无法自动识别用户的身份,也无法确认当前请求是否源自先前的客户端。
随着交互式Web应用的快速发展,如购物网站等需要用户登录的应用场景日益增多,这就要求实现会话管理,以便记录并追踪用户的登录状态。因此,为了解决这一问题,cookie、session以及JWT(JSON Web Token)等身份认证工具应运而生。

Cookie概述

在Web应用中,Cookie是HTTP协议制定的一种会话跟踪技术,它是一个非常具体的东西,指的就是浏览器里面能永久存储的一种数据,仅仅是浏览器实现的一种数据存储功能。

Cookie是一种运输信息的工具,在客户端和服务端之间往返运输信息的“小包裹”

Cookie的工作原理

Cookie的工作原理图

  1. 设置 Cookie ,服务器通过 HTTP 响应头向浏览器发送一个或多个 Cookie。Cookie 包含名称、值、过期时间、路径和域等信息。例如:“Set-Cookie: username=john; Expires=具体时间; Path=/; Domain=example.com”。
  2. 存储 Cookie
    浏览器接收 Cookie 后,将其存储在本地文件或内存中。浏览器会根据 Cookie 的域、路径和过期时间等信息,确定在后续访问中哪些 Cookie 应发送给服务器。
  3. 发送 Cookie
    当再次访问同一个网站时,浏览器在 HTTP 请求头中自动包含该网站设置的 Cookie。例如:“Cookie: username=john”。服务器可据此获取用户信息。
  4. 修改和删除 Cookie
    修改:服务器发送新的 Set-Cookie 响应头来覆盖旧的 Cookie。
    删除:通过设置 Cookie 的过期时间为过去的时间来实现。例如:“Set-Cookie: username=; Expires=很早以前的时间; Path=/; Domain=example.com”。

Session概述

session翻译过来就是会话,它的主要作用是在用户与服务器交互的过程中,保持用户的状态信息。

例如,在用户登录一个网站后,服务器可以使用 Session 来记录用户的登录状态,以便在用户浏览不同页面时,服务器能够识别出该用户已经登录,无需再次输入用户名和密码。

Session的工作原理

session的工作原理图

  1. 创建 Session:用户首次访问特定页面(如“/setSession.jsp”)时,因未携带“jsessionid”,服务器会创建新的 Session,作为该用户的独立存储区域,可保存特定信息,如放入“name”,便于后续识别和使用相关数据。
  2. Session ID 传递与存储:服务器创建 Session 时生成唯一“jsessionid”,浏览器接收响应后将其存于 cookie。后续用户访问其他页面,浏览器会自动在请求中携带此“jsessionid”。
  3. 识别与获取 Session 数据:用户访问“/getSession.jsp”等页面时,浏览器在请求中带上 cookie 中的“jsessionid”。服务器接收请求后,将其与服务器端所有 Session 比较,找到对应 Session 后可取出特定数据(如“name”),实现用户状态识别和数据获取,提供个性化服务。

为什么session比Cookie更安全?

既然有Cookie了,为什么还要引入session?Cookie的缺陷在哪?session解决了Cookie的什么问题?
可以参考这篇:
Cookie对象的缺陷与应对策略

  1. 存储位置不同:session 保存在服务器端,信息不容易被窃取或篡改;cookie 保存在客户端,相对容易被攻击。
  2. 加密措施:session 使用加密措施保护传输数据,cookie 没有此保护。
  3. 过期时间:session 数据可设置过期时间,过期后即使被窃取也无法使用;cookie 过期时间可被修改,易被滥用。
  4. HTTPOnly 属性:session 可设置 HTTPOnly 属性禁止客户端脚本直接访问,避免客户端脚本攻击。综上所述,session 比 cookie 更安全。

这里的安全性问题也可以参考一下csdn @Rongwenbin 博主的文章:
老生常谈session、cookie的区别、安全性

Token概述

Token是服务端根据用户信息生成的独一无二的令牌。用户第一次登录时,服务端生成令牌,由客户端保存。当客户端再次访问服务器时,只需要带上令牌,无需用户名和密码。

基于Token的工作原理

token工作原理
核心内容如下:

一、前端操作
用户在前端输入用户名和密码。

二、服务器端生成 Token
服务器端(如 MySQL 校验成功后)返回一个 Token 给前端。

三、请求 API 携带 Token
前端在发送 HTTP 请求 API 时携带 Token.

四、服务器端校验 Token
服务器端采用过滤器对 Token 进行校验,若校验通过则返回请求数据,若校验不通过则返回错误码。

为什么要引入Token,session存在的问题是什么?

session存在的问题

1.内存开销 session是基于服务器进行验证的,存储在服务端。每次认证用户要发起请求时,服务端就要存储信息,当越来越多的请求发起,内存开销会不断增加。
2. 可扩展性 如果用户量少的话,一台服务器不存在扩展性问题,但是如果用户很多,使用服务器集群,也就是很多台服务器,那么在负载均衡的时候,不能保证每一次都发到同一台机器上,这样就没法验证身份,用户又会返回登录界面,重新登录。
3.跨域资源共享(CORS):当需要让数据跨多台移动设备使用时,跨域资源的共享会是一个让人头疼的问题。在使用 Ajax 抓取另一个域的资源,就可能会出现禁止请求的情况。
4.跨站请求伪造(CSRF):用户在访问银行网站时,很容易受到跨站请求伪造的攻击,并且容易被利用访问其他的网站。在这些问题中,可扩展性是最突出的,因此有必要去寻求一种更行之有效的方法。

Token的优点

无状态,可扩展: Token是无状态的,也就是不在服务端存储。这样的好处就是可以根据需求增加机器,无需考虑用户是否登录。
安全性 :请求中发送 token 而不再是发送 cookie 能够防止跨站请求伪造(CSRF)。即使在客户端使用 cookie 存储 token,cookie 也仅是一个存储机制而不是用于认证。不将信息存储在 Session 中,让我们少了对 session 操作。
多平台跨域:再来谈论一下跨域资源共享(CORS):对应用程序和服务进行扩展的时候,需要介入各种设备和应用程序。只要用户有一个通过了验证的 token,数据和资源就能够在任何域上被请求到。

参考文献:
[1]详细了解Cookie Session Token 2019(22)
[2]基于Cookie的会话跟踪技术及应用 2021(10)


原文地址:https://blog.csdn.net/t1750982356/article/details/142989320

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!