首页 > 其他分享 >Cookie、Session及Token详解

Cookie、Session及Token详解

时间:2023-08-23 18:46:45浏览次数:40  
标签:请求 用户 Session token server Token session Cookie

Cookie

Cookie,有时也用其复数形式 Cookies,类型为“小型文本文件”,是某些网站为了辨别用户身份,进行 Session 跟踪而储存在用户本地终端上的数据(通常经过加密),由用户客户端计算机暂时或永久保存的信息

以加入购物车为例,每次浏览器请求后 server 都会将本次商品 id 存储在 Cookie 中返回给客户端,客户端会将 Cookie 保存在本地,下一次再将上次保存在本地的 Cookie 传给 server 就行了,这样每个 Cookie 都保存着用户的商品 id,购买记录也就不会丢失了

随着购物车内的商品越来越多,每次请求的 Cookie 也越来越大,这对每个请求来说是一个很大的负担

Session

由于用户的购物车信息都会保存在 Server 中,所以在 Cookie 里只要保存能识别用户身份的信息,知道是谁发起了加入购物车操作即可,这样每次请求后只要在 Cookie 里带上用户的身份信息,请求体里也只要带上本次加入购物车的商品 id,大大减少了 Cookie 的体积大小,我们把这种能识别哪个请求由哪个用户发起的机制称为 Session(会话机制),生成的能识别用户身份信息的字符串称为 sessionid,它的工作机制如下

  1. 首先用户登录,server 会为用户生成一个 session,为其分配唯一的 sessionid,这个 sessionid 是与某个客户端用户绑定的,也就是说根据此 sessionid(假设为 abc) 可以查询到它到底是哪个用户
  2. 服务器然后将此 sessionid 通过 Cookie 传给浏览器
  3. 之后浏览器的每次请求中只要在 Cookie 里带上 sessionid=abc 这一个键值对
  4. server 将用户Cookie里面记录的sessionid和服务器内存中的sessionid进行比对,从而找到这个用户对应的session并恢复之前的状态信息

Cookie 是存储在 client 的,而 session 保存在 server,sessionId 需要借助 Cookie 的传递才有意义

session 的不足

上述情况能正常工作是因为我们假设 server 是单机工作的,但实际在生产上,为了保障高可用,一般服务器至少需要两台机器,通过负载均衡的方式来决定到底请求该传到哪台机器上

那么session怎么办呢,假设登录请求发到了 A 机器,A 机器生成了 session 并在 Cookie 里添加 sessionId 返回给了浏览器,下次添加购物车时如果请求发到了 B 或者 C,由于 session 是在 A 机器生成的,此时的 B,C 是找不到 session 的,那么就会发生无法添加购物车的错误,就得重新登录了,那么这个时候该怎么办呢?
主要有以下三种解决方式:

session 复制

A 生成 session 后复制到 B, C,这样每台机器都有一份 session,无论添加购物车的请求打到哪台机器,由于 session 都能找到,所以不会有问题

缺点:

  1. 同一样的一份 session 保存了多份,数据冗余
  2. 如果节点少还好,但如果节点多的话,可能需要部署成千上万台机器,这样节点增多复制造成的性能消耗也会很大

session 粘连

这种方式是让每个客户端请求只发到固定的一台机器上,比如浏览器登录请求发到 A 机器后,后续所有的添加购物车请求也都发到 A 机器上,Nginx 的 sticky 模块可以支持这种方式,支持按 ip 或 Cookie 粘连等等,如按 ip 粘连方式如下

upstream tomcats {
  ip_hash;
  server 10.1.1.107:88;
  server 10.1.1.132:80;
}

这样的话每个 client 请求到达 Nginx 后,只要它的 ip 不变,根据 ip hash 算出来的值会发到固定的机器上,也就不存在 session 找不到的问题了

缺点:机器挂了就无法找到session

session 共享

这种方式也是目前各大公司普遍采用的方案,将 session 保存在 redis,memcached 等中间件中,请求到来时,各个机器去这些中间件取一下 session 即可

每个请求都要去 redis 取一下 session,多了一次内部连接,消耗了一点性能,不是什么大问题

Token

首先请求方输入自己的用户名、密码,然后 server 据此生成 token,客户端拿到 token 后会保存到本地,之后向 server 请求时在请求头带上此 token 即可
server 会有一套校验机制,校验这个 token 是否合法,在 token 中也会携带 uid 信息

token 主要由三部分组成:

  1. header:指定了签名算法,不做加密,只做一般的base64编码
  2. payload:存放用户信息,不做加密,只做一般的base64编码
  3. Signature:签名,server 根据 header 知道它该用哪种签名算法,再用密钥根据此签名算法对 head + payload 生成签名,这样一个 token 就生成了,因此这个签名中包含三部分内容
  • header
  • payload
  • secret(盐,是一个私钥)

