1.2 Session概念
什么是Session
Session,目前主流翻译中『会话』二字最为贴切,本文也继续采用『会话』作为session的翻译。
根据维基百科的定义,通信设备(或人机)之间的一次session是指一次半持久性(semi-permanent)的信息交换,也称为一次对话,一次会话,一次会议等。其中半持久性是指一个session会在某个时间点建立连接,又会在某个时间点断开连接。
可总结为一句话:通信设备之间,建立连接进行通信的过程都可以称之为session,其中通信过程中的历史状态信息即为session信息。
通常,对于面向连接的通信而言,其最基本的要求是:一个已建立好连接(established)的session。session的实现可能会作为网络协议或服务本身的一部分。如传输层的TCP socket连接、应用层的HTTP session。
不同层的协议实现session有所不同,TCP实现session采用子进程/多线程机制,当通信一方建立连接或启动session时则创建新进程/线程,即一个session建立一个子进程/线程,每个线程是一个实例,拥有当前连接历史信息以及封装好的变量;相对于把session信息存放在子进程/线程中,HTTP session则做法完全不同,它直接将所有的session信息存储在服务器某存储区(文件、数据库、缓存等)。前者优点是降低了软件实现的复杂性,缺点是消耗系统资源较多,而且session机制会随着系统的重启而中断。后者最大的挑战在于多个服务器组成集群的场景。试想,如果一个客户端访问同一个网站,每次可能被分配到不同的服务器上,那么存储在各服务器上的客户端session信息该如何保持一致性。解决办法则是将session信息存储在集群服务器的共享存储区。
虽然实现如此不同,但是原理却是想通的:建立连接的通信双方保存通信过程中的状态信息,以便下次复用。
HTTP session定义
由上面session定义:通信设备之间,建立连接进行通信的过程都可以称之为session,其中通信过程中的历史状态信息即为session信息。我们可以大致推导出HTTP session的定义:HTTP客户端与HTTP服务器之间建立连接通信的过程即为HTTP session。
在web应用中,一次HTTP session就是关联同一个用户的一系列的客户端与服务器之间的网络请求-响应事务集合。
- HTTP客户端首先服务器发起请求,与服务器某特定端口(通常为80)建立TCP连接。
- HTTP服务器则在该特定端口处监听客户端请求,收到请求后返回状态行(如HTTP/1.1 200 OK)与响应数据。
通信的双方(客户端与服务器)要想下一次继续进行通信时还能记住对方,至少有一方需要保存session中的历史信息,以便将来予以辨认。
如果说cookie的出现是为了保存客户端与服务器之间的状态,那么HTTP session的实现则是为了更好地保存客户端与服务器之间的状态。
这样一来,web应用程序可以很方便地追踪任何一个曾经访问过的用户,以及管理该用户的所有状态信息。
References
1、https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#HTTP_session
2、https://en.wikipedia.org/wiki/Session_(computer_science)
3、https://www.owasp.org/index.php/Session_Management_Cheat_Sheet