大家常说"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. 华为HMS Core图形引擎服务携手三七游戏打造移动端实时DDGI技术

    在2021年HDC大会的主题演讲中提到,华为HMS Core图形引擎服务(Scene Kit)正协同三七游戏一起打造实时DDGI(动态漫反射全局光照:Dynamic Diffuse Global Il ...

  2. dart系列之:如丝滑般柔顺,操作文件和目录

    目录 简介 File 读取整个文件 以流的形式读取文件 随机访问 文件的写入 处理异常 总结 简介 文件操作是IO中非常常见的一种操作,那么对应dart语言来说,操作文件是不是很简单呢?实际上dart ...

  3. python 快速启动http监听服务

    python3 [root@vm10-20-9-45 ~]# python3 -m http.server 2378 Serving HTTP on 0.0.0.0 port 2378 (http:/ ...

  4. Spring工具类 非spring管理环境中获取bean及环境配置

    SpringUtils.java import org.springframework.beans.BeansException; import org.springframework.beans.f ...

  5. JAVA遍历某个文件夹下所有文件listFiles() 实现按照名称升序排序

    File[] files = file.listFiles(); List fileList = Arrays.asList(files); Collections.sort(fileList, ne ...

  6. vue-子组件创建/注册/使用流程

    流程分为三步 非单文件组件:(实际不用,因为很麻烦,框架都是多文件组件) 局部注册 1.创建一个组件 const school = Vue.extend({ // 传入配置对象 // 子组件配置对象不 ...

  7. ByteBuddy代码生成技术

    简介 如官网所说Byte Buddy 是一个代码生成和操作库,用于在Java应用程序运行时创建和修改Java类,而无需编译器的帮助.除了Java类库附带的代码生成实用程序外,Byte Buddy还允许 ...

  8. 【LeetCode】800. Similar RGB Color 解题报告(C++)

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

  9. 【LeetCode】671. Second Minimum Node In a Binary Tree 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 找出所有值再求次小值 遍历时求次小值 日期 题目地址 ...

  10. 【LeetCode】162. Find Peak Element 解题报告(Python)

    [LeetCode]162. Find Peak Element 解题报告(Python) 标签(空格分隔): LeetCode 题目地址:https://leetcode.com/problems/ ...