知识卡片
HTML客户端会话状态的三种技术,与各自局限
内容
在HTML场景下把会话状态存进客户端,主要有三种技术,各有明显短板。URL参数:把会话数据编码进请求URL,对少量数据(如会话标识号)很方便,很多平台还能自动重写URL附加会话ID;明显的限制是URL长度、以及改变URL会影响浏览器收藏夹,因此不建议在面向普通顾客的系统里这样用。表单隐藏域:用<INPUT type="hidden">把会话状态序列化进不可见的表单域,每次响应写入、每次请求读回;虽然界面上看不到,但打开页面源代码就能看到这些数据,而且如果站点里混杂着一些过时或固定的静态页面,一旦导航到这些页面就会丢失全部会话数据。Cookie:由浏览器自动在客户端和服务器之间传输,用法上和隐藏域类似,但受制于大小限制、只能在同一域名下生效(多域名站点之间不会自动传递),还有部分用户会主动关闭Cookie导致依赖它的站点直接失效——不过随着Cookie的普及,这个顾虑已经越来越小;有些系统会先探测客户端是否支持Cookie,不支持时自动退化为URL重写方案。这三种技术有一个共同的安全提醒:Cookie并不比其他方式更安全,客户端数据同样可能被窥探或篡改;而几乎所有系统都会用客户端方式承载”会话标识号”这一项数据,此时要格外提防恶意用户篡改标识号来窃取别人的会话——常见对策是让会话ID由系统随机生成,或者对一个简单的会话ID额外跑一个散列函数增加猜测难度。
结构图:
flowchart TB
A["HTML客户端会话状态三种技术"]
A --> B["URL参数<br/>适合极小数据(如会话ID)<br/>有长度限制/影响收藏夹"]
A --> C["表单隐藏域<br/>不可见但可查看源码<br/>过时静态页面会丢失会话"]
A --> D["Cookie<br/>大小限制/域名隔离<br/>可能被用户关闭"]
参考来源
- 位置:《企业应用架构模式》第二部分"模式"之"第17章 会话状态模式"之"17.1 客户会话状态"(源文件:_epub-src/OEBPS/Text/000204.html)
- 结论依据:原文说明"URL参数对于小量数据比较容易使用……但改变URL会影响浏览器收藏夹……表单隐藏域是一些不会在Web浏览器中显示出来的表单域……隐藏域只是说在用户界面上不会显示,但可以通过查看页面源代码看到它们……注意有过时或固定页面的混合站点。如果导航到它们,你会丢掉所有的会话数据……Cookie的大小一般是有限制的……Cookie只工作在同一个域名的站点中",直接支撑本卡结构图。
- 原始内容:需要说明的是Cookie并不比别的方式更安全,数据也会被发掘出来……仍要注意会话被盗用,因为会有恶意用户尝试通过改变其会话标识号来窃取别人的会话数据。