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机制保持会话

把当前登录用户保存到session里 java session保存登录信息_客户端

 

 使用方法

  • 用户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对象,但是判断用户状态不用复杂的逻辑。
  • 第二种第三种用时间换空间,在服务器端逻辑处理进行判断用户状态。