前端必备HTTP技能之Session技术详解

在计算机科学中,特别是网络中,session作为一种半永久的交互式的信息交换,也被称为两个或多个通信设备之间或者电脑和用户之间的一次对话,会话或者会议。session在某个时间点被创建,然后在之后的某个时间点被撤销。每个被创建的会话session在每个方向上可能包含不止一条消息。通常来说,当然也不总是,session是有状态的,这就意味着为了能够通讯,会话中的至少有一个是需要保存session历史信息,和无状态通讯相反,无状态通讯包含的是单独的请求和响应。

执行一个面向连接的通信,创建一个session是基本要求。在无连接通信模式中,session也是传输的基本步骤。然而任何单向传输都不能定义session。

在应用层、会话层或OSI模型的传输层中,通信传输可以作为协议和服务的一部分实现。

  • 应用层示例:
    • HTTP session,允许关联独立用户信息
    • telnet远程登录session
  • 会话层示例:
    • 基于网络电话的会话初始化协议(SIP)
  • 传输层示例:
    • TCP session,和TCP虚拟电路,TCP链接,建立TCP socket类似

在没有实现正式会话层(例如:UDP)的传输协议情况下,或者在应用层的会话(例如:HTTP)通常是非常短暂的情况下,sessions是被更高层次的程序利用交换数据中的方法维护的。例如,浏览器和远程主机之间的一个http交换可能包含一个的HTTP cookie,这个cookie可以用来识别状态,例如通过独立的sessionID,用户的偏好或者授权级别信息。

HTTP/1.0协议被认为在一个Web/HTTP会话期间只允许一个请求和响应。HTTP/1.1版本协议通过完成公共网关接口改良了这种限制,更容易维护Web会话,支持HTTP cookie和文件上传。

大部分客户端-服务端sessions是由传输层维护——一个会话一个连接。然而,一个Web/HTTP会话的每个事物层都会创建一个单独的连接。在各个阶段持续维护会话需要一个会话ID。会话ID嵌入再动态网页的a标签和form标签的链接中,这样可以传回公共网关接口。然后公共网关接口会使用会话ID确保不同事务阶段会话的连续性。每个阶段一个链接的一个好处就是它可以工作在低带宽环境下。

软件实现


TCP会话在软件中通常是利用子进程或者多线程来实现,当计算机建立或者链接一个会话,会创建一个新的进程或者线程。HTTP会话通常不是通过每个会话用一个线程的方式实现,而是通过保存有每个session状态信息的数据库来实现。多进程或者线程的优点是软件不是很复杂,因为每个线程都是一个具有自身历史和封装的实例。缺点就是对系统资源开销大,如果系统重启会中断会话。

当客户端可以连接服务器集群中的任意服务器时,当服务器必须维护会话状态时,会遇到一个特殊的问题。客户端必须被重定向到会话期间的同一台服务器,或者服务器必须通过共享文件系统或数据库传输服务端session。否则客户端可能被重连到一台不一样的服务器而不是它建立会话的那台,这将导致一个问题就是新的服务器没有权限访问之前机器中的状态数据。

服务端web会话


在服务端处理session很方便,也很有效,但是如果是在负载均衡或者高可用系统中,session处理就变得很困难,在一些没有存储的嵌入式系统中,session是完全不可用的。负载均衡中碰到的问题可以通过共享存储或者通过对集群中的每个客户机和单个服务器之间应用强制对等来解决,尽管这样会影响系统效率和负载分配。

在没有大容量存储的系统中使用服务端会话的一种方法是保留出一部分内存来存储会话数据。这种方法适用于有有限数量客户端的服务器(例如:不频繁的路由或者访问节点,不允许同一时间访问多于一个客户端)。

客户端web会话


客户端使用cookies和加密技术维护状态,不需要在服务端存储大量的数据。在呈现动态网页时,服务器会以cookie的形式发送当前状态信息到客户端(web浏览器)。客户端在内存中或者硬盘上保存cookie。每个成功的请求,客户端都会把cookie发送回服务端,服务端利用这个数据来“记住”特定客户端的应用状态,然后发送合适的响应。

这种机制在某些情况下可以很好的工作,但是数据存储在客户端容易受到用户或者有客户端访问权限的软件的篡改。使用客户端会话,保密性和完整性是必需的,以下几点是必须要保证的:

  1. 保密性:只有服务器才能解析会话数据。
  2. 完整性:只有服务器才能操作会话数据(意外或者恶意)。
  3. 真实性:只有服务器才能发起有效会话。

