简析Cookie、Session、Token


手打不易,如果转摘,请注明出处!

注明原文:https://zhangxiaofan.blog.csdn.net/article/details/133498756


文章目录

  • 简析Cookie、Session、Token
    • [什么是 Cookie ?](#什么是 Cookie ?)
    • [什么是 Session ?](#什么是 Session ?)
    • [Cookie 和 Session 到底是什么关系?](#Cookie 和 Session 到底是什么关系?)
    • [什么是 Token ?](#什么是 Token ?)
    • [Session VS Token ?](#Session VS Token ?)
    • 总结

简析Cookie、Session、Token

  1. cookie 存储在前端
    例如第一次请求后端,会创建一个 sessionId 返回给前端,那么前端就会把 sessionId:xxxx 保存到 cookie 中, 下次请求的时候,前端会携带这个数据发送到后端。
  2. cookie 无法跨域
  3. cookie 只支持存储字符串数据, 大部分浏览器都不能超过 4KB

例如某次访问CSDN中的cookie

json 复制代码
{
    Cookie: 
        JSESSIONID=5124fa26-9334-4c7d-9123-6141b14b9c92;
        uuid_tt_dd=10_20850520640-1656988062941-486962;
        UserName=qXXXX4;
        UserInfo=8d100c5XXX4dd7a3fbc5e97;
        UserToken=8d100c5XXX0f4dd7a3fbc5e97;
        UserNick=Mr.XXX.;
        ...
}

什么是 Session ?

  1. session 存储在后端
    session 用于记录前后端会话信息,本身是基于 cookie 实现的,session 存储在后端(例如:redis),sessionId 则存储在前端的 cookie 中。因此 session 相对来说更安全。
    简单的来说:sessionID 是连接 Cookie 和 Session 的一道桥梁
    注意:这并不是说它是唯一的桥梁,我们也可以在 sessionId 拼接在请求 url 的 parameter 中。
  2. session 能存储任意Object对象,大小理论上不限制,只要内存够。

一般session存哪些信息?

例如 org.apache.shiro.session.mgt.SimpleSession 就存储了以下信息:

java 复制代码
private transient Serializable id;
private transient Date startTimestamp;
private transient Date stopTimestamp;
private transient Date lastAccessTime;
private transient long timeout;
private transient boolean expired;
private transient String host;
private transient Map<Object, Object> attributes;

包括:id、时间戳、过期时间、host、各种属性 attributes Map等等。

网上一大把的文章都在对比 cookie 和 session。

严格来说, cookie 是一种存储方式, session 是会话记录。它们不应该看成一个维度的概念

相同点就是它们都可以用来存储用户信息。

cookie 安全性、存储量有一定限制,但不会占用服务端资源。

session 安全性高、存储信息大,认证会话信息一般都存放在 session。

cookies 只是一种可以用来实现 session 的方式,但并不是唯一,理论上只要 sessionId 可以通过其他安全方式传输到服务端就行。

我也是比较 反对直接拿 cookie 和 session 做对比的 。

因此笔者认为,如果非要加一层关系,那么可以看成 协作互补

什么是 Token ?

说到 token ,这里必须说一下 token 可以简单看成 2 大类型:

一种是本身不携带信息 的token(传统token);

一种是本身就携带用户或认证信息 的 token(例如JWT);
sessionId 就可以看成一个传统的 token

token 就是一个令牌,前端请求发送到服务端,验证成功后,后端会生成一个 token 给前端,前端下次请求(有效期内)只需要带着这个 token 就可以访问后端API。
对于传统的 Token 来讲 ,服务端拿到 token 后需要去查数据库(Mysql、Redis等)校验是否过期或者是否有效
对于JWT这种类型的 Token 来讲,服务端本身是不存储信息的,直接通过解密和验证JWT即可。

Session VS Token ?

很多人直接把这两者进行比较,这样容易受误导。因为 Token 是有不同的实现方式,有的携带认证信息,有的不携带认证信息,那么在比较的时候,就要区分开来。

  1. session 是把会话信息到了服务端, 让本身无状态的 HTTP 变得有状态, 而 Token 是为了让服务端无状态.
  2. session 存储用户信息到服务端后,返回 sessionId 给前端,用于 sessionId 的随机性,所以可以看成 session 存储是安全的。 传统的 token 也需要存储信息到服务端,sessionId 就可以看成一个传统的 token 。而 JWT这类Token 是本身携带信息的 token,无需存储到后端服务器。
  3. session 可以看成 空间换时间, JWT这类Token 可以看成 时间换空间,传统的 token 实际上也占用了空间。
  4. token 实现跨域更方便,因为本身就是让服务端无状态

总结

  1. Cookie 和 Session 不要直接拿来对比, Cookie 是一种前端存储方式 ,Session 是存在服务端的会话记录 。详情看:[Cookie 和 Session 到底是什么关系?](#Cookie 和 Session 到底是什么关系?)
  2. Session 与 Token 做比较的时候,也要区分是 传统Token 还是 JWT之类的token
相关推荐
Crossoads17 分钟前
【汇编语言】端口 —— 「从端口到时间:一文了解CMOS RAM与汇编指令的交汇」
android·java·汇编·深度学习·网络协议·机器学习·汇编语言
老马啸西风18 分钟前
NLP 中文拼写检测纠正论文-02-2019-SOTA FASPell Chinese Spell Checke github 源码介绍
java
向宇it19 分钟前
【从零开始入门unity游戏开发之——C#篇26】C#面向对象动态多态——接口(Interface)、接口里氏替换原则、密封方法(`sealed` )
java·开发语言·unity·c#·游戏引擎·里氏替换原则
@菜鸟进阶记@22 分钟前
java根据Word模板实现动态填充导出
java·开发语言
卖芒果的潇洒农民24 分钟前
Lecture 6 Isolation & System Call Entry
java·开发语言
Amarantine、沐风倩✨1 小时前
设计一个监控摄像头物联网IOT(webRTC、音视频、文件存储)
java·物联网·音视频·webrtc·html5·视频编解码·七牛云存储
路在脚下@2 小时前
spring boot的配置文件属性注入到类的静态属性
java·spring boot·sql
啦啦右一2 小时前
Spring Boot | (一)Spring开发环境构建
spring boot·后端·spring
森屿Serien2 小时前
Spring Boot常用注解
java·spring boot·后端
苹果醋34 小时前
React源码02 - 基础知识 React API 一览
java·运维·spring boot·mysql·nginx