IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> session和token鉴权 -> 正文阅读

[网络协议]session和token鉴权

1.什么是token?

在接口的响应结果中,经常会出现类似这样的返回值:

{"msg":"success",

"token":"eysdjsdAshdjhfjisjfoisjdiv"

}

往往需要在访问下一个接口时传递token数据。

curl -x POST -H Authorization:eysdjsdAshdjhfjisjfoisjdiv

<http:127.0.0.1:5000/user>

{"alg":"HS256","typ":"JWT"}

所以token本质上就是用户信息通过编码转化为另一种形态得到token,再通过token解码得到用户数据。

2.无状态

要理解token的由来,先得从HTTP讲起。HTTP协议是一种无状态的协议,服务器没有记忆能力,无法记住客户端之前有没有发送过请求,因此客户端每次发送的请求都是独立的。

这会造成一个问题,当客户端必须要登录才能进行的操作,每次请求都要重复发送用户名和密码给服务器校验,频繁发送敏感信息会造成很大的安全问题。

总结,无状态的问题:

  • 不安全
  • 重复数据

3.session

有没有一种方法让服务器记住客户端的(登录)状态呢?session就是一种很好的方式。当用户登录时,发送用户名和密码之后,服务端会给客户端生成一个sessionid,表明这是属于哪一个用户,然后在sessionid中存储该用户的数据,比如这个用户之前添加的购物车,这个用户的登录时间等等,这些信息会保存到服务器。

接下来,服务器通过cookie的形式把sessionid返回给客户端。每次客户端请求该服务器时,会自动带上sessionid这个cookie。服务器接收到后查询有没有存储这个sessionid的信息。

相当于进入某个产业园,保安大叔会把你的信息登记在一个小本子上,比如身份证号等,下次你就拿着这个号码来,保安大叔一核对,在小本上有登记,你就可以进去了。

session会带来几个问题:

第一,session需要占用很多服务器的资源(买一个很厚的本子登记)。服务器针对每个用户都要创建一个sessionid,然后在这个sessionid对应的存储空间存储大量数据。用户每次请求后都需要查询有没有对应的sessionid,会影响服务器的响应速度,尤其涉及到大量数据节点时,还需要同步。

第二,每次都要查询,翻一个很厚的本子,速度很慢,当有太多请求时,很久才能收到响应。(来一个人,保安大叔要翻看上千页的本子核对)

第三,session通常会和cookie搭配,但是cookie无法跨域。对于涉及到多个服务的跨域操作,有很大的局限性。同时,如果涉及到跨域或者多台服务器,就需要共享session,必须保证每台服务器都能获取session而且要保持数据同步和一致性(人太多,设置多个保安亭,每个保安亭都要保持数据一致性,还要每天更新离职的和新近来的员工)。

我们可以采取数据库保存session,像redis这样的数据库就比较适合存储session,但是新的问题又来了,服务器每接收一次请求都需要查询数据库,当访问量太大时会给数据库带来非常大的压力,如果数据库挂了,那服务就直接无法使用了。

解决方式是配置redis集群,当单个数据库挂掉时,可以使用其他数据库中的数据。集群要做好数据同步,保证每个节点的数据一致性,也要做好负载均衡,尽量不让节点因为负载挂掉,就算其中有节点挂掉了,也不影响服务执行。

总结:

  • 让服务器记住客户端
  • session在服务器当中保存用户访问数据。
  • session = 'agsuagduaskdopau8qwyidsdjcbjzhjjjasan'
    session_id = get_id(session) = '123456' 通常是加密后的数据,session_id 和session发生关联的一个简短的数据,一般来源是用户名或密码加密之后的结果

4.Token

虽然最红通过集群管理能够解决session的问题,但是工程量和成本还是相当高的。

既然服务器处理用户状态这么麻烦,那为什么不放在客户端去存储呢?当用户登录以后,服务器根据用户ID或者用户名生成一个userid,然后获取用户数据,比如购物车数据,登录时间等,把这些数据放在userid盒子里面,和之前的sessionid差不多,只是不在服务器存储了,而是直接丢给客户端。

客户端每次都携带这个关于用户的盒子给服务器,盒子中带有用户的数据。服务器可以直接拿到用户的数据,并不需要再次查询服务器。

相当于保安大叔不需要小本子了,而是直接发给你一个通行证。

这种方式就是token方式。服务器并不存储用户数据,而是直接通过编码或者加密方式把用户数据作为令牌直接返回给客户端,传递的方式服务端自己设置。每次客户端都携带这个令牌,证明自己的身份,从而得到自己的状态和数据。

这样,服务器可以节省大量的存储资源,也不需要每次查询,加快了响应速度,而且传递的方式也是由双方协定,不管是不是跨域,都可以正常传递。

5.签名

这种token方式目前还有一个问题:很容易被伪造,任何人都可以宣称自己是某个用户,从而获取该用户的私密信息,必须要想办法证明这个token就是由信任的服务器颁发给客户端的。

这个办法就是签名。

当用户登录时,服务器提取用户名或者id封装成payload,代表用户数据,然后用hesder拼接payload组装成新的数据,通过HS256这一类不对称的加密算法得到签名,然后再拼接header,payload和sign,得到token。

sign保证了token是由服务器签发的,因为只有服务器知道签名的密钥。接下来还是和之前一样,每次访问新的接口,只需要带上这个token就可以了。

服务器获取header和payload,使用服务端的密钥得到新的签名,和客户端传过来的sign对比,如果一致,表示这是合法的token,如果不一致,就是伪造的。

6.token注销

token还有一个问题就是不能主动注销。

7.总结: token VS?session

session:

  • 存储在服务端
  • 需要占用服务端资源
  • 需要频繁的查询,从而拖慢请求的处理速度,响应时间长
  • 跨域麻烦

token:

  • 不存服务端,直接丢给客户端。客户端存哪儿?开发者定义,比如cookie,indexdb,local?storage
  • 不需要消耗服务器存储资源
  • 响应速度快
  • 跨域方便

token的缺点:不能立即注销或者说就是不能立即让token失效。

如果要强行废除token,就只能用小本本记一下(告诉保安大叔,哪个人离职了,他的通行证不能使用)。

cookie:只是实现token和session的一种手段。cookie只是一个http请求头字段,格式cookie:value。

?

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-10-18 17:44:23  更:2021-10-18 17:45:05 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年9日历 -2024/9/21 9:12:31-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码