0
点赞
收藏
分享

微信扫一扫

理解Cookie和Session机制,及其安全问题

zibianqu 2022-01-14 阅读 44

Python微信订餐小程序课程视频

https://edu.csdn.net/course/detail/36074

Python实战量化交易理财系统

https://edu.csdn.net/course/detail/35475

Cookie和Session的区别?百度一下最常见的就是**“Cookie保存在客户端而Session保存在服务端”**,很多人看了有疑惑,明明Session就在Cookie中啊,为什么这么说?二者到底有啥区别?

一、Cookie

首先分清Cookies和Cookie

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

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

但当我们说Cookie和Session的区别时,这里的Cookie就理应是一种和Session一样的认证机制,这种情况下Session借助Cookies暂存在浏览器中,二者都在浏览器和服务器中被存储,这是Cookies最重要的应用

那如何解释**“Cookie保存在客户端”**呢?可能本来就是瞎说,也可能是最开始有这种场景:

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

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

以及传闻中cookie名字的由来:

设想你某次登陆过一个网站,下次登录的时候不想再次输入账号了,怎么办?这个信息可以写到Cookie里面,访问网站的时候,网站页面的脚本可以读取这个信息,就自动帮你把用户名给填了,能够方便一下用户。这也是Cookie名称的由来,给用户的一点甜头。

我比较认可的解释是Session是在服务端保存的一个数据结构,用来跟踪用户的状态,这个数据可以保存在集群、数据库、文件中;Cookie是客户端保存用户信息的一种机制,用来记录用户的一些信息,也是实现Session的一种方式[1]。

二、Session

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

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

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

而浏览器开发者也觉得这样很合理,也为Cookie添加了一些可设置的安全相关属性

三、Cookies中用户凭证的安全问题

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

  • Cookies:持久保存,大小限制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,token为啥会这么巧设置了

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

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

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

一个凭证同时防御XSS、CSRF攻击,浏览器js目前无法修改请求的referer头,会提示Refused to set unsafe header "Referer"

五、最后

现在浏览器的安全也逐步做上来了,一定程度上能防御CSRF,除了cookie samesite,跨域在POST请求前,还会发送OPTIONS请求,如果OPTIONS请求不通过,无法POST

但开发还是要规范,不能指望用户都是新浏览器

以上,讲得不对望指正

举报

相关推荐

0 条评论