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进行信息处理的。

  1. cookie和session的共同之处在于:cookie和session都是用来跟踪浏览器用户身份的会话方式。
  2. cookie 和session的区别是:cookie数据保存在客户端,session数据保存在服务器端。
  3. cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,如果主要考虑到安全应当使用session,当然也没有绝对的安全,只是相对cookie,session更加安全
  4. session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,如果主要考虑到减轻服务器性能方面,应当使用COOKIE
  5. cookie和session各有优缺点,所以将登陆信息等重要信息存放为SESSION;其他信息如果需要保留,可以放在COOKIE中

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏友弟技术工作室

redis用法分析redis基本介绍PHP操作redis服务器python使用redis总结

redis基本介绍 redis也是一个内存非关系型数据库,它拥有memcache在数据存储上的全部优点,而且在memcache的基础上增加了数据持久性功能,re...

36912
来自专栏软件工程师成长笔记

进程与线程的联系和区别?

1752
来自专栏机器学习从入门到成神

深入理解并发/并行,阻塞/非阻塞,同步/异步

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_35512245/articl...

1421
来自专栏上善若水

016 进程内缓存和进程外缓存的对比

在java应用中,对于访问频率比较高,又不怎么变化的数据,常用的解决方案是把这些数据加入缓存。相比DB,缓存的读取效率快好不少。java应用缓存一般分两种,一是...

1753
来自专栏大闲人柴毛毛

Java并发编程的艺术(一)——并发编程需要注意的问题

并发是为了提升程序的执行速度,但并不是多线程一定比单线程高效,而且并发编程容易出错。若要实现正确且高效的并发,就要在开发过程中时刻注意以下三个问题: 上下文切换...

2975
来自专栏散尽浮华

如何查询一个进程下面的线程数(进程和线程区别)

在平时工作中,经常会听到应用程序的进程和线程的概念,那么它们两个之间究竟有什么关系或不同呢? 一、对比进程和线程 1)两者概念 . 进程是具有一定独立功能的程序...

2709
来自专栏技术支持log

freebsd 磁盘挂载错误 Filesystem is not clean - run fsck.: Operation not permitted

freebsd 中挂载磁盘时遇到 Filesystem is not clean – run fsck.: Operation not permitted 这样...

1201
来自专栏月牙寂

k8s源码分析------第三方库etcd client分析

第一时间获取文章,可以关注本人公众号 月牙寂道长 yueyajidaozhang

3666
来自专栏linux运维学习

linux学习第三十三篇:rsync工具介绍,rsync常用选项,rsync通过ssh同步

telnet命令是检测一个端口是否通的命令。格式:telnet ip 端口(安装包 yum install -y telnet) rsync工具介绍 rsyn...

1975
来自专栏xingoo, 一个梦想做发明家的程序员

【web必知必会】——图解HTTP(上)

  本篇总结关于http的相关知识,主要内容参考如下导图: ?   主要讲解的内容有:   1 URL与URI的区别。   2 请求报文与相应报文的内容。   ...

1999

扫码关注云+社区