流程:

  1. 浏览器访问服务器,服务器为其生成一个token并传给浏览器
  2. 浏览器下次再次访问的时候就发送这个token
  3. 当 server 收到浏览器传过来的 token 时,它会首先取出token中的 header + payload,使用 secret 生成签名
  4. 将此签名与浏览器发来的token中的Signature比对,如果成功则说明签名是合法的,即 token 是合法的
  5. 从 payload 中直接就可以获取用户的状态信息,避免了像 session 那样要从 redis 去取的开销

三者区别


  • Cookie不支持跨域访问、单点登录,Token支持跨域访问、单点登录
  • Token支持移动平台,可扩展性好,Cookie不支持
  • Cookie是个数据载体用来传递数据
  • Session生成在服务端同时保存在服务端,只有Cookie作为载体来将SessionID传送
  • Token生成在服务端保存在客户端,服务端中会保存secret

标签:请求,用户,Session,token,server,Token,session,Cookie
From: https://www.cnblogs.com/kybky/p/17652497.html

相关文章

  • smartbi token回调获取登录凭证漏洞
    2023年7月28日Smartbi官方修复了一处权限绕过漏洞。未经授权的攻击者可利用该漏洞,获取管理员token,完全接管管理员权限。于是研究了下相关补丁并进行分析。0x01分析结果依据补丁分析,得到如下漏洞复现步骤第一步,设置EngineAddress为攻击者机器上的http服务地址首先使用pythonflask......
  • flask路由、模板、请求响应、session
    目录一路由系统1.1flask路由系统的参数1.2转换器(了解)1.3路由系统本质-->读源码1.4endpoint1.5flask写接口api二CBV2.2as_view源码三模板四请求响应五session一路由系统#1flask路由系统是基于装饰器的:参数如下#2转换器:#3路由系统本质#4endpoint不传会......
  • mall :sa-token项目源码解析
    目录一、mall开源项目1.1来源1.2项目转移1.3项目克隆二、Sa-Toekn框架2.1Sa-Token简介2.2分布式后端项目的使用流程2.3分布式后端项目的使用场景三、源码解析3.1集成与配置3.1.1导入依赖3.1.2添加配置3.1.3异常处理3.1.4存储用户信息3.2登录认证3.2.1配置黑白名单3.......
  • \1146 - Table 'performance_schema.session_variables' doesn't exist
    Mysql无法正常连接: 错误原因:NavicatPremium:\1146-Table'performance_schema.session_variables'doesn'texist解决办法[root@zookeeper1usr]#mysql_upgrade-uroot-p--forceEnterpassword:   错误原因:未设置远程连接:grantallprivilegeson*.*to'ro......
  • 【校招VIP】网络基础之cookie、session和storage
    考点介绍:cookie、session和localstorage是目前常用的存储机制,不管是大厂还是中小公司,都会对这个问题有比较高的考察频度,而且有一定的深度和对比分析。本期分享的网络基础之cookie、session和storage,分为试题、文章以及视频三部分。一、考点题目1、请你描述一下cookies,sessio......
  • 深入探讨安全验证:OAuth2.0、Cookie与Session、JWT令牌、SSO与开放授权平台设计
    什么是认证和授权?如何设计一个权限认证框架?认证和授权是安全验证中的两个重要概念。认证是确认身份的过程,用于建立双方之间的信任关系。只有在认证成功的情况下,双方才可以进行后续的授权操作。授权则是在认证的基础上,确定用户或系统对资源的访问权限。在设计一个权限认证框架时,......
  • uniapp保存服务器端sessionID方案
    我们知道,uniapp,小程序都不支持cookie,那么每次调用服务端api接口时,服务端提供的Set-Cookie无法自动保存,导致每次都请求都是一个新sessionID,无法完成一些正常的校验,想要解决这个问题,可以让uniapp首次加载请求时保存服务器传过来的sessionID,在之后的请求中都在header中携带着这个coo......
  • Django自定义中间件验证用户token信息
    1.新建middleware.pyfromdjango.urlsimportreversefromrest_framework.responseimportResponsefromutils.tokenimportcheck_tokenfromdjango.httpimportJsonResponse,HttpResponseRedirectfromyshop.modelsimportMyUsertry:fromdjango.utils.de......
  • SSO-Cookie介绍
    1.cookie是一个存储在客户端的字符串属性,可以用它对当前网页的cookie进行读,写,增,删等操作;javascript能够用document对象的cookie属性对cookie进行操作; 2.cookie的四个可选属性:2.1cookie的生存期属性:expires;默认情况下,cookie只在浏览器会话期存在.退出浏览器就丢失;......
  • 传token给食物类,通过新写一个test.py去调用登录类和食物类
    #\libs\request_test.pyfromlibs.login_myimportLoginfromlibs.food_myimportFood#调用登录获得tokenl=Login()t=l.login(is_need_token=True)#将登录获得的token传递给食物模块f=Food()f.token=t#传token给整个食物类,这样整个食物类可以直接使用token;因为基......