浏览器用户身份-Cookie【知识篇】

392 阅读6分钟

什么是Cookie

HTTP cookie,简称cookie,是用户浏览网站时由网络服务器创建并由用户的网页浏览器存放在用户电脑或其他设备上的小文本文件。浏览器存储这样的信息之后,会为每个请求添加Cookie的HTTP请求头。将Cookie发送回服务器。

为什么需要Cookie

我们知道由于HTTP 是“无状态”的,这既是优点也是缺点。优点是服务器没有状态差异,可以很容易地组成集群,让负载均衡把请求转发到任意一台其他机器上。 而缺点就是无法支持需要记录状态的事务操作,比如我们要在京东购物,那需要先登录,然后把喜欢的东西加入购物车,然后结算支付等操作。这一些列的操作都需要服务端知道当前用户的身份才行。才能准确的知道是谁在什么时候买了那些东西。所以在这种情况下就需要Cookie来告知服务器当前我是谁。

Cookie的结构

一个由浏览器保存的Cookie包含以下几个信息:

  1. 名称(key):一个唯一确定cookie的名称。cookie的名称是不区分大小写的,所以myCookie和MyCookie会被认为是同一个cookie,而在实践中最好将cookie的名称看做的区分大小写的,可能某些服务器会这样处理cookie。cookie的名称必须是经过URL编码的
  2. 值(value):存储在cookie中的字符串值。值必须被URL编码
  3. 域(Domain):cookie对于那个域是有效的。所有向该域发送的请求都会包含这个cookie信息
  4. 路径(Path):对于指定域中的具体路径,应该向服务器发送cookie。比如我们可以指定只有从 www.wrox.com/books/中才能访问…
  5. 失效时间(Expries / Max-Age),表示cookie何时应该被删除的时间戳,默认情况下,浏览器会话结束即将删除cookie,不过也可以自己设置删除的时间。如果失效时间是一个以前的时间,那么cookie会被立即删除
  6. 安全标志(Secure):指定之后,cookie只有在使用SSL连接的时候才发送到服务器。比如,cookie信息只能发送给www.wrox.com而http://www.wrox.c…
  7. HttpOnly:要求浏览器不要通过HTTP(和HTTPS)以外的渠道使用cookie。这意味着无法通过客户端脚本语言(尤其是JavaScript)访问cookie,因此无法通过跨站点脚本攻击轻易窃取
  8. SameSite:可以防范“跨站请求伪造”(XSRF)攻击,设置成“SameSite=Strict”可以严格限定 Cookie 不能随着跳转链接跨站发送,而“SameSite=Lax”则略宽松一点,允许 GET/HEAD 等安全方法,但禁止 POST 跨站发送。

Cookie工作工程

服务器生成Cookie

当用户通过浏览器第一次访问服务器的时候,服务器是不知道他的身份的。所以,就要创建一个独特的身份标识数据,格式是“key=value”,然后放进 Set-Cookie 字段里,随着响应报文一同发给浏览器。

浏览器存储Cookie

浏览器收到响应报文,看到里面有 Set-Cookie,知道这是服务器给的身份标识,于是就保存起来,下次再请求的时候就自动把这个值放进 Cookie 字段里发给服务器。

请求携带Cookie

之后的请求中因为里面有了 Cookie 字段,服务器就知道这个用户不是新人,之前来过,就可以拿出 Cookie 里的值,识别出用户的身份,然后提供个性化的服务。

时序图展示

在这里插入图片描述 从上面的书序图种我们也能知道,Cookie是由浏览器负责存储的,而不是服务器。所以Cookie是和浏览器绑定在一起的,也只能在当前的浏览器中才生效。如果换一个浏览器,或者换一台电脑那就无效了。

常见应用

身份识别

Cookie 最基本的一个用途就是身份识别,保存用户的登录信息,实现会话事务。 比如,你用账号和密码登录某电商,登录成功后网站服务器就会发给浏览器一个 Cookie,内容大概是“name=yourid”,这样就成功地把身份标签贴在了你身上。 之后你在网站里随便访问哪件商品的页面,浏览器都会自动把身份 Cookie 发给服务器,所以服务器总会知道你的身份,一方面免去了重复登录的麻烦,另一方面也能够自动记录你的浏览记录和购物下单(在后台数据库或者也用 Cookie),实现了“状态保持”。

广告跟踪

当我们访问某个页面的时候,第三方的广告商(比如Google,Baidu)会在你的浏览器中存储你浏览的信息。

比如在某一个论坛网站的左侧有百度的广告内容(论坛网站中嵌入了百度这个广告商的代码),那这个页面就会访问百度广告商的服务,他就可以在你的浏览器中存储百度广告商的Cookie。当我们切换到其他网站,比如另一个购物网站时,这个网站的某个位置也有百度的广告,那么百度的广告商服务就可以读取之前在论坛中设置的Cookie。进而分析用户行为,进行一些精准的推送。

这种Cookie不是主站存储的,所以也被称为”第三方Cookie“。如果广告商的势力很大,在很多很多页面都有他自己的广告,这样你无论浏览那个页面,他能收到到很多的Cookie来进行数据分析,进而给不同的用户推送不同的内容,基本相当于你看了那么网站它都可以通过Cookie的信息存储和分析了解的非常清楚,那就非常”可怕“了,实现广告的”精准打击“。

Cookie的安全

Cookies和XSS的关系

xss可能偷取Cookies,一般我们可以通过设置http-only属性来防止Cookie被窃取

Cookies和CSRF关系

  1. CSRF利用了用户的Cookies
  2. 攻击者站点无法读写Cookies
  3. 最好能阻止第三方使用Cookies (same-site)

Cookie的安全策略

  1. 签名防篡改(签名依然是明文,不过别人看不懂)
  2. 私有变换(加密)(加密之后是把信息隐藏起来),回头服务端会解密
  3. http-only(防止XSS)
  4. secure(使用https协议)
  5. same-site(防止CSRF)

其他

更多关于安全的信息可以参考之前的文章 浏览器页面安全-XSS【安全篇】 浏览器页面安全-CORS【安全篇】 浏览器页面安全-同源策略【安全篇】

参考文档

维基百科-Cookie JavaScript-高级程序设计 浏览器页面安全-XSS【安全篇】 浏览器页面安全-CORS【安全篇】 浏览器页面安全-同源策略【安全篇】