首页 > 技术文章 > http协议:四 (5)http的cookie机制

xrxc 2021-08-30 09:05 原文

 

 

1、Cookie 是服务器委托浏览器存储的一些数据,让服务器有了“记忆能力”;

2、响应报文使用 Set-Cookie 字段发送“key=value”形式的 Cookie 值;

3、请求报文里用 Cookie 字段发送多个 Cookie 值;

4、为了保护 Cookie,还要给它设置有效期、作用域等属性,常用的有 Max-Age、Expires、Domain、Path、HttpOnly(此 Cookie 只能通过浏览器 HTTP 协议传输,禁止其他方式访问,浏览器的 JS 引擎就会禁用 document.cookie 等一切相关的 API,脚本攻击也就无从谈起了。) 等;

SameSite”可以防范“跨站请求伪造”(XSRF)攻击,设置成“SameSite=Strict”可以严格限定 Cookie 不能随着跳转链接跨站发送,而“SameSite=Lax”则略宽松一点,允许 GET/HEAD 等安全方法,但禁止 POST 跨站发送。

Secure”,表示这个 Cookie 仅能用 HTTPS 协议加密传输,明文的 HTTP 协议会禁止发送。但 Cookie 本身不是加密的,浏览器里还是以明文的形式存在

5、Cookie 最基本的用途是身份识别,实现有状态的会话事务。

6、广告追踪:网站的页面里会嵌入很多广告代码,里面就会访问广告商,在浏览器里存储广告商的cookie 你换到其他网站,上面也有这个广告商的广告代码,因为都是一个广告商网站,自然就能够读取之前设置的cookie,也就获得了你的信息。

7、Secure”,表示这个 Cookie 仅能用 HTTPS 协议加密传输,明文的 HTTP 协议会禁止发送。

 

问题

1、如果 Cookie 的 Max-Age 属性设置为 0,会有什么效果呢?

回复:

如果max-age <=0,统一按0算,max-age=0,就是立即过期,不允许缓存,只能在浏览器运行期间有效。

 

2、Cookie 的好处已经很清楚了,你觉得它有什么缺点呢?

回复:

(1) 不安全。如果被中间人获取到 Cookie,完全将它作为用户凭证冒充用户。解决方案是使用 https 进行加密。
(2)有数量和大小限制。另外 Cookie 太大也不好,传输的数据会变大。
(3)客户端可能不会保存 Cookie。比如用 telnet 收发数据,用户禁用浏览器 Cookie 保存功能的情况。

 

补充

01 Cookie这个词来源于计算机编程里的术语"Magic Cookie”,意思是不透明的数据,并不是“小甜饼”的含义(虽然字面意如此)。

02早期Cookie直接就是磁盘上的一些小文本文件,现在基本上都是以数据库记录的形式存放的(通常使用的是 Sqlite)。浏览器对Cookie的数量和大小也都有限制不允许无限存储,一般总大小不能超过4K。

03 如果不指定Expires或Mlax一Age属性,那么Cookie仅在浏览器运行时有效,一旦浏览器关闭就会失效,这被称为会话Cookie (sessioncookie)或内存Cookie (iin-memory cookie) ,在Chrome 里过期时间会显示为“Session”或“N/A o

04历史上还有“Set-Cookie2”和“Cookie2”这样的字段,但现在已经不再使用。

 

Cookie 主要用于以下三个方面:

  • 会话状态管理(如用户登录状态、购物车、游戏分数或其它需要记录的信息)
  • 个性化设置(如用户自定义设置、主题等)
  • 浏览器行为跟踪(如跟踪分析用户行为等)

XSS攻击是指第三方的JS代码读取到浏览器A网站的Cookie然后冒充我去访问A网站,JS 脚本里可以用 document.cookie 来读写 Cookie 数据

CSRF:SameSite Cookie:允许服务器要求某个 cookie 在跨站请求时不会被发送,(其中  Site (en-US) 由可注册域定义),从而可以阻止跨站请求伪造攻击(CSRF)。

Set-Cookie: key=value; SameSite=Strict
  • None浏览器会在同站请求、跨站请求下继续发送 cookies,不区分大小写。
  • Strict浏览器将只在访问相同站点时发送 cookie。(在原有 Cookies 的限制条件上的加强,如上文 “Cookie 的作用域” 所述)
  • Lax与 Strict 类似,但用户从外部站点导航至URL时(例如通过链接)除外。 在新版本浏览器中,为默认选项,Same-site cookies 将会为一些跨站子请求保留,如图片加载或者 frames 的调用,但只有当用户从外部站点导航到URL时才会发送。如 link 链接

 

samesite的加入是为了在一定程度上防范CSRF,比如a.com页面中有个恶意表单,提交url为b.com的域名为开头且为银行转账接口地址,且为post请求,用户误操作后会将本地cookie(domain为b.com)发送,导致账户损失,设置samesite为Lax后可避免该cookie的发送,防止该情况出现。

推荐阅读