Cookie与会话:维护应用状态
Cookie
HTTP服务器是无状态的,然而一些Web站点通常希望能够识别用户,从而记住用户信息或限制用户访问。目前Cookie广泛用于记录用户登录信息,这样下次访问时可以不再输入用户名和密码了。当然这种方便也存在用户信息泄密的问题,尤其在多个用户公用一台电脑时很容易出现这样的情况。
例如用户首次访问Amazon,HTTP响应报文中会包含Set-Cookie识别码,浏览器会将识别码添加到所管理的文件中。当用户继续浏览Amazon时,每一个HTTP请求浏览器都会从cookie文件中查询该网站的识别码,并添加到HTTP请求报文中。Amazon也可以通过cookie来维护用户希望购买的商品信息,并推荐个性化产品。
| 交换 | 浏览器 | 服务器 |
|---|---|---|
| 首次Amazon请求 | eBay: 8734 | Set-Cookie: 1678 |
| 存储识别码 | eBay: 8734; Amazon: 1678 | ID 1678 → database |
| 后续Amazon请求 | Cookie: 1678 | 查询1678 |
知识测验
Cookie是传递载体,会话是应用状态
响应的Set-Cookie通知浏览器存储某个名称与值;后续请求中的Cookie携带适用于请求范围的值。浏览器会按域、路径、到期时间等规则决定是否发送,不能把所有站点的Cookie都发送给当前站点。
会话(session)常把购物车、登录用户等状态保存于服务器,把一个难以猜测的会话标识符放入Cookie。客户端带回标识符后,服务器查找对应状态。它不同于把密码直接写进Cookie,也不同于信任客户端自己声明“我是管理员”。会话可以过期或被撤销,客户端仍持有旧Cookie不代表授权继续有效。
看Cookie如何在浏览器与服务器之间维持状态
解锁完整互动实验、进阶解析与精选参考答案。
知识测验
范围与安全属性
Secure限制Cookie只通过安全连接发送;HttpOnly限制脚本访问它,但不阻止浏览器在适用请求中发送它。SameSite限制某些跨站请求中的发送行为,有助于降低跨站请求伪造风险,但不等于完整的访问控制。
服务端仍必须验证会话和授权。登录后通常需要更换会话标识符;退出时应使对应服务端状态失效,不能只改变页面上显示的用户名。共享电脑上还需避免把他人的有效会话留给下一位使用者。
用Python检查Cookie属性
用Python的http.cookies.SimpleCookie解析合成Set-Cookie值session=1678; Path=/; HttpOnly; Secure; SameSite=Lax。分别打印标识符、HttpOnly与Secure属性,预期三行为1678、True、True。解释两个属性,并说明为何不能代替服务端会话验证。不使用真实会话令牌。