Python爬虫番外篇之Cookie和Session
关于cookie和session估计很多程序员面试的时候都会被问到,这两个概念在写web以及爬虫中都会涉及,并且两者可能很多人直接回答也不好说的特别清楚,所以整理这样一篇文章,也帮助自己加深理解
什么是cookie
其实简单的说就是当用户通过http协议访问一个服务器的时候,这个服务器会将一些name/value键值对返回给客户端浏览器,并将这些数据加上一些限制条件。在条件符合时,这个用户下次再访问服务器的时候,数据又被完整的带给服务器。
因为http是一种无状态协议,用户首次访问web站点的时候,服务器对用户一无所知。而cookie就像是服务器给每个来访问的用户贴的标签,而这些标签就是对来访问的客户端的独有的身份的一个标识,这里就如同每个人的身份证一样,带着你的个人信息。而当一个客户端第一次连接过来的时候,服务端就会给他打一个标签,这里就如同给你发了一个身份证,当你下载带着这个身份证来的时候,服务器就知道你是谁了。所以cookie是存在客户端的,这里其实就是在你的浏览器中。
cookie中包含了一个由名字=值(name = value)这样的信息构成的任意列表,通过set-cookie或set-cookie2 http响应(扩展)首部将其贴到客户端身上。如下图例子所示:
其实这里有一个非常典型的应用,就是关于你登录很多网站的账号信息,你让记住密码之后,一段时间内,不需要输入密码,每次都是登录状态
cookie的分类
这里cookie主要分为两种:
会话cookie:不设置过期时间,保存在浏览器的内存中,关闭浏览器,cookie便被销毁
普通cookie:设置了过期时间,保存在硬盘上
cookie属性
因为最开始的cookie是网景公司定义的,后来又有了rfc版本所以当前的cookie有两个版本:version 0 version 1 他们有两种设置响应头的标识,分别是:set-cookie和set-cookie2,这也造成了一些属性的不同,这里需要注意:常用的为version 0
version 0的属性
name = value :键值对设置要保存的name/value,这里的name不能喝其他属性的名字一样
expires:过期时间
domain:生成该cookie的域名
path: 该cookie是在当前的哪个路径下生成
secure:如果设置了这个属性,那么只会在ssh连接时才会回传该cookie
version 1的属性
name=value:键值对设置要保存的name/value,这里的name不能喝其他属性的名字一样
comment:主是想,用于说明该cookie有什么用途
commenturl:该服务器为此cookie提供uri注释
discard:是否在回话结束丢弃该cookie,默认为false
domain:生成该cookie的域名
max-age:最大失效时间,与version 0不同的是这里设置的是在多少秒后失效
path:该cookie是在当前的哪个路径下生成
port:该 cookie 在什么端口下可以回传服务端,如果有多个端口,以逗号隔开
secure:如果设置了这个属性,那么只会在ssh连接时才会回传该cookie
关于session
上面我们知道了cookie可以让服务器端跟踪每个客户端的访问,但是每次客户端的访问都必须传回这些 cookie,如果 cookie 很多,这无形地增加了客户端与服务端的数据传输量,而 session 的出现正是为了解决这个问题。
同一个客户端每次和服务端交互时,不需要每次都传回所有的cookie值,而是只要传回一个id这个id是客户端第一次访问服务器的时候生成的,而且每个客户端是唯一的。这样每个客户端就有了一个唯一的id,客户端只要传回这个id就行了,这个id通常是nane为jsesionid的一个cookie。所以session其实是利用cookie进行信息处理的。
- cookie和session的共同之处在于:cookie和session都是用来跟踪浏览器用户身份的会话方式。
- cookie 和session的区别是:cookie数据保存在客户端,session数据保存在服务器端。
- cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗,如果主要考虑到安全应当使用session,当然也没有绝对的安全,只是相对cookie,session更加安全
- session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,如果主要考虑到减轻服务器性能方面,应当使用cookie
- cookie和session各有优缺点,所以将登陆信息等重要信息存放为session;其他信息如果需要保留,可以放在cookie中
上一篇: Python简单爬虫
下一篇: 最全最详细的PHP面试题(带有答案)