我是小白刚刚接触JWT,看了b站一些相关视频、查了中国知网和csdn其他人的文章之后,总结出了这篇文章。写文章的初心是为了检验自己是否透彻了解了知识点以及之后复习。如果标题党了,斯米马赛请原谅!!!欢迎大家批评指导!
目录
- 引言
- Cookie概述
- Cookie的工作原理
- Session概述
- Session的工作原理
- 为什么session比Cookie更安全?
- Token概述
- 基于Token的工作原理
- 为什么要引入Token,session存在的问题是什么?
- session存在的问题
- Token的优点
引言
由于HTTP协议本身是无状态的,当服务器对用户请求进行响应后,便会断开与客户端的连接。当用户通过相同的客户端再次访问服务器时,服务器无法自动识别用户的身份,也无法确认当前请求是否源自先前的客户端。
随着交互式Web应用的快速发展,如购物网站等需要用户登录的应用场景日益增多,这就要求实现会话管理,以便记录并追踪用户的登录状态。因此,为了解决这一问题,cookie、session以及JWT(JSON Web Token)等身份认证工具应运而生。
Cookie概述
在Web应用中,Cookie是HTTP协议制定的一种会话跟踪技术,它是一个非常具体的东西,指的就是浏览器里面能永久存储的一种数据,仅仅是浏览器实现的一种数据存储功能。
Cookie是一种运输信息的工具,在客户端和服务端之间往返运输信息的“小包裹”
Cookie的工作原理
- 设置 Cookie ,服务器通过 HTTP 响应头向浏览器发送一个或多个 Cookie。Cookie 包含名称、值、过期时间、路径和域等信息。例如:“Set-Cookie: username=john; Expires=具体时间; Path=/; Domain=example.com”。
- 存储 Cookie
浏览器接收 Cookie 后,将其存储在本地文件或内存中。浏览器会根据 Cookie 的域、路径和过期时间等信息,确定在后续访问中哪些 Cookie 应发送给服务器。 - 发送 Cookie
当再次访问同一个网站时,浏览器在 HTTP 请求头中自动包含该网站设置的 Cookie。例如:“Cookie: username=john”。服务器可据此获取用户信息。 - 修改和删除 Cookie
修改:服务器发送新的 Set-Cookie 响应头来覆盖旧的 Cookie。
删除:通过设置 Cookie 的过期时间为过去的时间来实现。例如:“Set-Cookie: username=; Expires=很早以前的时间; Path=/; Domain=example.com”。
Session概述
session翻译过来就是会话,它的主要作用是在用户与服务器交互的过程中,保持用户的状态信息。
例如,在用户登录一个网站后,服务器可以使用 Session 来记录用户的登录状态,以便在用户浏览不同页面时,服务器能够识别出该用户已经登录,无需再次输入用户名和密码。
Session的工作原理
- 创建 Session:用户首次访问特定页面(如“/setSession.jsp”)时,因未携带“jsessionid”,服务器会创建新的 Session,作为该用户的独立存储区域,可保存特定信息,如放入“name”,便于后续识别和使用相关数据。
- Session ID 传递与存储:服务器创建 Session 时生成唯一“jsessionid”,浏览器接收响应后将其存于 cookie。后续用户访问其他页面,浏览器会自动在请求中携带此“jsessionid”。
- 识别与获取 Session 数据:用户访问“/getSession.jsp”等页面时,浏览器在请求中带上 cookie 中的“jsessionid”。服务器接收请求后,将其与服务器端所有 Session 比较,找到对应 Session 后可取出特定数据(如“name”),实现用户状态识别和数据获取,提供个性化服务。
为什么session比Cookie更安全?
既然有Cookie了,为什么还要引入session?Cookie的缺陷在哪?session解决了Cookie的什么问题?
可以参考这篇:
Cookie对象的缺陷与应对策略
- 存储位置不同:session 保存在服务器端,信息不容易被窃取或篡改;cookie 保存在客户端,相对容易被攻击。
- 加密措施:session 使用加密措施保护传输数据,cookie 没有此保护。
- 过期时间:session 数据可设置过期时间,过期后即使被窃取也无法使用;cookie 过期时间可被修改,易被滥用。
- HTTPOnly 属性:session 可设置 HTTPOnly 属性禁止客户端脚本直接访问,避免客户端脚本攻击。综上所述,session 比 cookie 更安全。
这里的安全性问题也可以参考一下csdn @Rongwenbin 博主的文章:
老生常谈session、cookie的区别、安全性
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)