会话就是用来存储特定用户在端侧和服务侧交互时所需的属性和配置信息的对象。会话的英文名叫做session。
http是无状态的,客户端访问服务器时,服务器是不知道这个请求是否来自于同一个客户端。这样就会来带另一个问题,每当客户端发起一个请求的时候,都需要带着所有的属性和配置信息(比如登录信息、授权信息等)。这样客户端用起来就太麻烦了。因此,作为人机交互,服务端是希望能区别出不同用户的不同请求的。对于同一个用户的请求,不需要每次都把所有信息带在请求里。因此,需要服务器和客户端之间有一个凭证,根据这个凭证,服务器可以区别出来每个http请求分别来自哪个用户。这样,就有了session。
会话的生命周期体现在如下四个阶段:
会话生成:客户端通过服务端认证以后,服务端给客户端创建一个会话对象,来存储客户端的信息。同时,服务端会创建一个随机的会话标识 ,来表示唯一的一个客户端。
会话维持: 在会话生成后,服务端使用会话标识来维护客户端和服务端会话对象之间的关系。
会话认证: 客户端发起请求时,需要携带会话标识。服务端会根据会话标识来判断会话是否已经通过认证,并且客户端是否有权限操作。
会话销毁:客户端主动断开连接或者客户端长时间无活动的情况下,服务端完成删除会话对象,释放会话标识等清理动作。
会话被窃取:会话标识泄露后,在另一个客户端登录,但是服务端不知道
解决方法:
a. 禁止同一个用户同时建立多个会话
b. 利用策略来限制可被认证的用户客户端ip、时间段等
会话标识被破解:黑客通过反复尝试,获取正确的会话标识,但是服务器不知道
解决方法:
a. 限制会话标识长度,业界当前认为不少于24 bytes为安全长度
b. 会话标识采用安全随机数算法生成
c. 会话标识命名不带有其他特殊意义,避免暴露额外信息
会话被劫持: 黑客通过拦截网络请求,获取正确的会话标识,但是服务器不知道
解决方法:
a. 会话标识在认证通过后,进行变更,避免会话固定后被劫持访问
b. 会话标识采用安全通道传输,比如HTTPS, IPSec, SSL通道等
c. 会话标识设置很短的有效期,甚至使用一次后立即失效
d. 会话标识不应该放在url或者隐藏域中,应该放在cookie中,并设置httponly、secure、samesite等属性
e. 会话标识在cookie中持久化存储时,需要安全加密
原文:https://www.cnblogs.com/supertc/p/13966263.html