• session和cookie的介绍


    1、将cookie,session之前,还是先说说http协议

    1. http协议是基于TCP/UDP之上的应用层一个标准
    2. 请求,响应的模式。是你必须先请求到一个服务端之后,服务端才会响应到你。他是不会无缘无故响应的
    3. 无状态性,意思是说你本次请求就是一个全新的请求,跟你上一次请求是没有关系的,这个和打10086人工服务一样,就算你前一分钟打了一次,后一分钟继续打一次,客服人员是记不住你是谁的
    4. 无连接性,你向服务端发出一个请求,服务端响应了你,那么便会关闭此次通道。

    2、cookie的由来

    前面说了http是无状态,无连接的,那么我想让服务端记住访问者的一个身份,就是说知道此次访问的是哪一个用户,服务端就可以把那个用户相关的一些数据进行返回回去。所以说这时需要一个标志性的东西,去代表用户的身份,这就是为什么要使用到cookie

    2.1 cookie是什么呢?

    ​ 它是保存在客户端上的键值对 , Key,Value的形式,浏览器会帮你标识是哪个服务端的cookie,下次你向那个服务端发出请求的话,会自动帮你带上cookie

    服务端怎么通过cookie就知道你是哪位用户的?

    ​ 服务端那边可以拿到你所携带的cookie,进行一系列的验证,验证成功了,就知道你是哪位用户了,所以这个cookie值必须要标识着用户,那么问题就是设计标识的cookie

    // 我们可以设置将用户的id账号密码写成一个字典
    user_info = {"id":1,"name":"朱宇","password":"123"}
    // 然后我们可以将这个字典格式的数据进行加密,这里是伪代码
    md5 = dict_to_md5(user_info)
    // 设置成功后返回给浏览器
    
    // 用户下次访问服务端,我们可以那个携带的cookie值,这是我们加密得到的
    md5 = cookie值
    // 再进行某种解密方法,得到加密前的数据,拿出用户的数据,再进行校验
    user_info = md5_to_dict(md5)
    

    通过cookie确实可以标志一个用户,但是也是存在一个安全隐患的。

    2.2 cookie存在的不安全性

    1. 首先cookie它是保存在浏览器上面的,某些人可以通过某种手段就可以拿到你的cookie值,携带这个cookie向服务端发出请求,服务端它判断是哪个用户的依据只有cookie,所以就把拿着你cookie的人当成的你,对你的信息,财产带来严重危害。
    2. 假如你访问的服务端,他给你的返回的明文信息的话,那么你的信息就会呗泄露

    3、session

    3.1 session是什么

    ​ 之前有了cookie他可以标识一个用户,但是cookie 它自身最大的支持4096字节,并且保存在浏览器中,相对来说不是太安全,因此出现可以自身可以支持更大字节的,且保存在服务端,这就是session。

    3.2 session的流程

    1. 首先你向服务端发出一个请求,服务端接收到请求,会根据相关算法得到一个随机字符串,然后将你的信息进行加密,将这个随机字符串和加密之后的信息一同保存在数据库中
    2. 保存之后,生成一个cookie返回,cookie的key值为session_id,这个key值你可以随意指定,value值就是那串随机的字符串。注意这个key值会用到。

    4、注意

    对于安全性比较的话,cookie和session都是差不多的,不存在session就比cookie安全

    为什么这么说:上面说了session的一个流程,他最终返回的一个cookie值,那么攻击者就可以拿着session_id的值向你的服务端发请求,同样可以成功请求到,这样的方式难道不是和cookie不安全性的原因是差不多的吗?不一样的是攻击者获取到的cookie值会不会造成用户的信息泄露,用cookie的话,它是包含着用户一些标识的信息的,用session的话,只能得到你个加密后的字符串。要是用cookie的话,你可以将标识用户的信息进行加密,hash加密等等,这样的无法进行解密了。

    5、在flask中怎么使用cookie,session

    5.1 cookie的设置

    from flask import Flask, Response
    
    app = Flask(__name__)
    
    
    @app.route('/index')
    def index():
        return "index page"
    
    
    @app.route('/set_cookie')
    def set_cookie():
        response = Response('设置cooke')
        response.set_cookie('name', '朱宇')
        return response
    
    
    if __name__ == "__main__":
        app.run(debug=True)
        
    # set_cookie它是Response的一个方法,里面还有其他很多参数,想了解的可以去看看源码,比如设置cookie的过期时间。
    

    5.2 session的设置

    from flask import Flask,  session, Response
    
    app = Flask(__name__)
    
    @app.route('/index')
    def index():
        return "index page"
    
    
    @app.route('/set_session')
    def set_session():
        session['name'] = '朱宇'
        response = Response('设置session')
        return response
    
    
    if __name__ == "__main__":
        app.run(debug=True)
    
    

    启动上面这个flask,并向/set_session发请求,会报错,错误显示为

    它的意思就是没有设置SECRET_KEY的值,为什么一定要设置呢?

    我先解释下:首先sesion的数据都是放在服务端上的吧,django执行makemigrationsmigrate 他会自动帮你做数据库迁移名命,默认在sqlite数据库中生成一些表,其中就有保存session的数据表,这些都是django给我们自带的,而我们flask是没有数据库的,所以这个session保存在哪里呢(前提是不安装其他数据库插件)?他会保存在浏览器,对!和cookie一样,不一样的是,这个是进行加密之后的,所有必须要先设置SECRET_KEY的值,相当于就是盐。

    所以下上面代码的基础上,加上这段代码

    app.config['SECRET_KEY'] = 'zhuchunyudashuaibi'
    # 只可以随便写,只是一个盐
    

    开启项目,继续发请求,下面是结果,返回了一个加密的session

    6、结束

    6.1 再提一点

    关于对一个用户的标识,除了上面的这两种方式,出了一个jwt,可以去了解下

    关于这个方面的内容更新完毕

  • 相关阅读:
    [Codeforces 140C] New Year Snowmen
    [Codeforces Round511C] Enlarge GCD
    [BZOJ 1251] 序列终结者
    [NOIP 2016] 愤怒的小鸟
    [POJ 1860] Currency Exchange
    [ZJOI 2006] 书架
    [NOIP 2010] 引入入城
    [NOI 2014] 起床困难综合征
    用C语言实现中文到unicode码的转换
    strdup与strndup
  • 原文地址:https://www.cnblogs.com/zhuchunyu/p/10466514.html
Copyright © 2020-2023  润新知