cookie,session和token详解和区别

本文详细介绍了HTTP无连接无状态的特性及其解决方案,包括cookie和session的产生背景、工作原理及区别。同时,文章讨论了session的持久化、cookie的生命周期,以及session与token的不同,强调了它们在会话管理和安全性方面的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

前言

1.cookie和session是为了解决什么问题产生的?

2.什么是会话技术?

3.cookie详解

Cookie的表示

Cookie的组成

Cookie的HTTP传输

Cookie的生命周期

cookie执行流程

4.session

session机制,原理

session持久化

其它

session执行流程

5.cookie/session的区别与联系

6.session和token有什么区别?


前言

HTTP协议的无连接,无状态的,这两种状态都存在一定的缺点,无连接可以使用koop-alive解决,那么无状态服务怎么解决呢?

1.cookie和session是为了解决什么问题产生的?

首先我们知道因为HTTP是无连接的,当请求结束连接就会中断所以会产生身份识别的问题。

因此诞生了cookie甚至于在localStorage出现之前浏览器存储功能都是依靠cookie来完成的

但是它的原理简单到爆,一句话就是当浏览器访问服务器时,服务器会向浏览器发送一个cookie

可以理解为标识符,下次浏览器再向服务器发送请求时在上行报文中携带这个标识符(cookie)

服务器就能够根据标识符做出识别,当服务器在下行报文中设置cookie的持续时间

 所以cookie就是一个浏览器跟服务器通讯的信物,如果是中国人发明可能就是黑话,这个基础是建立在HTTP无连接

那么有了cookie,为什么还要有session呢?有了cookie可以向服务器证明用户身份了,我们的web系统中是不是需要将用户的详细信息储存在某个位置供页面调用呢?用户的详细信息就包括姓名,年龄,性别等信息。而cookie是存在于客户端的,将用户详细信息通过网络发送到客户端保存是极不安全的。且cookie大小不能超过4k,不能支持中文。这就限制cookie不能满足存储用户信息的需求。这就需要一种机制在服务器端的某个域中存储一些数据,这个域就是session。

总而言之,cookie/session的出现就是为了解决http协议无状态的弊端,为了让客户端和服务端建立长久联系而出现的。

2.什么是会话技术?

帮你存储一些在交互过程临时产生的数据

当你打开浏览器,访问一个网站,认为会话开始了,当你关闭浏览器的时候,会话结束了

接下来先详细介绍cookie,session和token,当你充分了解他们之后,就会发现他们的区别

3.cookie详解

Cookie的表示

一般情况下,cookie是以键值对进行表示的(key-value),例如name=jack,这个就表示cookie的名字是name,cookie携带的值是jack。

Cookie的组成

下面我自己写了一个简易Servlet来设置cookie,我们游览器抓包进行查看。然后进行分析

以下是cookie中常用属性的解释。

Name:这个是cookie的名字

Value:这个是cooke的值

Path:这个定义了Web站点上可以访问该Cookie的目录

Expires:这个值表示cookie的过期时间,也就是有效值,cookie在这个值之前都有效。

Size:这个表示cookie的大小

Cookie的HTTP传输

我们还是通过抓包进行查看。首先查看cookie在HTTP请求中是怎样进行表示的。

HTTP请求

我们在发送HTTP请求时,发现游览器将我们的cookie都进行了携带(注意:游览器只会携带在当前请求的url中包含了该cookie中path值的cookie),并且是以key:value的形式进行表示的。多个cookie用;进行隔开。

我们再来查看cookie在HTTP响应中是如何进行表示的。

HTTP响应

我在服务器设置了2个cookie,返回给游览器。通过抓包,我们发现在HTTP响应中, cookie的表示形式是,Set-Cookie:cookie的名字,cookie的值。如果有多个cookie,那么在HTTP响应中就使用多个Set-Cookie进行表示。

Cookie的生命周期

cookie有2种存储方式,一种是会话性,一种是持久性。

会话性:如果cookie为会话性,那么cookie仅会保存在客户端的内存中,当我们关闭客服端时cookie也就失效了

持久性:如果cookie为持久性,那么cookie会保存在用户的硬盘中,直至生存期结束或者用户主动将其销毁。

cookie我们是可以进行设置的,我们可以人为设置cookie的有效时间,什么时候创建,什么时候销毁。

