大家常说"Cookie保存在客户端而Session保存在服务端",很多人看了有疑惑,明明Session就在Cookie中啊,为什么这么说?二者到底有啥区别?

一、Cookie

首先分清Cookies和Cookie

Cookies严格来说是个存储空间,是个载体,用提交持久化的信息,浏览器发送HTTP请求时会自动带上此域的所有Cookie,抓包能发现就在HTTP Header中

Cookie就是存储在Cookies中的一条条数据

但当我们说Cookie和Session的区别时,这里的Cookie就变成了一种和Session一样的机制,用来比较

网站设计时,服务端可能每次收到请求都需要知道客户端的某种信息,比如用户登录时间,这种信息又不足以重要到需要保存在服务端,那么可以借助Cookie

数据在服务端生成,生成后通过Set-Cookie发送给客户端后,服务端自身不保存,当客户端再次有请求时,服务端可以从请求的HTTP Header中调出这个数据

这能解释"Cookie保存在客户端"

二、Session

Session是身份认证的凭证,用户登录后,服务器分发一个凭证,以后用户再请求带上这个凭证就能明确身份,不用每次都用账号密码来证明身份

这么重要的数据当然得保存在服务端,且以服务端的为准。但客户端也得保存,才能在登录周期中每次请求都带上

"每次请求都带上"这显然就和Cookie一样,所以就有很多开发者把Session放在Cookie里,不用自己写前端代码把Session塞进请求里,浏览器自己会带上

但Session和Cookie真的一样么?当然不,这样设计会带来安全问题。

三、Session Cookie混用带来的安全问题

目前的浏览器有以下空间供网站使用

  • Cookie:持久保存,大小限制4kb,最多放20个,每次请求都会带上所有Cookie

  • Session Storage:关闭标签后失效,请求不会主动带上

  • Local Storage:持久保存,请求不会主动带上

我们再来看几个Web的安全漏洞

  • XSS,跨站脚本攻击。攻击者获得页面的js权限,能操作页面的一切,包括Session Storage和未设置HTTP Only属性的Cookie

  • CSRF,跨站请求伪造,就是钓鱼网站,在网站A,发送一个向网站B的请求,由于浏览器会在请求中加上此域的Cookie,所以如果在浏览器登录了网站B,又打开了钓鱼网站A,网站A构造的前往网站B的请求就会带上你的Cookie,如果Cookie中有用户凭证,服务器认为你是登录用户,请求就会被响应。比如点赞、关注、发色情广告等请求

防御XSS,把关机Cookie设置HTTP Only属性即可,js无权访问

而防御CSRF,推荐使用token机制,服务器颁发token,按规范来说推荐存储在Session Storage中(也可以放cookie中,由于浏览器的同源策略,网站A无法访问网站B的cookie),js将其添加到请求的参数或Header中

以上两个措施,都需要做到,才能防护这两个攻击。

另外博主以为,服务器校验referer Header也是能防御CSRF的

四、错误示范

  • 把用户登录凭证放在Cookie中,未设置HTTP Only,请求中无token参数/Header

    容易遭受XSS、CSRF攻击

  • 把用户登录凭证放在Cookie中,设置了HTTP Only,请求中无token参数/Header

    容易遭受CSRF攻击,成功防御XSS攻击

  • 把用户登录凭证放在Cookie中,未设置HTTP Only,请求中有token参数/Header(前端把token保存在Session Storage,保存在Cookies,未设置HTTP Only)

    容易遭受XSS攻击,攻击者能构造请求,把token拼上,成功防御CSRF攻击

  • 把用户登录凭证放在Cookie中,设置了HTTP Only,请求中有token参数/Header【规范防御】

    成功防御XSS、CSRF攻击

  • 把用户登录凭证放在Cookie中,未设置HTTP Only,请求中有token参数/Header(前端把token保存在保存在Cookies,设置了HTTP Only)【稀里糊涂地防御】

    成功防御XSS、CSRF攻击

  • 把用户登录凭证放在Cookie中,设置了HTTP Only,且请求参数/Header中也添加并校验此凭证【极简防御一】

    一个凭证同时防御XSS、CSRF攻击,虽然看起来不正道,不正经

  • 把用户登录凭证放在Cookie中,设置了HTTP Only,且服务器校验referer Header【极简防御二】

    一个凭证同时防御XSS、CSRF攻击,浏览器js目前似乎无法修改请求的referer头

五、最后

