Flask 中的session 和 cookie

前言

本文是对网上一些cookie、session和token搜寻到的资料的一些接介绍和总结,对Cookie和Session有一个更深入的了解,并对自己的开发工作中灵活运用带来启示。


什么是Cookie?

  Cookie 在计算机中是个存储在浏览器目录中的文本文件,当浏览器运行时,存储在 RAM 中发挥作用 (此种 Cookies 称作 Session Cookies),一旦用户从该网站或服务器退出,Cookie 可存储在用户本地的硬盘上 (此种 Cookies 称作 Persistent Cookies)。

 Cookie 起源:1993 年,网景公司雇员 Lou Montulli 为了让用户在访问某网站时,进一步提高访问速度,同时也为了进一步实现个人化网络,发明了今天广泛使用的 Cookie。(所以,适当的偷懒也会促进人类计算机发展史的一小步~)

 Cookie时效性:目前有些 Cookie 是临时的,有些则是持续的。临时的 Cookie 只在浏览器上保存一段规定的时间,一旦超过规定的时间,该 Cookie 就会被系统清除。

 Cookie使用限制:Cookie 必须在 HTML 文件的内容输出之前设置;不同的浏览器 (Netscape Navigator、Internet Explorer) 对 Cookie 的处理不一致,使用时一定要考虑;客户端用户如果设置禁止 Cookie,则 Cookie 不能建立。 并且在客户端,一个浏览器能创建的 Cookie 数量最多为 300 个,并且每个不能超过 4KB,每个 Web 站点能设置的 Cookie 总数不能超过 20 个。

 cookie是保存在本地终端的数据。cookie由服务器生成,发送给浏览器,浏览器把cookie以kv形式保存到某个目录下的文本文件内,下一次请求同一网站时会把该cookie发送给服务器。由于cookie是存在客户端上的,所以浏览器加入了一些限制确保cookie不会被恶意使用,同时不会占据太多磁盘空间,所以每个域的cookie数量是有限的。

本质:保存在浏览器上的键值对
用途:标识当前用户信息
cookie是服务端设置的,浏览器可以选择禁用

Cookie 和 Session

 众所周知,HTTP 是一个无状态协议,所以客户端每次发出请求时,下一次请求无法得知上一次请求所包含的状态数据,如何能把一个用户的状态数据关联起来呢?
 比如在某宝宝的某个页面中,你进行了登陆操作。当你跳转到商品页时,服务端如何知道你是已经登陆的状态?

什么是Seesion?

 Cookie 虽然很方便,但是使用 Cookie 有一个很大的弊端,Cookie 中的所有数据在客户端就可以被修改,数据非常容易被伪造,那么一些重要的数据就不能存放在 Cookie 中了,而且如果 Cookie 中数据字段太多会影响传输效率。为了解决这些问题,就产生了 Session,Session 中的数据是保留在服务器端的。

 总之:Session是对于服务端来说的,客户端是没有Session一说的。Session是服务器在和客户端建立连接时添加客户端连接标志,最终会在服务器软件(Apache、Tomcat、JBoss)转化为一个临时Cookie发送给给客户端,当客户端第一请求时服务器会检查是否携带了这个Session(临时Cookie),如果没有则会添加Session,如果有就拿出这个Session来做相关操作。

 Session 的运作通过一个session_id来进行。session_id通常是存放在客户端的 Cookie 中,比如在 express 中(说的是Nodejs),默认是connect.sid这个字段,当请求到来时,服务端检查 Cookie 中保存的 session_id 并通过这个 session_id 与服务器端的 Session data 关联起来,进行数据的保存和修改。

 这意思就是说,当你浏览一个网页时,服务端随机产生一个 1024 比特长的字符串,然后存在你 Cookie 中的connect.sid字段中。当你下次访问时,Cookie 会带有这个字符串,然后浏览器就知道你是上次访问过的某某某,然后从服务器的存储中取出上次记录在你身上的数据。由于字符串是随机产生的,而且位数足够多,所以也不担心有人能够伪造。伪造成功的概率比坐在家里编程时被邻居家的狗突然闯入并咬死的几率还低。

Session 可以存放在:

1)内存;

2)Cookie本身;

3)redis 或 memcached 等缓存中;

4)数据库中。

本质:保存在服务器上的键值对
用途:记录当前用户信息

什么是token?

  token的意思是“令牌”,是用户身份的验证方式,最简单的token组成:uid(用户唯一的身份标识)、time(当前时间的时间戳)、sign(签名,由token的前几位+盐以哈希算法压缩成一定长的十六进制字符串,可以防止恶意第三方拼接token请求服务器)。还可以把不变的参数也放进token,避免多次查库
