用了这么久,token和session的区别,你真的清楚了吗?

createh53个月前 (02-01)技术教程26

session和token都是用来保持会话,功能相同

一、session机制,原理

session是服务端存储的一个对象,主要用来存储所有访问过该服务端的客户端的用户信息(也可以存储其他信息),从而实现保持用户会话状态。但是服务器重启时,内存会被销毁,存储的用户信息也就消失了。

不同的用户访问服务端的时候会在session对象中存储键值对,“键”用来存储开启这个用户信息的“钥匙”,在登录成功后,“钥匙”通过cookie返回给客户端,客户端存储为sessionId记录在cookie中。当客户端再次访问时,会默认携带cookie中的sessionId来实现会话机制。

session是基于cookie的。

  • cookie的数据4k左右
  • cookie存储数据的格式:字符串key=value
  • cookie存储有效期:可以自行通过expires进行具体的日期设置,如果没设置,默认是关闭浏览器时失效。
  • cookie有效范围:当前域名下有效。所以session这种会话存储方式方式只适用于客户端代码和服务端代码运行在同一台服务器上(前后端项目协议、域名、端口号都一致,即在一个项目下)

session持久化

用于解决重启服务器后session就消失的问题。在数据库中存储session,而不是存储在内存中。通过包:express-mysql-session

其它

当客户端存储的cookie失效后,服务端的session不会立即销毁,会有一个延时,服务端会定期清理无效session,不会造成无效数据占用存储空间的问题。

二、token机制,原理

适用于项目级的前后端分离(前后端代码运行在不同的服务器下)

请求登录时,token和sessionId原理相同,是对key和key对应的用户信息进行加密后的加密字符,登录成功后,会在响应主体中将{token:'字符串'}返回给客户端。客户端通过cookie、sessionStorage、localStorage都可以进行存储。再次请求时不会默认携带,需要在请求拦截器位置给请求头中添加认证字段Authorization携带token信息,服务器端就可以通过token信息查找用户登录状态。

相关文章

推荐几个好用Redis图形化客户端工具

RedisPlushttps://gitee.com/MaxBill/RedisPlus RedisPlus是为Redis可视化管理开发的一款开源免费的桌面客户端软件,支持Windows 、Linux...

java-socket长连接demo体验(java tcp长连接)

作者:DavidDing 来源:https://zhuanlan.zhihu.com/p/56135195 一、前言最近公司在预研设备app端与服务端的交互方案,主要方案有:服务端和app端通过阿里i...

面试官:如何关闭一个 TCP 连接?(关闭tcp6)

今天聊一个比较轻松的问题:如何关闭一个 TCP 连接?可能大家第一反应是「杀掉进程」不就行了吗?是的,这个是最粗暴的方式,杀掉客户端进程和服务端进程影响的范围会有所不同:在客户端杀掉进程的话,就会发送...

解决QTcpSocket发送数据成功,但接收端接收不全的问

这里主要是这样的Qt写了一个服务端,在开发环境下,没出现任何问题,但在生产环境下,就出现问题了。使用Fiddler的简单抓了下包:发现Body只有27045,而请求里面确是这样的。这里就很有意思了。这...

我的世界1.8最好用的修改器下载(我的世界1.8最好用的修改器下载安装)

这次搞趣网小编为诸位我的世界1.8玩家带来我的世界1.8最好用的修改器下载,希望诸位我的世界1.8玩家喜欢这篇我的世界1.8最好用的修改器下载。TooManyItems是一款minecraft游戏内物...

基于springboot2.0跟layui构建的前后端分离后台管理系统源码分享

一个基于SpingBoot2.0轻量级的java快速开发框架。以Spring Framework为核心容器,Spring MVC为模型视图控制器,Mybatis Plus为数据访问层, Apache...