详解Django登录原理以及session和cookie的区别

先看看知乎的大佬是怎么说的:cookie与session的区别
这里可以重点看看上面知乎用户“wuxinliulei”回答。很详细

由于HTTP是无状态的协议,当每次请求URL的时候,那么从HTTP的请求来讲,它都会发起一个连接,然后服务器返回数据后,我们就把连接关闭,如果服务器想知道同一批请求是不是同一个用户发来的,有一下三种方法,出于安全考虑设计了第三种。

  1. 每个请求在headers或者url的参数中加上username
    用户信息容易被截取,而且用户名不一定唯一

  2. 每个请求在headers或者url的参数中加上username和password
    虽然加上密码和用户名是唯一的,但是password有被黑客获取的风险

  3. 给用户一串随机字符串(令牌),字符串满足几个条件,session

    1. 够随机,随机到别人无法伪造
    2. 这个字符串是由服务器生成的
    3. 这个字符串需要和用户对应起来
  4. 登录的过程(django),Django内置的login函数原理

    1. 查询用户
    2. login的逻辑
      1. 先将用户的基本信息组成json,然后加密生成加密的session字符串
      2. 随机生成一串长的字符,叫做sessionid
      3. 将sessionid和session值绑定在一起保存到数据库中
      4. 将sessionid写入到cookie中
      5. 返回请求给浏览器
  5. 浏览器

    1. 拿到文本发现里面在cookie中写入了sessionid
    2. 将cookie中的所有值(key:value)形式,写入到本地存储(文件)
    3. 下一次登录会带着cookie
  6. django是如何确定某个请求是否登录?

    1. 拦截器拦截所有的请求
    2. 在拦截器中发现了在cookie中的sessionid后,通过该sessionid查询到session,从session中解析出用户的id,通过id查询到用户
    3. 给每个request都设置一个属性-user
    4. 拦截器其实就设置在我们的settings文件中,我们可以看看,在这里
MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

进行实验,我们可以把django_session这个表打开看一看,当用户登录的时候,这里面多了一些字段,当我们把这些字段的记录清空,在浏览器中刷新登录就会清空,当我们在浏览器中使用F12,然后去清空cookie,登录也会退出,当我们退出登录的时候,session和cookie就会清空。
在这里插入图片描述
这个内容要多看教学视频以及《HTTP权威指南》去理解

沛齐老师:

因为HTTP是短连接,他是通过cookie的机制实现的,当我们登录时服务端生成一串随机的字符串,将这些数据转义后保存在cookie中,我们的cookie如果被别人拿了,别人的电脑上也可以登录我们的账号,当我们下次再登录的时候,就会去比对这个cookie,如果一致就可以登录
在这里插入图片描述
登录流程总结:
假设没有设置其他cookie情况下,浏览器在第一次访问服务器的时候,服务器会为浏览器创建一个session,然后在服务器响应浏览器的时候把sessionid写入待cookie里边。这样浏览器下一次再访问服务器的时候,会带着cookie(此时里面有sessionid)请求服务器,服务器收到请求后会通过cookie的sessionid辨识出属于这个用户的session,这就是整个过程。
在这里插入图片描述
session与cookie的区别总结:
首先session是保存在服务器端的键值对,它可以保存在数据库,保存在缓存,还可以保存在文件里边,而cookie它是保存在浏览器端的键值对,它被定义在请求头里边,可以认为是 session 的一种后端无状态实现。是保存在浏览器端的某个文件里边,我们按F12,network那里可以看到。我们今天常说的 “session”,是为了绕开 cookie 的各种限制,session经常会依赖于cookie,通常借助于cookie本身后端的储存来实现,我们在Django里边也可以自己写个登录的装饰器,只用cookie来实现免密码登录,但是这样不安全,因为基于cookie做用户认证的时候,敏感信息都不适合放在cookie里边,比如账户余额,密码等等,,不然可能别人会拿着我们这些信息干坏事,所以要用session,session是一个很大的字典,用户来了之后,生成一个随机字符串写到用户浏览器cookie里边,然后在保存到session中,这个随机字符串就是Key,用户信息就是value.

  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值