现在浏览器的安全也逐步做上来了,一定程度上能防御CSRF

以上,讲得不对望指正

理解Cookie和Session机制,及其安全问题的更多相关文章

  1. 转:理解Cookie和Session机制

    原文: 理解Cookie和Session机制 摘要: Cookie工作原理 由于HTTP是一种无状态的协议,服务器单从网络连接上无从知道客户身份.怎么办呢?就给客户端们颁发一个通行证吧,每人一个,无论 ...

  2. 理解Cookie和Session机制

    转载: 理解Cookie和Session机制 会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话.常用的会话跟踪技术是Cookie与Session.Cookie通过在客户端记录 ...

  3. 深入理解Cookie和Session机制

    转载理解Cookie和Session机制 目录 Cookie机制什么是CookieCookie的不可跨域名性Unicode编码:保存中文BASE64编码:保存二进制图片设置Cookie的所有属性Coo ...

  4. 理解Cookie和Session机制(转)

    目录[-] Cookie机制 什么是Cookie 记录用户访问次数 Cookie的不可跨域名性 Unicode编码:保存中文 BASE64编码:保存二进制图片 设置Cookie的所有属性 Cookie ...

  5. 【转】理解cookie和session机制

    cookie和session机制之间的区别与联系 具体来说cookie机制采用的是在客户端保持状态的方案.它是在用户端的会话状态的存贮机制,他需要用户打开客户端的cookie支持.cookie的作用就 ...

  6. 正确理解cookie和session机制原理

    php中cookie和session是我们常用的两个变量了,一个是用户客户端的,一个用在服务器的但他们的区别与工作原理怎么样,下面我们一起来看看cookie和session机制原理吧. cookie和 ...

  7. C#基础知识之理解Cookie和Session机制

    会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话.常用的会话跟踪技术是Cookie与Session.Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端 ...

  8. 基础知识《十二》一篇文章理解Cookie和Session

    理解Cookie和Session机制 会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话.常用的会话跟踪技术是Cookie与Session.Cookie通过在客户端记录信息确定 ...

  9. cookie和session机制

    一.cookie和session机制之间的差别和联系 1.cookie机制 Cookie意为"甜饼",是由W3C组织提出,最早由Netscape社区发展的一种机制. 眼下Cooki ...

随机推荐

  1. [BUUCTF]PWN——[BJDCTF 2nd]test

    [BJDCTF 2nd]test 步骤 根据题目,ssh连接一下靶机 登录成功后,ls看一下当前目录下的文件,根据提示可知,我们没法直接获取flag字符串,但是我们可以读取test的源码, test. ...

  2. 从来也科技UiBot 6.0社区版全线免费,看RPA距离“人人可用”还有多远

    来也科技RPA产品UiBot 6.0社区版全线免费,背后的逻辑是什么? 来也科技CPO褚瑞:开发者生态才是RPA厂商的真正护城河 来也科技UiBot 6.0社区版全线免费,RPA距离真正人人可用还有多 ...

  3. Table.Combine追加…Combine(Power Query 之 M 语言)

    数据源: 销量表和部门表 目标: 其中一表的数据追加到另一表后面,相同列直接追加,不同列增加新列 操作过程: 选取销量表>[主页]>[追加查询]/[将查询追加为新查询]>选择要追加的 ...

  4. windows系统中远程登录ubuntu18服务器的桌面

    下载:http://www.c-nergy.be/products.html 也可以直接服务器里 wget https://www.c-nergy.be/downloads/xRDP/xrdp-ins ...

  5. Linux(centos)安装es(elasticsearch)

    前提条件--需要安装jdk环境,不同版本的es所对应的jdk版本要求不同,es6的使用jdk1.8可以 1.下载elasticsearch压缩包 下载地址:https://www.elastic.co ...

  6. 【LeetCode】547. Friend Circles 解题报告(Python & Java & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...

  7. 【LeetCode】652. Find Duplicate Subtrees 解题报告(Python)

    [LeetCode]652. Find Duplicate Subtrees 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个人博 ...

  8. 【LeetCode】154. Find Minimum in Rotated Sorted Array II 解题报告(Python)

    [LeetCode]154. Find Minimum in Rotated Sorted Array II 解题报告(Python) 标签: LeetCode 题目地址:https://leetco ...

  9. 【LeetCode】60. Permutation Sequence 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...

  10. See you~(hdu1892)

    See you~ Time Limit: 5000/3000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Su ...