04.Session和Cookie
- 1.Session
- 2.Cookie
- 3.详细对比
- 4.Cookie属性结构
- 5.一些误区
Session和Cookie是Web开发中用于用户状态管理的两种常见技术。理解它们的区别对于开发安全的Web应用至关重要。
1.Session
Session代表服务器与客户端的一次会话过程。服务器端存储了Session对象,该对象存储了特定用户会话所需的属性及配置信息。当用户在应用程序的Web页之间跳转时,存储在Session对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当客户端关闭会话,或者Session超时失效时会话结束
2.Cookie
Cookie是HTTP协议的一部分,是服务器发送到用户浏览器并保存在本地的一小块数据。Cookie的主要用途是告知服务端两个请求是否来自同一浏览器,如保持用户的登录状态。Cookie还可以用于个性化设置和浏览器行为跟踪
3.详细对比
- 存储位置
Cookie:保存在客户端(浏览器)。
Session:保存在服务器端。 - 数据类型
Cookie:通常只能保存ASCII编码的字符串。
Session:可以存储任意数据类型。 - 有效期
Cookie:可以设置为长时间保持,也可以设置为短期内有效,如会话级别或持久性。
Session:一般时效较短,客户端关闭或Session超时都会失效。 - 隐私策略
Cookie:存储在客户端,较容易被窃取或篡改,需要注意安全风险。
Session:存储在服务端,相对更安全。 - 存储大小
Cookie:单个Cookie保存的数据不能超过4K,且受到浏览器的限制。
Session:存储数据远超Cookie,取决于服务器端的存储能力。 - 应用场景
Cookie:适用于不需要大量数据存储的场景,如简单的登录状态保持、购物车等。
Session:适用于需要大量数据存储的场景,以及对安全性有较高要求的场景
Session和Cookie虽然都能用于用户状态管理,但它们各有侧重点和优势。Session侧重于在服务器端存储用户数据,而Cookie则侧重于在客户端保持状态。在使用时,开发者需要根据实际的应用场景和安全需求选择合适的机制。
4.Cookie属性结构
接下来,我们来看看 Cookies 都有哪些内容。这里以百度为例,在浏览器开发者工具中打开 Application 选项卡,然后在左侧会有一个 Storage 部分,最后一项即为 Cookies,将其点开,如图所示
- Name,即该 Cookie 的名称。Cookie 一旦创建,名称便不可更改。
- Value,即该 Cookie 的值。如果值为 Unicode 字符,需要为字符编码。如果值为二进制数据,则需要使用 BASE64 编码。
- Domain,即可以访问该 Cookie 的域名。例如如果设置为 .baidu.com,则所有以 baidu.com 结尾的域名都可以访问该 Cookie。
- Path,即该 Cookie 的使用路径。如果设置为 /path/,则只有路径为 /path/ 的页面可以访问该 Cookie。如果设置为 /,则本域名下的所有页面都可以访问该 Cookie。
- Max-Age,即该 Cookie 失效的时间,单位为秒,常和 Expires 一起使用,通过它可以计算出其有效时间。Max-Age 如果为正数,则该 Cookie 在 Max-Age 秒之后失效。如果为负数,则关闭浏览器时 Cookie 即失效,浏览器也不会以任何形式保存该 Cookie。
- Size ,即此 Cookie 的大小。
- HTTP ,即 Cookie 的 httponly 属性。若此属性为 true,则只有在 HTTP Headers 中会带有此 Cookie 的信息,而不能通过 document.cookie 来访问此 Cookie。
- Secure,即该 Cookie 是否仅被使用安全协议传输。安全协议有 HTTPS 和 SSL 等,在网络上传输数据之前先将数据加密。其默认值为 false。
5.一些误区
在谈论 Session 机制的时候,常常听到这样一种误解 ——“只要关闭浏览器,Session 就消失了”。可以想象一下会员卡的例子,除非顾客主动对店家提出销卡,否则店家绝对不会轻易删除顾客的资料。对 Session 来说,也一样,除非程序通知服务器删除一个 Session,否则服务器会一直保留。比如,程序一般都是在我们做注销操作时才去删除 Session。
但是当我们关闭浏览器时,浏览器不会主动在关闭之前通知服务器它将要关闭,所以服务器根本不会有机会知道浏览器已经关闭。之所以会有这种错觉,是因为大部分网站都使用会话 Cookie 来保存 Session ID 信息,而关闭浏览器后 Cookies 就消失了,再次连接服务器时,也就无法找到原来的 Session 了。如果服务器设置的 Cookies 保存到硬盘上,或者使用某种手段改写浏览器发出的 HTTP 请求头,把原来的 Cookies 发送给服务器,则再次打开浏览器,仍然能够找到原来的 Session ID,依旧还是可以保持登录状态的。
而且恰恰是由于关闭浏览器不会导致 Session 被删除,这就需要服务器为 Session 设置一个失效时间,当距离客户端上一次使用 Session 的时间超过这个失效时间时,服务器就可以认为客户端已经停止了活动,才会把 Session 删除以节省存储空间。