cookie,session,token

cookie,session,token

    1. 无token时期
    • 只浏览一些文本,每次请求都是一个新的HTTP协议(请求+响应),不需要记住谁发送了请求。
    1. cookie+session认证时期
    • 随着网站兴起,需要进行交互,像购物网站。 需要记住每个人的状态。把每个人区分开,所以办法就是给大家发一个会话标识(session id),就是一个随机的字符串,每个人收到的都不一样, 每次大家向我发起HTTP请求的时候,把这个字符串给一并捎过来, 这样我就能区分开谁是谁了
    1. cookie+session存在问题解决
    • 虽然每个人只需要保存自己的session id,但是对于服务器来说是一个数以万计的庞大数据量,这对服务器说是一个巨大的开销 , 严重的限制了服务器扩展能力,例如:我用两个机器组成了一个集群, 小F通过机器A登录了系统, 那session id会保存在机器A上, 假设小F的下一次请求被转发到机器B怎么办? 机器B可没有小F的 session id。
    • 有时候会采用一点小伎俩: session sticky , 就是让小F的请求一直粘连在机器A上, 但是这也不管用, 要是机器A挂掉了, 还得转到机器B去
    • 那只好做session 的复制了, 把session id 在两个机器之间搬来搬去, 快累死了
      在这里插入图片描述
    • 后来有个叫Memcached的支了招: 把session id 集中存储到一个地方, 所有的机器都来访问这个地方的数据, 这样一来,就不用复制了, 但是增加了单点失败的可能性, 要是那个负责session 的机器挂了, 所有人都得重新登录一遍, 估计得被人骂死。
    • 也尝试把这个单点的机器也搞出集群,增加可靠性, 但不管如何, 这小小的session 对我来说是一个沉重的负担
      在这里插入图片描述
  • Token认证

    • 为什么要保存session呢, 只让每个客户端去保存该多好?如果不保存这些session id , 无法验证客户端发给我的session id 是我自己生成,如果不去验证,我们都不知道他们是不是合法登录的用户, 有不怀好意的家伙们可以伪造session id , 之后就会为所欲为
    • 所以关键点就是验证
    • 比如a登录了系统,我给其发一个令牌(token),里面包含了a的user id,下一次a通过HTTP请求访问我时,把token通过Http header带过来就行。但是该方法本质与session id没有区别,也可以随意伪造,所以得想点其他办法。
    • 所以就可以对数据做一个签名, 比如说我用HMAC-SHA256 算法加上一个自己设置的密钥,对数据做一个签名, 把这个签名和数据一起作为token , 由于密钥别人不知道, 就无法伪造token了
      在这里插入图片描述
  • 此token不保存,当a把token给我发过来的时候,我在用同样的HMAC-SHA256算法+同样的密钥,对数据再进行一次在签名与之前的比较,校验是否相同,就知道a是否已经登录过。知道数据是否被人篡改过

  • 在这里插入图片描述

      1. Token 中的数据是明文保存的(虽然我会用Base64做下编码, 但那不是加密), 还是可以被别人看到的, 所以我不能在其中保存像密码这样的敏感信息
      1. 当然, 如果一个人的token 被别人偷走了, 那我也没办法, 我也会认为小偷就是合法用户, 这其实和一个人的session id 被别人偷走是一样的。
      1. 这样一来, 我就不保存session id了, 我只是生成token , 然后验证token , 我用我的CPU计算时间获取了我的session 存储空间
      1. 解除了session id这个负担,机器集群现在可以轻松地做水平扩展, 用户访问量增大, 直接加机器就行。 这种无状态的感觉实在是太好了!

Cookie,Session解释

  • cookie:(存在客户端浏览器的键值对)
    • cookie指的是浏览器例能永久存储的一种数据 ,仅仅时浏览器实现的一种数据存储的功能。
    • cookie由服务器生成,发送给浏览器,浏览器会把cookie一kv键值对形式保存到某个目录下的文本文件内,下一次请求同一网站时会把cookie发送给服务器。因为cookie时存在于客户端上的,所以浏览器为了确保cookie不会被恶意使用,所以会加入一些限制。同时也不会占用很大的磁盘空间,每个域的·cookie数量时有限的
  • Session: (存在于服务端的键值对)
    • session 从字面上讲,就是会话.
    • 服务器要知道当前发请求给自己的是谁。为了做这种区分,服务器就要给每个客户端分配不同的“身份标识”,然后客户端每次向服务器发请求的时候,都带上这个“身份标识”,服务器就知道这个请求来自于谁了。至于客户端怎么保存这个“身份标识”,可以有很多种方式,对于浏览器客户端,大家都默认采用 cookie 的方式。
    • 服务器使用session把用户的信息临时保存在了服务器上,用户离开网站后session会被销毁。这种用户信息存储方式相对cookie来说更安全,可是session有一个缺陷:如果web服务器做了负载均衡,那么下一个操作请求到了另一台服务器的时候session会丢失。
  • cookie和session的区别
    • session是存储服务器端,cookie是存储在客户端,所以session的安全性比cookie高
    • session的信息是通过sessionid获取的,而sessionid是存放在会话cookie中

Token

  • token数据是三段式,由服务端生成,存放在客户端(浏览器就放在cookie中,移动端:存在移动端中)

  • token数据三段式:

    • 第一段:Header: 公司的信息,加密方式等。{}
    • 第二段:荷载: 真正的数据 {name:?,id=?}
    • 第三段:签名: 通过第一段和第二段,通过某种加密方式加密得到的随机字符串
  • token的使用分两个阶段

    • 登录成功后的{签发token阶段}—>生成了三段
    • 登录成功访问某个接口的验证阶段—>验证token是否合法
  • 使用token的认证机制,服务端还需要存数据嘛?

    • token是服务的生成,客户端保存,服务端就不存储token
  • 文章部分摘自
    https://www.cnblogs.com/liuqingzheng/p/8990027.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值