来聊聊session与token的区别

写在文章开头

你好,我叫sharkchili,目前还是在一线奋斗的Java开发,经历过很多有意思的项目,也写过很多有意思的文章,是CSDN Java领域的博客专家,也是Java Guide的维护者之一,非常欢迎你关注我的公众号:写代码的SharkChili,这里面会有笔者精心挑选的并发、JVM、MySQL数据库专栏,也有笔者日常分享的硬核技术小文。

构建需要进行身份认证的系统时,一般我们会通过session 或者token作为认证的依据,所以本文针对这个问题来深入探讨一下两者的差异以便读者可以工具实际需要选择合适的认证机制,而本文的主要内容如下:

session和token的区别

什么是session

我们都知道web 应用都采用HTTP 协议进行通信,而HTTP 协议是一种无状态协议,而用户常常因为简单业务上的操作而需要不断请求web 系统的接口,为了让web 系统可以感知到当前请求的是否是同一个用户,于是就有session 机制。当用户第一次发起web 请求时,服务端会为其生成一个唯一ID缓存在服务器上(通常会存储到内存、数据库里),然后通过响应头的方式将这个sessionId 交给用户,让用户缓存到cookie中,后续的请求只需携带这个sessionId,服务器即可快速的完成用户的认证。

什么是token

token 也是用户用户认证,其工作原理相较于前者有些不同,在用户进行登录认证通过之后,服务器会针对当前用户信息使用一套固定的算法(如MD5 、SHA 等)生成一个唯一字符串返回给用户,一般情况下,这个字符串可以确保会话在单位时间内是有效的,用户在收到这个token 后就还是将token 缓存至cookie 中,后续进行通信时,用户只需将token信息传到服务端,而服务端进行校验时则需要通过算法进行解析校验才能判断是否有效。

两者的区别

可以看出session是典型的空间换时间,每次对用户完成认证之后都需要将会话信息缓存在服务器上,这就导致这种认证机制有以下两种缺点:

  1. 遇到服务器重启之后,用户又需要进行重新认证。
  2. 在分布式系统上很容易导致用户认证时候而又重新进行认证的尴尬情况。

而token相较于前者因为它一种带有数学性质的算法,所以及时在分布式部署的负载均衡环境,因为算法的唯一性,每一个节点都可以正确的完成认证,但美中不足的就是token的校验涉及复杂的解析和运算,很明显token认证是典型的时间换空间的思想。

小结

总的来说,session 适用于用户量较小的web 运用,通过缓存机制即可快速实现用户的时效认证机制,而token 更多适用于session无法使用的分布式系统以及小程序、移动应用等。

我是sharkchili ,CSDN Java 领域博客专家 ,开源项目---JavaGuide contributor ,我想写一些有意思的东西,希望对你有帮助,如果你想实时收到我写的硬核的文章也欢迎你关注我的公众号: 写代码的SharkChili ,同时我的公众号也有我精心整理的并发编程 、JVM 、MySQL数据库个人专栏导航。

参考资料

还分不清Session和Token?一文彻底弄明白! :mp.weixin.qq.com/s/-LAAFAqxR...

本文使用 markdown.com.cn 排版

相关推荐
前端小万12 小时前
想做个人副业别乱买服务器!我的 5 个月真实开销分享
前端·后端·github
小蒜学长12 小时前
基于 Spring Boot 的英语单词背诵系统的设计与实现(代码+数据库+LW)
java·数据库·spring boot·后端
用户693717500138412 小时前
我买的电视,我还不能研究它吗?
前端·后端·ai编程
利威尔xu13 小时前
RAG 检索面试十连问:召回率从 92% 掉到 61%,答案句被拦腰截断怎么排查
人工智能·后端·大模型·向量数据库·rag
老王IT13 小时前
Go开发环境搭建(window操作系统)
开发语言·后端·golang
萧瑟余晖13 小时前
Spring Data JDBC与R2DBC详解
java·后端·spring
花间相见14 小时前
【计算基础|MySQL18】Buffer Pool 与内存管理
后端·sql·mysql
花间相见15 小时前
【计算基础|Redis01】【上手】安装连接、配置与通用命令
数据库·后端·面试
我命由我1234515 小时前
6-3.Python 异常处理 - 异常处理进阶(else 块与 finally 块、异常传递、自定义异常)
开发语言·前端·数据库·后端·python·学习·java-ee
深入云栈16 小时前
Netty 4.2.x 源码深度解析 (二十一):Pipeline 事件传播 —— Inbound 与 Outbound 的双向流转
java·后端·架构