JWT 和状态保持

cookie?
Cookie可以用来在某个WEB站点会话间持久的保持状态
Cookie是由服务器端生成,发送给浏览器,浏览器会将Cookie的key/value保存到某个目录下的文本 文件内,下次请求同一网站时自动发送该Cookie给服务器
session
Session是另一种记录客户状态的机制,基于Cookie实现,不同的是Cookie保存在客户端浏览器中, 而Session保存在服务器上
客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上,这就是Session, 客户端浏览器再次访问时只需要从该Session中查找该客户的状态就可以了

cookie-sesson状态保持cookie
登录状态保持
1、数据存放位置不同:
cookie数据存放在客户的浏览器上,session数据放在服务器上。
2、安全程度不同:
cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,考虑到安全应当使用session。
3、性能使用程度不同:
session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,
应当使用cookie。
4、数据存储大小不同:
单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie,而session则存储与服务端,浏览器对其没有限制。

5、会话机制不同
session会话机制:session会话机制是一种服务器端机制,它使用类似于哈希表(可能还有哈希表)的结构来保存信息。
cookies会话机制:cookie是服务器存储在本地计算机上的小块文本,并随每个请求发送到同一服务器。 Web服务器使用HTTP
标头将cookie发送到客户端。在客户端终端,浏览器解析cookie并将其保存为本地文件,该文件自动将来自同一服务器的任何请
求绑定到这些cookie。


为什么有状态保持?
因为http协议,底层走TCP,TCP是无状态的协议:
走三次握手(建立连接)、四次挥手(再见),无状态的协议。
服务器不会记得之前跟你说了啥?
下一次连接,又是一个新的连接。
HTTP通讯的过程中,使用的是无状态的协议。
作用:状态保持的一种方案,用来实现状态保持;
本质:是key、value形式的字符串;
原理:服务器给每个客户端进行编号;
服务器生成cookie的key和value
服务器把key和value都给浏览器,在浏览器中保存
浏览器在请求该服务器时,会自动携带cookie
服务器就能够根据cookie信息,识别你是谁。

补充:

**cookie和session都是实现状态保持的方案
和语言、框架(Flask和Django)、平台无关;**

 

 

JWT

Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密

 

jwt三部分组成:
头部----申明自己的形式,加密方式 声明类型 算法
载荷----存储信息的地方
签证----验证 头部+载荷+头部的加密+随机字符串

 

总结

  优点

  • 因为json的通用性,所以JWT是可以进行跨语言支持的,像JAVA,JavaScript,NodeJS,PHP等很多语言都可以使用。
  • 因为有了payload部分,所以JWT可以在自身存储一些其他业务逻辑所必要的非敏感信息。
  • 便于传输,jwt的构成非常简单,字节占用很小,所以它是非常便于传输的。
  • 它不需要在服务端保存会话信息, 所以它易于应用的扩展

  安全相关

  • 不应该在jwt的payload部分存放敏感信息,因为该部分是客户端可解密的部分。
  • 保护好secret私钥,该私钥非常重要。
  • 如果可以,请使用https协议

 

使用django的自己用户模块

建⽴model( from django.contrib.auth.models import AbstractUser )
settings指定模型类( AUTH_USER_MODEL )
迁移⽣成数据库(原来⽣成过这些表的,需要删除所有的表进⾏重新⽣成)

 

使⽤DRF-JWT来做登陆注册以及状态保持

下载依赖
pip install djangorestframework-jwt

配置seetings
INSTALLED_APPS
REST_FRAMEWORK
JWT_AUTH

写注册⽣成token的代码
使⽤django的⽤户模型类
密码要密⽂
⽣成token并返回到前端

登陆⽣成token的代码
url⾥导包,并指定url
view⾥写返回的数据有哪些
settings⾥配置并告知django

权限的分离
导包( from rest_framework.permissions import IsAuthenticated,AllowAny )
APIView⾥设置permissions_class

 

posted @ 2021-09-23 21:10  偷电瓶养傻猪  阅读(123)  评论(0)    收藏  举报