zoukankan      html  css  js  c++  java
  • cookie 和session、三种保持登陆会话的方式

      session和cookie都是会话跟踪技术。cookie通过在客户端记录信息确定用户身份,而session通过在服务器端记录信息确定用户身份。但session的实现依赖于cookie,sessionID(session的唯一标识)需要存放在客户端。

    cookie和session的区别:

    • cookie数据存放在客户的浏览器上,session数据存放在服务器上。
    • cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗,考虑到安全应当使用session
    • session会在一定时间内保存在服务器上。当访问增多,会比较占用服务器的性能,考虑到减轻服务器性能方面,应当使用cookie
    • 单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie

     cookies与session能单独用吗?

    • session采用的是在服务器端保持状态的方案,而cookie采用的是在客户端保持状态的方案。
    • 但是禁用cookie就不能得到session。因为session是用sessionID来确定当前会话所对应的服务器session,而sessionID是通过cookie来传递的,禁用cookie相当于禁用sessionID,也就得不到session了。

     为什么session比cookie要安全?

    • session的键值都是存储在服务器端,返回给用户的仅仅是sessionID,具体的session值对于用户来说是完全未知的。
    • cookie的键值是会返回给客户端,对于用户来说是完全可知的。那么用户就可以根据cookie的键值来反向推测服务器对于cookie的使用逻辑,进而进行cookie的伪造。

     

    状态记录的实现机制其实本质上很简单。

    • 请求A:需要记录状态的操作。一般来说,服务器就会返回特定的状态记录字段,根据技术不同,常见的有session、cookie、token、crsf、表单字段等等。
    • 请求B:依赖于请求A的操作,需要用到状态字段。一般就酌情添加cookie管理器、做关联等操作。

     三种会话保持的方式

    (一)session机制保持会话

    存在的问题

    •  高并发下,会占用服务器大量内存。
    • 分布式(一个业务分成几个子业务,部署在多个服务器)或者集群(一个业务部署在多个服务器)时,session不能共享

    解决方案

    •  高并发时可以将session存储到redis,如果用户长时间没有访问,将session存储到redis,就减少了服务器的压力。
    • 分布式或者集群时,先通过redis来判断用户状态也可以实现session共享。

    (二)cookie机制保持会话

     使用方法

    •  登录验证后,创建登录凭证(比如:用户id+登录时间+过期时间),将登录凭证进行加密(为了避免暴露信息),加密码后写到浏览器的cookie,以后,每次请求都发送cookie,服务器根据对应的解密算法对其进行验证(或者将加密过的cookie内容存储到数据库,请求服务器时,服务器在数据库进行查找)。

    存在的问题

    •  每次访问都提交cookie,增加请求量。
    • 其他访问可能需要cookie(比如购物车的信息存放在cookie),浏览器对每个域存储的cookie的大小有限制,那么需要控制加密后的凭证。
    • 一般而言,sessionID会以类似于cookie的形式返回给客户端。sessionID是服务器端用来识别、读取服务器上所存储的session值的一个标志字段。
    • session和cookie都是有其生命周期的。浏览器在向服务器发送请求时,会自动将客户端所保留的、存活的cookie封装在请求头cookie中向服务器发送。
    • 对于cookie而言,它的生命周期有两个因素决定:
      • cookie自身的生命周期,由服务器生成该cookie时指定。
      • 客户端是否保留cookie。
      • PS:客户端是否保留cookie仅仅是对客户端自身有效,对于封包工具(各种接口、性能测试工具)是无效的。
    • 对于session而言,它的生命周期也和两个因素有关:session和cookie都是有其作用域的。session和cookie都是有其作用域的。
      • 服务器端对于session的存储周期的设置。
      • 客户端进程是否关闭。
      • PS:客户端进程关闭,仅对客户端自身有效,对于封包工具(各种接口、性能测试工具)是无效的。
    • session和cookie都是有其作用域的。

    (三)token机制保持会话

    使用方法

    •  cookie和session依赖于浏览器,如果客户端不是浏览器,那么需要手动添加token(和cookie类似,也就是登录凭证),将token添加到http header或者作为参数添加到url。

    存在的问题

    •  每次访问时手动添加token。
    • 和cookie的方式一样增加了请求量。

    总结

    •  不同的方式适合不同的应用场景,视情况使用。

    相同点

    •  所有的方式目的都是为了验证用户状态。
    • 都需要在客户端存储凭证。

    不同点

    •  第一种是通过空间换时间,消耗内存存储session对象,但是判断用户状态不用复杂的逻辑。
    • 第二种第三种用时间换空间,在服务器端逻辑处理进行判断用户状态。

    转载:https://blog.csdn.net/qq_34170700/article/details/107877570

  • 相关阅读:
    JS继承
    Liunx 常用命令2
    团队作业(四)
    OpenEuler树莓派基础实验(无树莓派)
    thread同步测试
    团队作业(三)
    实验二测试
    浅谈JWT。
    monolog使用 brady
    Blazor Server获取Token访问外部Web Api
  • 原文地址:https://www.cnblogs.com/String-song/p/14548218.html
Copyright © 2011-2022 走看看