参考了视频 Cookie、Session、Token究竟区别在哪?如何进行身份认证,保持用户登录状态?_哔哩哔哩_bilibili如果看完文章还是不清楚的可以去看一下视频。
首先介绍一下简单的概念:
Cookie
, Session
, 和 Token
都是用于Web应用程序中管理用户会话和状态的技术,但它们各自有不同的特性和使用场景。
首先我们需要思考一个场景:当你第一次使用一个网站,比如csdn,你使用时需要注册用户,就需要输入用户名和密码,但是下次我们再点开csdn网页,发现以及给我们自动登陆上了,不需要重复登陆,这是为什么嘞?
你肯定会觉得是不是网页记住了你的信息并保存,但是HTTP是无状态的,比如说你这次访问服务器,关闭网页,下次再访问服务器,其实服务器是没有意识到又你来访问的。
那不知道是你访问,应该如何保持登陆状态嘞,这里就有几种手段了,也就是我们要讲到的cookie和session和token,实现保持登陆状态的核心技术就是存储,设置让用户可以选择记住用户名和密码。
浏览器是如何实现记住用户名和密码的三种方式:
1.cookie :简单来说就是存储在浏览器的数据,作为一种小文本文件,由服务器发送到用户的浏览器,浏览器将其保存在用户的计算机上。每当用户与服务器进行交互时,浏览器会自动将相关的Cookie发送回服务器,从而允许服务器识别用户并提供个性化的内容或恢复之前的会话状态。
弊端:打开浏览器可以看见保存了哪些cookie。用户名和密码放cookie不安全,电脑被黑,在cookie里的重要信息就会泄露。
2.session:会话,浏览器访问服务器就是会话的开始,这里面包含session id,作为服务器端的会话管理机制,它将用户特定的信息保存在服务器上。每当用户访问应用时,服务器根据Session ID(通常存储在Cookie中)查找与该用户相关联的会话数据。依据的就是每次发送请求都会发送一个cookie,
使用session流程:
- 创建Session: 用户首次访问时,服务器创建一个新的Session,并生成一个Session ID。
- 存储Session数据: 服务器在内存或持久化存储中保存Session数据。同时将数据封装,创建一个变量session id,为无规律的字符
- 发送Session ID: 服务器通过Cookie或其他方式将Session ID发送给客户端。
- 读取Session数据: 后续请求中,服务器根据Session ID查找并加载Session数据。
3.token:Token是一种用于身份验证和授权的机制,尤其在无状态的RESTful API中常用。Token是一个包含用户信息的字符串,通常是加密的,可以是JWT(JSON Web Tokens)或其他格式。
和session很类似,只是这里的token存储在用户那边而已
使用token流程:
- 生成Token:用户登录时,服务器会生成一个包含用户信息的 Token,例如用户ID和权限信息,并对其进行加密和签名。
- 发送Token: 服务器将 Token 发送给客户端,客户端可能将其存储在 LocalStorage、SessionStorage 或者 Cookie 中。
- 使用 Token 进行请求: 在后续的 API 请求中,客户端需要在 HTTP 请求头部的
Authorization
字段中附带 Token。 - 验证Token:服务器接收到请求后,会检查
Authorization
头部中的 Token,验证其有效性和完整性,确认用户身份后提供相应的服务。
如果有人感兴趣下次,下次我写一下jwt的理解。
总结一下:
个人言论哈,有问题可以给我指出:
这三个核心目的是一样的,由于HTTP是无状态的,所以其实网页是没有能力直接的去保存当前是哪个用户登陆,返回给用户的,也就是我们常用的自动登陆过程,能实现该过程是因为三个处理,cookie,session和token,我对这三个实现过程的简单理解就是,用户登陆时,服务器向浏览器发送请求,为了让浏览器记住下次也是这个人请求, 就生成一个cookie,包含用户名和密码,在服务器请求网页时,浏览器就启动cookie,cookie是保存在浏览器中的,然后我认为session就是在cookie上的扩展,将cookie的用户名和密码进行简单封装以后变成session id,且将session保存到服务器,然后session id和cookie一起传送,将cookie里的用户名和密码变成session id,但是这样也会有一个问题就是session id过多,需要多台服务器,就很麻烦,各个服务器之间要互相传输数据,于是就出现了token,作为包含用户信息的字符串,通常是JWT格式,服务器将token发送给客户端,客户端 可能将其存储在 LocalStorage、SessionStorage 或者 Cookie 中,在后续的 API 请求中,客户端需要在 HTTP 请求头部的 Authorization
字段中附带 Token。
每种机制都有其适用场景和优缺点,选择使用哪一种取决于具体的应用需求、安全性考量和性能需求。例如,Cookie 和 Session 更适用于传统的 Web 应用,而 Token 尤其是 JWT 更适合微服务架构和跨域的 API 设计。
写到这里啦,有不同见解和需求的可以评论区我们交流一下。