透视HTTP协议
罗剑锋(Chrono)
奇虎360技术专家,Nginx/OpenResty开源项目贡献者
立即订阅
6077 人已学习
课程目录
已完结 44 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词|To Be a HTTP Hero
免费
破冰篇 (7讲)
01 | 时势与英雄:HTTP的前世今生
02 | HTTP是什么?HTTP又不是什么?
03 | HTTP世界全览(上):与HTTP相关的各种概念
04 | HTTP世界全览(下):与HTTP相关的各种协议
05 | 常说的“四层”和“七层”到底是什么?“五层”“六层”哪去了?
06 | 域名里有哪些门道?
07 | 自己动手,搭建HTTP实验环境
基础篇 (7讲)
08 | 键入网址再按下回车,后面究竟发生了什么?
09 | HTTP报文是什么样子的?
10 | 应该如何理解请求方法?
11 | 你能写出正确的网址吗?
12 | 响应状态码该怎么用?
13 | HTTP有哪些特点?
14 | HTTP有哪些优点?又有哪些缺点?
进阶篇 (8讲)
15 | 海纳百川:HTTP的实体数据
16 | 把大象装进冰箱:HTTP传输大文件的方法
17 | 排队也要讲效率:HTTP的连接管理
18 | 四通八达:HTTP的重定向和跳转
19 | 让我知道你是谁:HTTP的Cookie机制
20 | 生鲜速递:HTTP的缓存控制
21 | 良心中间商:HTTP的代理服务
22 | 冷链周转:HTTP的缓存代理
安全篇 (7讲)
23 | HTTPS是什么?SSL/TLS又是什么?
24 | 固若金汤的根本(上):对称加密与非对称加密
25 | 固若金汤的根本(下):数字签名与证书
26 | 信任始于握手:TLS1.2连接过程解析
27 | 更好更快的握手:TLS1.3特性解析
28 | 连接太慢该怎么办:HTTPS的优化
29 | 我应该迁移到HTTPS吗?
飞翔篇 (4讲)
30 | 时代之风(上):HTTP/2特性概览
31 | 时代之风(下):HTTP/2内核剖析
32 | 未来之路:HTTP/3展望
33 | 我应该迁移到HTTP/2吗?
探索篇 (5讲)
34 | Nginx:高性能的Web服务器
35 | OpenResty:更灵活的Web服务器
36 | WAF:保护我们的网络服务
37 | CDN:加速我们的网络服务
38 | WebSocket:沙盒里的TCP
总结篇 (2讲)
39 | HTTP性能优化面面观(上)
40 | HTTP性能优化面面观(下)
答疑篇 (2讲)
41 | Linux/Mac实验环境搭建与URI查询参数
42 | DHE/ECDHE算法的原理
结束语 (1讲)
结束语 | 做兴趣使然的Hero
透视HTTP协议
登录|注册

19 | 让我知道你是谁:HTTP的Cookie机制

Chrono 2019-07-10
在之前的第 13 讲第 14 讲中,我曾经说过,HTTP 是“无状态”的,这既是优点也是缺点。优点是服务器没有状态差异,可以很容易地组成集群,而缺点就是无法支持需要记录状态的事务操作。
好在 HTTP 协议是可扩展的,后来发明的 Cookie 技术,给 HTTP 增加了“记忆能力”。

什么是 Cookie?