通过加密算法产生token给客户端(token只在客户端存)
通过解密算法验证token(安全认证)

  flask中会把session[‘name’]=value 的值转换成token丢进cookie中,再次请求的时候会携带上cookie进行访问,django中的jwt不会。

Cookie和session的区别

 1、cookie数据存放在客户的浏览器上,session数据放在服务器上。

 2、cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,考虑到安全应当使用session。

 3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用COOKIE。

 4、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。

 5、所以个人建议:
  将登陆信息等重要信息存放为SESSION
  其他信息如果需要保留,可以放在COOKIE中

token和session的区别

 session 和 oauth token并不矛盾,作为身份认证 token安全性比session好,因为每个请求都有签名还能防止监听以及重放攻击,而session就必须靠链路层来保障通讯安全了。如上所说,如果你需要实现有状态的会话,仍然可以增加session来在服务器端保存一些状态

  Session 是一种HTTP存储机制,目的是为无状态的HTTP提供的持久机制。所谓Session 认证只是简单的把User 信息存储到Session 里,因为SID 的不可预测性,暂且认为是安全的。这是一种认证手段。 而Token ,如果指的是OAuth Token 或类似的机制的话,提供的是 认证 和 授权 ,认证是针对用户,授权是针对App 。其目的是让 某App有权利访问 某用户 的信息。这里的 Token是唯一的。不可以转移到其它 App上,也不可以转到其它 用户 上。 转过来说Session 。Session只提供一种简单的认证,即有此 SID,即认为有此 User的全部权利。是需要严格保密的,这个数据应该只保存在站方,不应该共享给其它网站或者第三方App。 所以简单来说,如果你的用户数据可能需要和第三方共享,或者允许第三方调用 API 接口,用 Token 。如果永远只是自己的网站,自己的 App,用什么就无所谓了。

  token就是令牌,比如你授权(登录)一个程序时,他就是个依据,判断你是否已经授权该软件;cookie就是写在客户端的一个txt文件,里面包括你登录信息之类的,这样你下次在登录某个网站,就会自动调用cookie自动登录用户名;session和cookie差不多,只是session是写在服务器端的文件,也需要在客户端写入cookie文件,但是文件里是你的浏览器编号.Session的状态是存储在服务器端,客户端只有session id;而Token的状态是存储在客户端。

Flask中使用Cookie

设置Cookie

from flask import Flask,Response
app = Flask(__name__)

@app.route('/login')
def index():
    response = Response("set cookie")
    response.set_cookie('username','abc')
    return response

if __name__ == '__main__':
    app.run()
    ```

获取Cookie

username= request.cookies.get('username')#推荐用这种方法,如果用 [ ] 取值的话,key不存在的时候会报错

删除Cookie

response.delete_cookie('username')

Flask中使用session

flask的session是通过加密之后放到了cookie中。所以有加密就有密钥用于解密,所以,只要用到了flask的session模块就一定要配置“SECRET_KEY”这个全局宏。一般设置为24位的字符。

from flask import Flask,Response,session
app = Flask(__name__)

app.config['SECRET_KEY'] = ‘asdadasd’
#或者
app.secret_key = 'why would I tell you my secret key?'
#key值可以使用随机数,或者自定义

@app.route('/index')
def index():
    session['username'] = 'sfencs'
    return 'session'
if __name__ == '__main__':
    app.run()

获取session

username = session.get('username')

删除session

  session.pop('username',None) 
  #或者 
  session['username'] = False
 session.clear()          #删除所有session

设置session过期时间
如果没有指定session的过期时间,那么默认是浏览器关闭后就自动结束。session.permanent = True在flask下则可以将有效期延长至一个月。下面有方法可以配置具体多少天的有效期。
 如果没有指定session的过期时间,那么默认是浏览器关闭后就自动结束
 如果设置了session的permanent属性为True,那么过期时间是31天。

 # 设置session
 @app.route('/')
 def set():
     session['username'] = 'liefyuan'
     session.permanent = True # 长期有效,一个月的时间有效
     return 'success'

 可以通过给app.config设置PERMANENT_SESSION_LIFETIME来更改过期时间,这个值的数据类型是datetime.timedelay类型

#encoding: utf-8
from flask import Flask,session
from datetime import timedelta
import os 
app = Flask(__name__)
app.config['SECRET_KEY'] = os.urandom(24)
app.config['PERMANENT_SESSION_LIFETIME'] = timedelta(days=7) # 配置7天有效

参考:https://blog.csdn.net/qq_36019490/article/details/89459656
https://www.jianshu.com/p/3cdd6c5b3f48
https://www.cnblogs.com/wxinyu/p/9154178.html
https://blog.51cto.com/douya/2151255

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值