cookie执行流程

当你去访问应用的时候,来到服务器。服务器设置一个cookie(后边介绍api),在做响应的时候会通过set-cookie响应头将cookie带给浏览器。

来到浏览器,浏览器会将此数据保存起来,接下来再次去访问服务器的时候,浏览器会根据cookie的path属性(后边api介绍)将这些数据带回去(设置了一个叫做cookie的请求头),来到服务器,服务器有对应的api获取这些值,有了值就知道用户是谁了。

4.session

session机制,原理

session是服务端存储的一个对象,主要用来存储所有访问过该服务端的客户端的用户信息(也可以存储其他信息),从而实现保持用户会话状态。但是服务器重启时,内存会被销毁,存储的用户信息也就消失了。

不同的用户访问服务端的时候会在session对象中存储键值对,“键”用来存储开启这个用户信息的“钥匙”,在登录成功后,“钥匙”通过cookie返回给客户端客户端存储为sessionId记录在cookie中。当客户端再次访问时,会默认携带cookie中的sessionId来实现会话机制。

session是基于cookie的。

  • cookie的数据4k左右
  • cookie存储数据的格式:字符串key=value
  • cookie存储有效期:可以自行通过expires进行具体的日期设置,如果没设置,默认是关闭浏览器时失效。
  • cookie有效范围:当前域名下有效。所以session这种会话存储方式方式只适用于客户端代码和服务端代码运行在同一台服务器上(前后端项目协议、域名、端口号都一致,即在一个项目下)

session持久化

用于解决重启服务器后session就消失的问题。在数据库中存储session,而不是存储在内存中。通过包:express-mysql-session

其它

当客户端存储的cookie失效后,服务端的session不会立即销毁,会有一个延时,服务端会定期清理无效session,不会造成无效数据占用存储空间的问题。

session执行流程

浏览器发起一个请求到服务器,服务器先检查你是否携带了一个叫做JSESSIONID的cookie。

如果有携带,会将此cookie的值取出来(比如为aaa123),然后从服务器的session池中找到ID为aaa123的session返回给调用者。

如果没有携带这个JSESSIONID的cookie,那么服务器将会自动创建一个session对象并且生成一个随机字符串(如aaa123)作为此session的ID保存到session池中。在服务器为客户端浏览器作响应的时候自动创建一个键为“JSESSIONID” 值为“aaa123”的cookie对象让浏览器储存起来以便下次再访问的时候带过来。

5.cookie/session的区别与联系

区别:

1.cookie存放在客户端,session存放在服务器端。

2.cookie只能存放4k的数据,而session理论上没有做限制

联系:

session虽说存放在服务器端,但是仔细看刚才的执行流程你会明白,session是依赖于cookie的,这一点也是本篇文章想要着重强调的

7.cookie/session使用注意事项

1.cookie大小有限制 4k

2.cookie不能跨浏览器

3.cookie不支持中文

4.如果是安全性较高的数据应存放在session中,因为cookie存放在客户端总会轻易被不法分子获取

5.如果是访问量特别大的网站,尽量不要在session中存储用户数据,因为每个用户存一个session会给服务器造成很大的压力

但需要注意的是,若服务器做了负载均衡,用户的下一次请求可能会被定向到其它服务器节点,若那台节点上没有用户的Session信息,就会导致会话验证失败。所以Session默认机制下是不适合分布式部署的。

6.session和token有什么区别?

Token的出现是为了解决Session的弊端

Token我们一般称为令牌,一般通过MD5、SHA算法将密钥、公钥、时间戳等元素加密产生的加密字符串。

浏览器访问Web服务器后认证成功后生成Token并返回给客户端,客户端浏览器后续的请求都会把这个Token带到服务器端去验证,以此判定请求是否合法。

Session与Token的异同

Session和Token机制原理上差不多,都是用户身份验证的一种识别手段,它们都有过期时间的限制,但两者又有一些不同的地方。

1、Session是存放在服务器端的,可以保存在:内存、数据库、NoSQL中。它采用空间换时间的策略来进行身份识别,若Session没有持久化落地存储,一旦服务器重启,Session数据会丢失。

2、Token是放在客户端存储的,采用了时间换空间策略,它也是无状态的,所以在分布式环境中应用广泛。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值