session和token

http协议无状态的问题:
1.不安全
2.需要重复传入相同的数据

为了解决这两个问题引入了session

## session
让服务器记住客户端,比如存储账号密码、访问次数等。
默认在服务器中保存数据,并生成一个session_id,用来代表存储的数据,通常是加密的
比如session = 'yuz;2021-10-16 20:28; 手机'
session_id = 'yuz' # 和session发生关联的一个简短数据,一般是用户名和密码加密后的结果

服务器发送setcookie: sessionid='yuz' 客户端下次请求带cookie: sessionid='yuz'
服务器通过setcookie的响应头把session_id返回给客户端,让客户端把session_id存在cookie,
客户端下次请求就通过cookie把session_id发送给服务器

## session会带来的问题
- 每个用户都要创建一个sessionid,都存到服务器当中,占用很多服务器内存,影响服务器的性能。
- 当并发查询较大时,服务器响应很慢
- session跨域比较困难,假如是多机器,那每台机器需要保持数据的一致和同步性,响应将会更慢

解决方法:
1.使用数据库来存储数据,比如redis,解决服务器内存的压力,但请求数多时还是会慢
2.配置redis集群,可以解决请求数多的问题,尽量不让节点挂掉,有节点挂了也不影响服务执行

上面的问题都是存数据到服务端带来的,从根上解决问题,需要数据不存服务端,
把传过来的数据打包成token,
直接传给客户端,客户端解码就好了,
但这种方式太容易被伪造,故为了安全性,增加签名sign。

## 签名
当用户登录时,服务器提取用户名或者id组装成payload ,代表用户数据,
然后用header拼接Payload组装成新的数据,
(秘钥存储在服务器中,相当于公章)
通过HS256这一类的加密算法把秘钥和数据加密得到签名sign。(哈希算法 这种加密算法是不可逆的)
然后再拼接header(说明一些其他的数据,比如加密的算法类型)、 payload和sign,得到token。
token有时效性,会过期


## 什么是token
在接的响应结果中,经常会出现类似这样的返回值。
{
"msg": "success",
"token": "eyJzdWI10iAiexV6IiwgInJvbGUi0iAiYWRtaW4ifQ"
}
往往需要在访问下一个接口时传递token数据。
1 curl -x POST -H Authorization:eyJzdWIi0iAieXV6IiwgInJvbGUi0iAiYwRtaw4ifQ
<http://127 .0.0.1:5000/user>
2 {"alg": "HS256" ,"typ": "JWT"}

所以token本质上就是用户信息通过编码转化成另-种形态得到 token,再通过token解码得到用户数据。
算法一般是base64url
eyJzdWI10iAiexV6IiwgInJvbGUi0iAiYWRtaW4ifQ =={"sub": "yuz","role": "admin"}

##区别
session:
1.把客户端的信息存在服务器
2.需要占用服务端的内存、磁盘和数据库
3.用户量大时需要频繁查询,影响服务器的响应速度
4.跨域困难,多个服务器时,需要保持数据的一致和同步性,也会影响服务器响应速度

session白话文:
session是为了让服务器记住客户端,把客户端的信息存到服务器中,
比如用户名和密码,但需要耗费服务器的内存、磁盘和数据库;
当用户量大时,需要频繁查询,拖慢请求的速度;
服务器不止一台的时候,还得保证各服务器之间数据的一致性,
这就需要各服务器不断同步数据,
也会影响服务器的性能,跨域不方便。


token:
1.不存服务端,直接丢给客户端。客户端一般存cookie,也可以存其他地方,
比如indexdb、local storage
2.不用耗费服务器的存储资源
3.速度快
4.跨域方便

token白话文:
token是服务端把客户端的数据经过服务器加密带上签名后再重新发给客户端,不用存储在服务端,
客户端收到token后存到cookie或indexdb、local storage;
速度比session快;
多个服务器也不影响服务器的性能,跨域方便。


token的缺点:
1.不能立即注销,不能立即让token失效
2.如果强行废除token,只能再次使用服务器记住,又回到服务器存储资源的问题。
不强行废除token就不会存在这个问题

##cookie
cookie:只是实现token和session的-种手段。cookie只是-一个http请求头字段。
原文地址:https://www.cnblogs.com/wsfsd/p/15420554.html