部分转载自:https://zhuanlan.zhihu.com/p/124651859
cookie是一种缓存机制,session是会话机制。
在Web开发中用于跟踪和管理用户状态。
Cookie 概述
Cookie 是网站为了标示用户身份而储存在客户端(Client Side)上的数据(通常经过加密)(数据大小不能超过 4 k)。cookie数据始终在同源的http请求中携带(即使不需要),会在浏览器和服务器间来回传递。
-
当用户访问一个网站时,服务器可以通过HTTP响应将一个或多个Cookie发送给客户端(在响应头上设置set-cookie字段),客户端的浏览器会将这些Cookie保存起来。
-
当用户再次访问同一个网站时,浏览器会通过HTTP请求将相应的Cookie发送回服务器(将cookie携带在请求头上)。通过使用Cookie,服务器可以存储和读取有关用户的信息,例如用户的偏好设置、登录状态等,并进行验证。
-
Cookie可以设置过期时间,可以在浏览器关闭后仍然保留,也可以设置为仅在当前会话有效。
Session 概述
Session是一种在服务器端存储用户状态的机制。
-
当用户访问一个网站时,服务器会为每个用户创建一个唯一的会话,并为该会话分配一个唯一的会话ID。
-
这个会话ID可以通过Cookie发送给客户端保存(可存储在cookie或者localStorage中),或者通过URL参数进行传递。服务器会将用户的会话数据存储在服务器上,可以是内存、数据库或其他持久化存储。
-
通过会话,服务器可以跟踪用户在网站上的活动和状态。会话数据可以包含用户的认证信息、购物车内容、用户的临时数据等。每次请求携带该会话信息(cookie自动携带,localStorage取出后携带)。
-
服务器收到请求后,判断是否过期。
与Cookie不同,Session数据存储在服务器上,客户端只保存了会话ID,因此相对来说更安全。
本质都是利用cookie或者localStorage进行数据交互,而他们俩都有跨域的限制,cookie可以设置domain实现一级域名下的二级域名之间可以相互访问,而localStorage不能跨域。
用户登录流程
- 连接服务器端后,得到一个session状态(匿名会话),返回给前端
- 登录成功后,得到了登录成功的session,并且给该session设置一些值(比如用户信息) ,返回给前端一个设置 cookie 的"命令"——session => cookie
- 前端接收到后端的命令后,设置cookie,保存到浏览器内
- 前端再次请求后端的时候(相同的域名),在请求头中带上cookie去请求
- 后端拿到前端传来的cookie,找到对应的session,后端从session中可以取出基于该session存储的变量(用户的登录信息、登录名)
以最常见的登录案例讲解cookie的使用过程:
(1)首先用户在客户端浏览器向服务器首次发起登录请求
(2)登录成功后,服务端会把登录的用户信息设置在cookie 中,并将cookie返回给客户端浏览器
(3)客户端浏览器接收到 cookie 请求后,会把 cookie 保存到本地(可能是内存,也可能是磁盘,看具体使用情况而定)
(4)以后再次访问该 web 应用时,客户端浏览器就会把本地的 cookie 带上,这样服务端就能根据 cookie 获得用户信息了
同样以登录案例为例子讲解 session 的使用过程:
(1)首先用户在客户端浏览器发起登录请求
(2)登录成功后,服务端会把用户信息保存在服务端,并返回一个唯一的 session 标识给客户端浏览器。
(3)客户端浏览器会把这个唯一的 session 标识保存在起来
(4)以后再次访问 web 应用时,客户端浏览器会把这个唯一的 session 标识带上,这样服务端就能根据这个唯一标识找到用户信息。
看到这里可能会引起疑问:把唯一的 session 标识返回给客户端浏览器,然后保存起来,以后访问时带上,这难道不是 cookie 吗?
没错,session 只是一种会话机制,在许多 web 应用中,session 机制就是通
过 cookie 来实现的。也就是说它只是使用了 cookie 的功能,并不是使用 cookie
完成会话保存。与 cookie 在保存客户端保存会话的机制相反,session 通过 cookie
的功能把会话信息保存到了服务端。
session和cookie有什么区别?
(1)cookie 是浏览器提供的一种缓存机制,它可以用于维持客户端与服务端之间的会话。
(2)session 指的是维持客户端与服务端会话的一种机制,它可以通过 cookie 实现,也可以通过别的手段实现。
(3)如果用 cookie 实现会话,那么会话会保存在客户端浏览器中。
(4)而 session 机制提供的会话是保存在服务端的。
(5)Cookie适用于存储较小量的数据并在客户端进行状态管理,而Session适用于存储较大量的数据并在服务器端进行状态管理。
在实际应用中,Cookie常用于跟踪用户的登录状态、保存用户的偏好设置等,而Session经常用于存储用户的会话数据、购物车内容等。
需要注意的是,Cookie中存储的数据可以被客户端修改,因此对于敏感数据和安全性要求较高的情况,应该使用安全的方式进行存储和传输,例如使用加密算法对数据进行加密,并使用HTTPS进行安全传输。
session + cookie 的问题
session 需要服务端存储,首先是占用服务器空间,其次分布式部署时,还需要考虑session的共享。
jwt就不需要服务器存储了,而且在分布式场景时,只要多台服务器共用一个 key 就能验证登录信息。
session是存储在服务器上的程序里,如果我有多台服务器,部署了相同的程序,那么用户只有登录的那个程序是存储session,当负载均衡的时候随机到其他服务器,那么就取不到这个session,那就得更改session存储方式。

555

被折叠的 条评论
为什么被折叠?



