| |
|
开发:
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?在接口的响应结果中,经常会出现类似这样的返回值:
往往需要在访问下一个接口时传递token数据。
所以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集群,当单个数据库挂掉时,可以使用其他数据库中的数据。集群要做好数据同步,保证每个节点的数据一致性,也要做好负载均衡,尽量不让节点因为负载挂掉,就算其中有节点挂掉了,也不影响服务执行。 总结:
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?sessionsession:
token:
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地址范围 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
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年11日历 | -2024/11/26 3:43:54- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |