COOKIE 基础

Cookie 起源:

Cookie 是被网景前员工 Lou Montulli,在 1994 年将 “magic cookies” 的概念应用到 Web 通讯中,他试图解决 Web 的第一个购物车应用所产生,然后被应用至今。

题外话:网景一家创造了第一个民间浏览器,JavaScript ,cookie,img 标签等的传奇公司(网景传说

为什么使用 Cookie:

由于 HTTP 是无状态协议,一旦数据交换完毕,前端与后端的链接就会断开,即使是长链接也会有断开问题。那么这个时候能够记录当前用户状态就至关重要。

所以 Cookie 应运而生,后端给前端的 Response Header 中带上 Set-Cookie,则支持 Cookie 的浏览器就会记录下来这个信息,下次访问Service 的时候带上 Cookie Header 传递

题外话:正是因为 Cookie 给前端和后端带来了状态识别上极大的便利,所以叫做 Cookie ,即甜点,意思是给了大家一点甜头
Cookie 基本知识 Cookie Expires(http1.0) / max-age(http1.1),有过期时间,

如果不设置,则属于会话Cookie 这时候是保存到内存中的,当浏览器关闭则清除,如果设置了未来的过期时间则会保存到硬盘中属于硬盘
Cookie,除非到过期时间否则不会清除

还有一种删除是由于Cookie 达到了浏览器的最大 Cookie
限制而被浏览器策略所自动删除。IE和Opera会采用LRU算法将老的不常使用的Cookie清除掉,Firefox的行为是随机踢出某些Cookie的值。因为这种是存在浏览器差异的,所以需要尽量控制Cookie
的数量与大小。

Cookie Domain,Cookie 是不可以跨域名的,

比如 newegg.com 域下的Cookie 在 newegg.org 域下无法获取,并且只能读取当前域以及父域下的 Cookie,如 flash.newegg.com 的Cookie 只能在 flash.newegg.com 以及 xx.flash.newegg.com 获取到,但是不能在 ngm.newegg.com 或者是 newegg.com 获取到

此处 xx 可替换成任意字母和 . 的组合

Cookie Path

Domain 是限制获取 Cookie 的域,Path 则是限制域下面能够访问 Cookie 的 Path,只指定 / 则为所有路径都可以访问,但是需要注意一旦设置了路径就只能此路径以及其子路径才能获取到这个 Cookie,如设置 Path = /a,则 /a、/a/0 都能获取到 Cookie,但是 /b无法获取,并且名称相同的但是 Path 不相同的Cookie 会被认为是不同的 Cookie,并且在非指定的路径下无法访问,如a.com 中 test=2 是在 Path= /a ,test=1 cookie 是在 Path=/ 路径

当在 a.com 下访问的时候,只有一个 test=1 的
但是当在 a.com/a 时则能够读取到两个

sameSite 这个用来定义 Cookie 如何跨域发送

主要是为了防止 CSRF 以及 XSSI 攻击,

有如下选项:

strict:强制模式,这个会禁止所有第三方链接,即类似于第三方登录的时候如果目标网站 cookie 加了这个,则返回的请求中不会携带目标
cookie

lax:只有通过 get 请求的方法会携带目标cookie

Cookie 安全

由于Cookie 是在浏览器端存储,因此 Cookie 可以随时被抓取,解析,甚至单纯截获用于重放

为了避免以上的情况我们应该

  1. 有效期合理设置(避免有效期过长导致的泄漏风险)
  2. 设置 HttpOnly = true(只能通过 http/https 访问,避免在 js
    中进行读取,避免跨站脚本攻击)
  3. 设置复杂的 Cookie(只是为了保护 Cookie 的数据不被解密) 使用 ip+cookie
    的token 进行二次校验(尽可能的降低重放成功)
  4. 可以使用 Session 来保存数据,Cookie 中仅仅保存 Session Id
  5. 设置 Secure=true(如果网站支持 https)

Cookie 限制

数量限制:一般的浏览器都对每个域名的 Cookie 的数量有限制,各个浏览器限制不一样

IE6 为20 个,IE8+/FireFox 为 50 个,Opera 为 30 个,Chrome 为 53 个,SafariWebKit
没有明确限制(但是这里如果超过了 Service 能够处理的最大量,那么Service 会报错误)

在达到限制之后处理方式也有不同,因为这种是存在浏览器差异的,所以需要尽量控制Cookie 的数量与大小。

IE和Opera会采用LRU算法将老的不常使用的Cookie清除掉 Firefox的行为是随机踢出某些Cookie的值。

大小限制:浏览器对 Cookie 的大小也有限制,不同浏览器也可能不相同,一般是限定不超过 4 k(注意对 IE 的兼容)

这里的大小都是包括 ‘name’、’=‘ 以及值

Firefox和Safari允许cookie多达4097个字节 Opera允许cookie多达4096个字节 Internet
Explorer允许cookie多达4095个字节

盗的运行原理(原文
图片来自掘金

盗的总结图(原文
转自掘金

Cookie 实现简单的 SSO
前面那么多废话,现在来实战一把

首先新建一个 Service 来提供登录服务:
建立一个api,获取用户的账号密码,成功则返回用户信息写入 cookie(域名为顶级域名 a.com.sh,name:CustomerLogin)
新建登录页面:
新建页面,检测是否存在用户信息 cookie(name:CustomerLogin),存在则显示用户信息,否则显示账号密码输入框,获取到用户输入
调用后台接口进行登录验证,成功则显示用户信息
部署到两个域,c1.a.com.sh 以及 c2.a.com.sh
c1.a.com.sh 或者 c2.a.com.sh 任意一个进行登录,成功之后刷新另外一个也成功登陆
激动人心的问题时刻
为什么Cookie 需要写到 a.com.sh ?
上述如果还有一个网站也需要实现和上面一样的 SSO,应该怎么处理?
上述 SSO 中有什么隐患?
参考文档
https://www.cnblogs.com/ajianbeyourself/p/4900140.html
https://cloud.tencent.com/developer/article/1065905
https://blog.csdn.net/aoshilang2249/article/details/71189456
https://juejin.im/post/5cc5cad0f265da037516abe1
https://rlilyyy.github.io/2016/07/10/SameSite-Cookie——防御-CSRF-XSSI/
https://imququ.com/post/host-only-cookie.html
https://my.oschina.net/meituantech/blog/2243958
https://blog.csdn.net/qq_27552077/article/details/61671671

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值