58.3-查询表达式、Session-Cookie机制、JWT

2020-08-13  本文已影响0人  BeautifulSoulpy

有时候,我们需要的,只是一颗静下来的心!


总结:

  1. sessionid是有S端发给B端的,服务器记录后,对下一次访问进行验证,返回给浏览器端sessinid与cookie;
  2. 服务器攻击方式:耗尽内存;session 消耗内存;
  3. DNS解析使用的是UDP协议(UDP53号端口 :50);
  4. JWT 是防篡改,是明文传输的,数据部分是base64转码,对签名sig部分进行加密;三个部分全部验证通过才算校验完成;

1. 注册接口设计完善

1.1 认证

HTTP协议是无状态协议,为了解决它产生了cookie和session技术; 是否是同一个用户的请求;
set-cookie 服务器端发给浏览器; session 是进程级 ;


[http://127.0.0.1:8000/admin/user/user/]
传统的session-cookie机制

浏览器发起第一次请求到服务器, 服务器发现浏览器没有提供sessionid, 就认为这是第一次请求, 会返回一个新的sessionid给浏览器端。浏览器只要不关闭, 这个sessionid就会随着每一次请求重新发给服务器端, 服务器端查找这个sessionid, 如果查到, 就认为是同一个会话。如果没有查到, 就认为是新的请求。

session是会话级的, 可以在这个会话session中创建很多数据, 连接断开session清除, 包括sessionid.
这个sessionid还得有过期的机制, 一段时间如果没有发起请求, 认为用户已经断开, 就清除session。浏览器端也会清除响应的cookie信息。

服务器端保存着大量session信息, 很消耗服务器内存, 而且如果多服务器部署, 还要考虑session共享的问题, 比如red is、memcached等方案;
(session 最近最少原则:)

无session方案

既然服务端就是需要一个ID来表示身份,那么不使用session也可以创建一个ID返回给客户端。但是,要保证客户端不可篡改。

场景问题:同一个网站 有两个不同的服务器,需要访问不同网址session不一致:

  1. 保持两台服务器session同步通信;
  2. redis 备份1,2;

服务端生成一个标识,并使用某种算法对标识签名。
服务端收到客户端发来的标识,需要检查签名。
这种方案的缺点是,加密、解密需要消耗CPU计算资源,无法让浏览器自己主动检查过期的数据以清除。 这种技术称作 JWT(Json WEB Token)

JWT

JWT(Json WEB Token)是一种采用Json方式安装传输信息的方式。
这次使用PyJWT,它是Python对JWT的实现。官网[https://jwt.io]
Pyjwt(https://github.com/jpadilla/pyjwt/)
https://pypi.python.org/pypi/PyJWT/1.5.3
文档 https://pyjwt.readthedocs.io/en/latest/

JWT的实际案例:

利用PyJWT生成Token

encoded = jwt.encode({'some': 'payload'}, 'secret', algorithm='HS256')
print(encoded)
#'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzb21lIjoicGF5bG9hZCJ9.4twFt5NiznN84AWoo1d7KO1T_yoc0Z6XOpOVswacPZg'

payload = jwt.decode(encoded, 'secret', algorithms=['HS256'])
print(payload)
# -----------------------------------------------------------------------
b'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzb21lIjoicGF5bG9hZCJ9.Joh1R2dYzkRvDkqv3sygm5YyK8Gi4ShZqbhK2gxcs2U'
{'some': 'payload'}



from jwt.algorithms import get_default_algorithms
# 根据jwt算法, 重新生成签名
#1获取算法对象
alg = get_default_algorithms()['HS256']   # 查询HS256算法
newkey = alg.prepare_key(key)
sign_input,_,_= encoded.rpartition(b'.')
sig  = alg.sign(sign_input,newkey)
print('-'*30)
print(signature)
print(sig)
print(base64.urlsafe_b64encode(sig))
------------------------------
b'Joh1R2dYzkRvDkqv3sygm5YyK8Gi4ShZqbhK2gxcs2U'
b'&\x88uGgX\xceDo\x0eJ\xaf\xde\xcc\xa0\x9b\x962+\xc1\xa2\xe1(Y\xa9\xb8J\xda\x0c\\\xb3e'
b'Joh1R2dYzkRvDkqv3sygm5YyK8Gi4ShZqbhK2gxcs2U='


JWT三部分内容
由此,可知jwt生成的token分为三部分
1、header,由数据类型、加密算法构成
2、payload,负载就是要传输的数据,一般来说放入python对象即可,会被json序列化的
3、signature,签名部分。是前面2部分数据分别base64编码后使用点号连接后,加密算法使用key计算好一个结果,再被base64编码,得到签名

所有数据都是明文传输的,只是做了base64,如果是敏感信息,请不要使用jwt。
数据签名的目的不是为了隐藏数据,而是保证数据不被篡改。如果数据篡改了,发回到服务器端,服务器使用自己的key再计算一遍,然后进行签名比对,一定对不上签名。

Jwt使用场景
认证:这是Jwt最常用的场景,一旦用户登录成功,就会得到Jwt,然后请求中就可以带上这个Jwt。服务器中Jwt验证通过,就可以被允许访问资源。甚至可以在不同域名中传递,在单点登录(Single Sign On)中应用广泛。
数据交换:Jwt可以防止数据被篡改,它还可以使用公钥、私钥,确保请求的发送者是可信的

上一篇 下一篇

猜你喜欢

热点阅读