不知道你有没有看过克里斯托弗·诺兰导演的一部经典电影《记忆碎片》(Memento),里面的主角患有短期失忆症,记不住最近发生的事情。
00:00 / 00:00
比如,电影里有个场景,某人刚跟主角说完话,大闹了一通,过了几分钟再回来,主角却是一脸茫然,完全不记得这个人是谁,刚才又做了什么,只能任人摆布。
这种情况就很像 HTTP 里“无状态”的 Web 服务器,只不过服务器的“失忆症”比他还要严重,连一分钟的记忆也保存不了,请求处理完立刻就忘得一干二净。即使这个请求会让服务器发生 500 的严重错误,下次来也会依旧“热情招待”。
如果 Web 服务器只是用来管理静态文件还好说,对方是谁并不重要,把文件从磁盘读出来发走就可以了。但随着 HTTP 应用领域的不断扩大,对“记忆能力”的需求也越来越强烈。比如网上论坛、电商购物,都需要“看客下菜”,只有记住用户的身份才能执行发帖子、下订单等一系列会话事务。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《透视HTTP协议》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(34)

  • 徐海浪
    1. 如果 Cookie 的 Max-Age 属性设置为 0,会有什么效果呢?
    设置为0,服务器0秒就让Cookie失效,即立即失效,服务器不存Cookie。
    2. Cookie 的好处已经很清楚了,你觉得它有什么缺点呢?
    好处:方便了市民
    缺点:方便了黑客:)

    作者回复: √

    2019-07-10
    13
  • Fstar
    1. (我修改 Lua 文件测试了一下)如果 Max-Age 设置为0,浏览器中该 Cookie 失效,即便这个 Cookie 已存在于浏览器中,且尚未过期。另外 Web 应用开发中,可以通过这种方式消除掉用户的登陆状态,此外记得在服务器的 session 中移除该 cookie 和其对应的用户信息。
    2. Cookie 的缺点:
    (1) 不安全。如果被中间人获取到 Cookie,完全将它作为用户凭证冒充用户。解决方案是使用 https 进行加密。
    (2)有数量和大小限制。另外 Cookie 太大也不好,传输的数据会变大。
    (3)客户端可能不会保存 Cookie。比如用 telnet 收发数据,用户禁用浏览器 Cookie 保存功能的情况。

    作者回复: good。

    2019-07-11
    7
  • WL
    对于XSS和XSRF一直不是很理解希望老师帮忙解答一下:
    1. XSS攻击是指第三方的JS代码读取到浏览器A网站的Cookie然后冒充我去访问A网站吗?
    2.XSRF是指浏览器从A网站跳转到B网站是会带上A网站的Cookie吗?这个不是由Domain和Path已经限定了吗?

    作者回复: 1,是的。

    2.你理解的反了,应该是带上B网站的cookie。

    https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Cookies

    这个链接里举的例子也许能够帮助你理解。

    2019-07-10
    7
  • 放开那个猴子
    广告追踪没看明白呀,能否详细讲讲

    作者回复: 是这样的,网站的页面里会嵌入很多广告代码,里面就会访问广告商,在浏览器里存储广告商的cookie。

    你换到其他网站,上面也有这个广告商的广告代码,因为都是一个广告商网站,自然就能够读取之前设置的cookie,也就获得了你的信息。

    2019-07-10
    1
    6
  • 业余草
    属性“HttpOnly”、“Secure”、“SameSite”很少见,老师可以给几个配套例子,后面答疑篇,可以来个攻防实战!

    作者回复: 其实并不少见,上几个大站,用开发者工具看看就能看到。

    2019-07-10
    6
  • 饭饭
    Max-age:-1 的时候会永久有效吧 ?

    作者回复: rfc里有说明,如果max-age <=0,统一按0算,立即过期。

    2019-07-10
    5
  • cp3yqng
    域名+路径的方式存储cookie,感觉像只有一台业务服务器,那后台如何过分布式系统呢,用户中心是一个系统,核心业务是其他的系统,这里cookie肯定要共享,应该有一级域名和二级域名等等的概念吧,麻烦老师在解释解释。我本人是做移动端开发的,都是自己把token写在网络底层的请求头中,其实核心思想是一样的,但是缺点就是所有的域名里面都带token,这样也不好,好像还有优化的空间。

    作者回复: 只要cookie设置了domain和path属性,浏览器在访问uri时就会根据这两个属性有选择地发送cookie。

    需要根据自己的业务需求,恰当设置cookie的作用域,太大太小都不好。

    2019-07-10
    4
  • 业余爱好者
    1.Max-Age: 是永久有效的意思。
    2.cookie在浏览器端禁用,还有就是安全性,因为在本地是明文存储的

    作者回复: 1不对,max-age=0,就是立即过期,不允许缓存,只能在浏览器运行期间有效。

    2019-07-10
    4
  • Geek_66666
    既然max-age=0会立即失效,那不就等于无记忆了?那干嘛还用cookie?

    作者回复: max-age=0是指不能缓存,但在会话期间是可用的,浏览器会话关闭之前可以用cookie记录用户的信息。

    2019-08-15
    3
  • 院长。
    老师我是那个回复URI会跳转的那个,其他的测试案例也都会跳转。
    您说的实验环境openresty需要我配置什么嘛?我应该是顺着看您的文章的,您专栏里哪一章有介绍我漏看的吗?
    如果是我漏看的麻烦老师说下在哪一节,谢谢老师啦。

    作者回复: 感觉是dns域名解析被缓存了,走了其他真实网站,没有使用本地的hosts文件,可能要清理系统的域名缓存,具体方法可以搜一下。

    2019-07-11
    3
  • 大小兵
    要是能把session和token也说一下就好了

    作者回复: 这个不在http范围之内,而且篇幅有限,还望见谅。

    2019-07-10
    3
  • chengzise
    老师好,我理解的广告跟踪那个原理是:用户访问A网站,A会给用户设置cookies(T),用户再次访问网站B时,浏览器会带上cookies(T),B网站就能够识别到被A标记的用户。这里A给用户设置的cookies里面是不是把domain设置为B网站?不然凭什么访问B网站的时候,浏览器会带上A设置的cookies。

    作者回复: 在这个场景里B是“第三方cookie”,不是A设置的,所以只要在页面里嵌入了B相关的代码,就会带上B的cookie。

    完全弄清楚可能还需要一点html的知识。

    2019-07-10
    2
  • 彧豪
    话说现在还有用cookie的吗?感觉似乎不是太安全吧,毕竟各种明文传输,我司是这么做的:浏览器登录成功, 服务端会设置一个密文的cookie, 然后浏览器再用带着这个cookie值的请求头字段去请求用户信息的接口来获取用户信息, 当然了还有其他的头字段,然后登陆之类的接口中的相应头也看不到set-cookie字段,但是浏览器的cookie中却能被设置上一个cookie键值对,以及是密文的

    作者回复: 有些公司为了兼容性还是用cookie的。

    2019-07-21
    2
    1
  • 院长。
    为什么我输入http://www.chrono.com/19-1之后,很快就跳到另外一个URI了呀,我还没来得及看network里面的19-1,就给跳没了。
    另一个URI(里面包含detecdor.js,favicon.ico,redirect.php......,tcerider.php......等四个文件):http://www.chrono.com/search/tcerider.php?f=http%3A%2F%2F660.dragonparking.com%2F%3Fsite%3Dchrono.com%26t%3D1562811636000%26s%3Deab4b898c9f4e1c6333ee353d2b8cfdc%26fs%3D0%26channel%3D480306&amp;v=YWE2MDE5OTEyYjg2MjRkNTYxN2Y4YjA1MGIzNjNjM2QJMQl3d3cuY2hyb25vLmNvbTVkMjY5Y2Y0OGQ0NjkyLjY0NjM1MDA4CXd3dy5jaHJvbm8uY29tNWQyNjljZjQ4ZDRjNjYuOTc5MjA5NDgJMTU2MjgxMTYzNglhZF80NF8w&amp;l=NglBRFMJNTk4MmNiYjYyZmVhNTQ4ZDA0ZDk3OTg4MjUyZWYwZDYJMAk4CQkzMQkxCTEJMAkwNzcyNDg5ODc0ZDU4ZDkyMmZkM2QyMmY0ZDRhNmFhNAkJMTgxNzQ4OTMxCWMJMjU3Mzc3MDAwCQljaHJvbm9ncmFwaCx3YXRjaGVzLHVzZWQgd2F0Y2hlc%2BKAjixjaHJvbm9ncmFwaCB3YXRjaGVzLGx1eHVyeSB3YXRjaGVzCTExMDEJNDQJMTUJOTUJMTU2MjgxMTYzNgkwCU4JMAkwCTAJCQkJCQl3d3cuY2hyb25vLmNvbTVkMjY5Y2Y0OGQ0NjkyLjY0NjM1MDA4CTAJCTEJODMwCTEyNjIJMjk1NDI5MTIJCTEyMS4yMjQuMTExLjU%3D

    作者回复: 之前的测试用例是否正常?可能是域名解析到外网了,没有走实验环境的openresty。

    2019-07-11
    1
  • 居培波
    正常需要服务器输出cookie值value时会加密,这样稍安全点。

    作者回复: √

    2019-07-10
    1
  • 威~~微冷。。。
    收获不少。老师说的这些多是建立在浏览器也就是B/S模式下,浏览器帮忙解析并本地存储,在发起请求的时候请求头还自动加上cookie。那要是C/S模式下,脱离了浏览器,比如说安卓客户端,这时候要达到类似cookie这样的效果,是不是需要安卓开发人员自己解析响应,然后再存储,最后再组装请求体像后台服务器发请求吗???

    作者回复: 是的,相对于你自己扮演了浏览器的角色。

    不过也许api提供了类似的整合功能,需要查一下资料。

    2019-07-10
    1
  • 响雨
    Max-Age=0,cookie就会马上失效了。cookie的明文存储肯定不安全的。
    Flask开发中,Flask-session提供了将session_id存储在cookie中的方法,这样cookie就不需要存储敏感数据,通过session_id从后端获取session数据,然后session中存放用户的数据。

    作者回复: √

    2019-07-10
    1
  • 小美
    比如域名A,是不是能获取到用户所有的cookie(包括B域名)这样不是很不安全

    作者回复: 这个就是跨站的问题,通常cookie都会设置作用域,浏览器会保证只发给对应的网站,不会那么简单地泄漏。

    2019-07-10
    1
  • 我行我素
    1.立即失效,即每次访问都会重新设置cookie
    2.安全性问题,还有就是隐私的烦恼;

    作者回复: √

    2019-07-10
    1
  • -W.LI-
    老师好有个问题!不加SameSite的人话夸站请求时会把cookie信息带过去。除了cookie信息还有哪些在夸站时会被浏览器自动带过去啊?

    作者回复: 网络攻击方面研究的不深,无法给你完整的解答。

    最常见的就是cookie了。

    2019-07-10
    1
收起评论
34
返回
顶部