cookie、session、token 到底是什么

cookie、session、token 到底是什么

说到cookie、session、token 之前我们有必要先来了解了解HTTP的发展史,在以前web基本都是文档的浏览而已,因为是浏览就不需要去记录是谁在什么时间浏览什么文档,所以每一请求都是一次新的HTTP协议(请求加协议),但是随着web应用的发展,比如像购物网站等类似需要登录的网站就得面临管理会话,服务器必须记住是谁登录了系统,哪些人往自己的购物车加商品等,就是说服务器需要把每个人区分开

cookie

怎么才能让服务器区分开每个人呢?我们需要让每个客户端都贴上了一个小纸条(cookie),上面记录了服务器给我们返回的一些信息,然后服务器看到这张小纸条就知道我们是谁了。

cookie是谁产生的?

cookie是由服务器产生的,浏览器第一次访问服务端时,服务器此时肯定不知道他的身份,所以创建一个独特的身份标识数据,格式为key=value,放入到Set-Cookie字段里,随着响应报文发给浏览器。

  1. 浏览器看到有Set-Cookie字段以后就知道这是服务器给的身份标识,于是就保存起来,下次请求时会自动将此key=value值放入到Cookie字段中发给服务端。
  2. 服务端收到请求报文后,发现Cookie字段中有值,就能根据此值识别用户的身份然后提供个性化的服务。
    在这里插入图片描述
浏览器的Cookie存放在哪呢?

例如Chrome浏览器依次打开:

  1. 在右上角,点击更多>设置
    在这里插入图片描述
  2. 点击隐私设置和安全性
    在这里插入图片描述
  3. 点击网站设置
    在这里插入图片描述
    然后可以根据域名进行搜索所管理的Cookie数据,所以是浏览器替你管理了Cookie的数据。

session

那么session呢?
如果将账户的一些信息都存入Cookie中的话,一旦信息被拦截,那么我们所有的账户信息都会丢失掉,所以就出现了Session。在一次会话中将重要信息保存在Session中,浏览器只记录SessionId,一个SessionId对应一次会话请求。Cookie是存储在客户端方,Session是存储在服务端方,客户端只存储SessionId
关于session的理解:

  1. 浏览器第一次访问服务器,服务器会创建一个 session,并生成一个 sessionId
  2. 将 sessionid 及对应的 session 分别作为 key 和 value 保存到缓存中,也可以持久化到数据库中
  3. 服务器再把 sessionid,以 cookie 的形式发送给客户端
  4. 浏览器下次再访问时,会直接带着 cookie 中的 sessionid。然后服务器根据 sessionid 找到对应的 session 进行匹配
    在这里插入图片描述
基于session验证用户的弊端

一台机没有问题,如果是多台服务器集群这就要求session数据共享,每台服务器都能够读取session。

  1. 做session复制把session id 在两个服务器之间搬来搬去很耗时间
  2. 共享Session,将Session Id 集中存储到一个地方,所有的机器都来访问这个地方的数据。这种方案的优点是架构清晰,缺点是工程量比较大。另外,持久层万一挂了,就会单点失败;
    无论是复制还是共享,都存在弊端,所以人们就想到,服务器索性不保存session数据了,所有数据就保存在客户端,每次请求都发回服务器。Token就诞生了。

token

到这个时候人们已经想我们为什么要保存这可恶的session呢, 只让每个客户端去保存该多好,如果不保存这些session id , 怎么验证客户端发给我的session id 的确是我生成的呢? 如果不去验证,我们都不知道他们是不是合法登录的用户, 那些不怀好意的家伙们就可以伪造session id , 为所欲为了。
关键点来了:验证
你已经登录了系统,服务器给你发一个令牌(token), 里边包含了你的 user id, 下一次再次通过Http 请求访问服务器的时候, 把这个token 通过Http header 带过来,为了防止别人伪造token,对数据进行HMAC-SHA256 算法,加上一个只有服务器才知道的密钥, 对数据做一个签名,把这个签名和数据一起作为token ,就不怕别人伪造了。
在这里插入图片描述

这个token 服务器不保存, 当你把这个token 发过来的时候,服务器再用同样的HMAC-SHA256 算法和同样的密钥,对数据再计算一次签名, 和token 中的签名做个比较, 如果相同, 我就知道你已经登录过了,并且可以直接取到你的user id , 如果不相同, 数据部分肯定被人篡改过, 服务器就告诉发送者: 对不起,没有认证。
在这里插入图片描述
但是token中的数据是明文保存的, 还是可以被别人看到的, 所以服务器不能在其中保存像密码这样的敏感信息。

token的详细解释

token的意思是“令牌”,是用户身份的验证方式,最简单的token组成:uid(用户唯一的身份标识)、time(当前时间的时间戳)、sign(签名,由token的前几位+盐以哈希算法压缩成一定长的十六进制字符串,可以防止恶意第三方拼接token请求服务器)。还可以把不变的参数也放进token,避免多次查库。

基于token验证用户
  1. 用户通过用户名与密码发送请求
  2. 程序验证
  3. 程序返回一个签名的token给客户端
  4. 客户端存储token,并每次发送请求并携带token
  5. 服务器验证token并返回数据
    在这里插入图片描述

区别

Cookie和Session的区别
  1. 存储位置不同: cookie数据存放在客户的浏览器上,session数据放在服务器上
  2. 隐私策略不同:cookie不是很安全, 别人可以分析存放在本地的cookie并进行cookie欺骗,考虑到安全应当使用session
  3. session会在一定时间内保存在服务器上。当访问增多,就会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用cookie
  4. 存储大小不同: 单个cookie保存的数据不能超过4k, 很多浏览器都限制一个站点最多保存20个cookie

将登陆信息等重要信息存放为session, 其他信息如果需要保留,可以放在cookie中

Token和Session的区别
  1. Session是一种HTTP储存机制, 为无状态的HTTP提供持久机制;
  2. Session是一种HTTP储存机制, 为无状态的HTTP提供持久机制;

Session和Token并不矛盾,作为身份认证Token安全性比Session好,因为每一个请求都有签名还能防止监听以及重放攻击,而Session就必须依赖链路层来保障通讯安全了。如上所说,如果你需要实现有状态的回话,仍然可以增加Session来在服务端保存一些状态。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值