先看看知乎的大佬是怎么说的:cookie与session的区别
这里可以重点看看上面知乎用户“wuxinliulei”回答。很详细
由于HTTP是无状态的协议,当每次请求URL的时候,那么从HTTP的请求来讲,它都会发起一个连接,然后服务器返回数据后,我们就把连接关闭,如果服务器想知道同一批请求是不是同一个用户发来的,有一下三种方法,出于安全考虑设计了第三种。
-
每个请求在headers或者url的参数中加上username
用户信息容易被截取,而且用户名不一定唯一 -
每个请求在headers或者url的参数中加上username和password
虽然加上密码和用户名是唯一的,但是password有被黑客获取的风险 -
给用户一串随机字符串(令牌),字符串满足几个条件,session
- 够随机,随机到别人无法伪造
- 这个字符串是由服务器生成的
- 这个字符串需要和用户对应起来
-
登录的过程(django),Django内置的login函数原理
- 查询用户
- login的逻辑
- 先将用户的基本信息组成json,然后加密生成加密的session字符串
- 随机生成一串长的字符,叫做sessionid
- 将sessionid和session值绑定在一起保存到数据库中
- 将sessionid写入到cookie中
- 返回请求给浏览器
-
浏览器
- 拿到文本发现里面在cookie中写入了sessionid
- 将cookie中的所有值(key:value)形式,写入到本地存储(文件)
- 下一次登录会带着cookie
-
django是如何确定某个请求是否登录?
- 拦截器拦截所有的请求
- 在拦截器中发现了在cookie中的sessionid后,通过该sessionid查询到session,从session中解析出用户的id,通过id查询到用户
- 给每个request都设置一个属性-user
- 拦截器其实就设置在我们的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.