【HTTP】聊聊cookie与session那些事

【协议】浅谈Cookie与Session那些事

Hello,各位小伙伴晚上好,这里是你们的劳模小编。
在这里插入图片描述

话说上周被问到什么是cookie的同源策略?

小编表示一脸懵逼~
在这里插入图片描述

于是今天初步总结了一下cookie和session,我们一起来看看吧~


一、什么是cookie?

1、为什么需要cookie?

首先我们要明确一个概念,就是我们访问web服务所使用的HTTP服务是无状态的。这就意味着,服务器无法分辨收到的请求,是属于哪一个用户的。

这时候,我们就需要通过cookie来对用户的身份进行标识了,用户每次对服务器发起请求时,都带上自己的cookie,服务器通过读取cookie信息,识别用户。

2、cookie是怎么工作的?
在这里插入图片描述

当用户第一次访问web服务器时,服务器会通过HTTP响应报文中的Set-Cookie字段,给用户分配一个唯一的标识:cookie
在这里插入图片描述

当该用户再次向服务器端发起请求时,会将获取到的cookie存放在HTTP请求报文的Cookie字段中,一并发往服务器。服务器通过读取cookie字段的值来识别用户。

在这里插入图片描述

Cookie都是有失效时间的,默认情况下它是一个会话级别的cookie,存储在浏览器的内存中,当用户退出浏览器之后就会被删除,下次访问时需要重新获取。
在这里插入图片描述

如果网站希望浏览器将该Cookie存在的时间更长一些,也可以设置最大时效(例如七天免登陆),超过时效后再删除cookie。

3、cookie的属性

Cookie属性包括:name、value、expires、domain、path、secure、max-age、HttpOnly。

各属性的作用分别如下:

  • name
    name属性是必需的,它是一个键值对,用于指定Cookie的键。
  • value
    value属性是必需的,它是一个键值对,用于指定Cookie的值。
  • expires
    expires属性用于指定Cookie过期时间。
  • domain
    domain属性指定Cookie所在的域名。
  • path
    path属性用来指定路径,必须是绝对路径(比如/、/mydir),如果未指定,默认为请求该Cookie的网页路径。
  • secure
    secure属性用来指定Cookie只能在加密协议HTTPS下发送到服务器。
  • max-age
    max-age属性用来指定Cookie有效期,正常情况下优先级高于expires。
  • HttpOnly
    HttpOnly属性用于设置该Cookie不能被JavaScript读取.

4、一些安全特性

(1)同源策略

假如网站A有cookie,网站B也有cookie,那浏览器访问网站B时,会不会携带上网站A的cookie呢?又或者网站B能不能修改网站A的cookie呢?

为了避免出现这种情况,浏览器引入了同源策略。必须满足以下三个条件,才能互相读取cookie值。

  • 协议相同
  • 域名相同
  • 端口相同

以下图为例,只有前两个网站符合同源要求:
在这里插入图片描述

(2)Cookie作用域

domain是域名,path是路径,两者加起来就构成了 URL,domain和path一起来限制 cookie 能被哪些 URL 访问。

浏览器向服务器提交cookie,需要满足两点要求:

  • 当前域名或者父域名下的cookie
  • 当前路径或者父路径下的cookie

以domain为例,现在有如下3个域名:

如果在域名example.com下设置获取cookie,那么该域名下的子域名都可以接收到cookie。

如果在域名monster.example.com下设置cookie,example.com不能获取到域名,www.monster.example.com可以获取到。因此子路经可以从父路径读取cookie,但父路径不可以从子路径读取。

(3)HttpOnly

JS 原生的 API提供了获取cookie的方法:document.cookie,在XSS攻击中,常常被用于盗取用户的cookie。

如果能够盗取网站管理员的cookie,那么就可以用管理员的身份直接登录网站后台,而不必非要去获得管理员账号和密码。

攻击者准备一台事先Web服务器(IP地址192.168.80.142),在其中创建一个名为getcookie.php的网页,网页代码如下:
在这里插入图片描述

在正常网页通过XSS漏洞插入以下恶意代码:
在这里插入图片描述

一旦用户访问该页面,cookie值就会被盗用,并发送去攻击者的服务器:
在这里插入图片描述

HttpOnly属性用来设置cookie是否能通过 js去访问,默认情况下该选项为空,客户端是可以通过js代码去访问(包括读取、修改、删除等)cookie的。

当cookie带httpOnly选项时,客户端则无法通过js代码去访问了,是用于防御XSS攻击的常用手段之一。

二、什么是session?

session是另一种会话状态管理机制,不同的是Cookie被保存在客户端,而Session保存在服务器上,流程如下图所示:
在这里插入图片描述
当浏览器访问服务器时,服务器会为每一个访问用户生成一个session文件,用于存储用户信息。

每一个session都有一个唯一的sessionid,创建完session后,服务器会将sessionid通过cookie返回给客户端,客户端获取到的sessionid如下:
在这里插入图片描述

当客户端后续发送请求报文时,都会通过cookie字段带上sessionid。服务器收到请求报文后,通过读取sessionid在本地查找session信息,从而识别用户的身份。

根据sessionid在服务器查找session文件如下,记录了用户信息:
在这里插入图片描述

三、cookie和session对比

1、cookie存放在客户端,而session存放在服务器端

2、cookie因为保存在客户端本地,因此存在被拦截或者修改的风险。

3、session因为存放在服务器端,更安全,但用户量越大,服务器压力也越大。

4、cookie的存储限制了数据量,只允许4KB,而session是无限量的。

因此,我们最好不要用cookie来直接存放用户账号、密码等敏感信息,传输过程中存在泄漏风险。

而session虽然安全,但也更占服务器资源,因此将cookie和session混合使用的方式,是一个比较好的解决方案。

例如用session存放敏感信息,而cookie则用于保存那些不太重要的信息。


好啦,以上就是今天的全部内容了,大家都明白了吗?

最后,欢迎关注我的个人微信公众号。
在这里插入图片描述

Peace !
在这里插入图片描述

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值