为了做到这一点,服务器在给客户端发送数据之前需要对会话数据进行加密,通过加密的方式来阻止任何地方对信息的修改。

当cookie很小时,在每个请求中来回传输状态是可行的。其实客户端会话会为了每次web请求需要的额外的带宽占用服务端磁盘空间。而且,web浏览器限制了web站点的cookie的数量和大小。为了提高效率,允许更多的会话数据,服务端可能会在创建cookie之前压缩数据,然后在客户端返回cookie的时候再解压缩。

HTTP会话token


会话token是生成的唯一标识符,从服务端发送给客户端标识当前交互会话。客户端通常会把这个token作为一个http cookie来存储和发送,或者作为GET,POST请求中的一个参数来发送。使用会话token的原因是客户端只需要处理这个唯一标识符,所有的会话数据都存储在服务端(通常在数据库中,客户端没有直接访问权限)关联到这个唯一标识符。一些程序语言会为HTTP cookie命名,例如:SESSIONID(JSP),PHPSESSID(PHP),CGISESSID(CGI),ASPSESSIONID(ASP)。

会话管理


在人机交互时,会话管理就是一个追踪用户和计算机系统交互会话活动的过程。

桌面环境中典型的会话管理任务,包括追踪打开了那些应用,每个应用打开了那个文档,这样,当用户注销并在以后登录时,可以恢复相同的状态。对于一个站点来说,会话管理可能牵扯到如果会话过期,需要用户重新登录(例如,过了一个特定时间限制,在此期间没有用户活动)。会话管理也被用来通过HTTP请求在服务端存储信息。

桌面会话管理

桌面会话管理是一段可以保存恢复桌面会话的程序。桌面会话是当前运行的所有窗口和它们当前的内容。基于Linux系统的会话管理由X session manager提供。在window系统上,会话管理由会话管理系统(smss.exe)提供;用户会话功能可以用第三方应用扩展,例如twinsplay。

浏览器会话管理

浏览器中的会话管理特别有用,用户可以保存打开的所有的页面和设置,然后可以在以后的时间恢复。为了帮助从系统或应用程序崩溃恢复,页面和设置也可以在下一次运行时恢复。Chrome,Firefox,IE,Opera都支持会话管理。会话管理通常通过cookie应用来管理。

web服务器会话管理

HTTP是无状态的:对每个新的HTTP GET或者POST请求,客户端浏览器都会创建一个新的TCP网络连接到web服务器。因此,web服务器不能长期依赖已建立的TCP网络连接在每个HTTP GET请求或者POST请求操作中。会话操作是web开发者使用的一种技术使无状态的http协议支持会话状态。例如,一旦用户通过web服务器认证,用户下次的http请求(get或者post)的时候,web服务器不应该让用户再次输入帐户和密码。

在多个web服务端必须共享会话状态的情况下(集群环境中的典型问题),会话信息必须在不同的运行服务端软件的集群节点之间共享。在集群节点中共享会话状态的方法包括:对成员节点进行多播会话信息(这个技术的例子参看JGroups);使用分布式共享内存内存虚拟化与伙伴节点共享会话信息;使用网络套接字在节点之间共享会话信息;将会话信息存储在一个共享的文件系统上,例如分布式文件系统全局文件系统;将会话信息存储在集群之外的数据库中。

短信(SMS)会话管理

像无状态的HTTP协议一样,SMS也是无状态的。1999年随着SMS在竞争对手的网络中互操作,短信开始成为一种无处不在的全球交流形式,不同的企业开始对是否可以使用SMS通道进行商业目的感兴趣。最初的服务不需要会话管理,因为它们只是单向通信(例如,在2000年,第一个移动新闻服务是通过芬兰的SMS发送的)。如今,这些应用被称为A2P消息不同于P2P消息。交互式企业应用程序的开发需要会话管理,但是因为SMS是一个无状态的协议,正如GSM标准所定义的那样,早期实现通过让终端用户输入命令和服务标识符来控制客户端。

做好前端开发必须对HTTP的相关知识有所了解,所以我创建了一个专题前端必备HTTP技能专门收集前端相关的HTTP知识,欢迎关注,投稿。


PS:本文翻译自维基百科,原文地址https://en.wikipedia.org/wiki/Session_(computer_science)

推荐阅读更多精彩内容