HTTP 协议是一种无状态协议 ,即每次服务端接收到客户端的请求时,都是一个全新的请求,服务器并不知道客户端的历史请求记录;Session 和 Cookie 的主要目的就是为了弥补 HTTP 的无状态特性。简单来说,比如我登录淘宝网,点击我的购物车,会发起一个网络请求,因为http协议是无状态的,淘宝网并不知道是我发起的请求,会在需要输入用户密码,这显然不合理,cookie及session可以理解为在每次请求时保存我个人的信息。
Cookie
HTTP 协议中的 Cookie 包括 Web Cookie 和浏览器 Cookie,它是服务器发送到 Web 浏览器的一小块数据。服务器发送到浏览器的 Cookie,浏览器会进行存储,并与下一个请求一起发送到服务器。通常,它用于判断两个请求是否来自于同一个浏览器,例如用户保持登录状态。
浏览器发起请求,服务器会进行cookie设置也就是set-cookie, cookie一般是kv结构,cookie发给浏览器之后,浏览器会保存起来,以后每个请求会带上这个cookie,这就免除了上面举例的每次都输入账户密码的繁琐
?
cookie不足
如果简单的把账号密码存在cookie中,他人很容易通过浏览器拿到cookie,此时你的账户密码就完全暴露在别人面前,显然这很不安全。
Session
session可以说是cookie的进化版,session主要包含了session Id和结束会话时间,此时我们登录淘宝网,输入账号密码,淘宝网服务器验证我们的账号密码,并生成一个session Id和结束时间(一般是确定的 设置好的) 这时,服务器把sessionId加入到cookie中,并把cookie有效期设置为session中的时间。
session较cookie优势
即使他人拿到了我浏览器里面包含了session的cookie,他也无可奈何,因为session只是一段随机的字符串,其次服务器发送cookie之前会对含sessionId的cookie签名,防止了篡改的发生
token
首先需要简单了解以下JWT也就是JSON WebToken,用户输入账户密码,会生成一个JWT,服务器只用保存JWT签名和密文,接着把JWT发送给浏览器,和session类似,以后每次用户发送请求便不需要输入账户密码了
jwt一般由三部分组成:
?
header部分声明使用的签名算法,payload一般是特定的数据,比如有效期,header和payload会用base64编码(不是加密)再由header声明的算法得到signature,
(ssm后端中JWT类)
?总结:session诞生并保存在服务器,服务器主导一切,cookie可以看成session的数据载体(当然自己也可以实现用户的登录状态验证),cookie跟随每个HTTP请求发送,token诞生于服务器,保存于浏览器,token就像一个令牌,有了它便可以访问服务器。
本文参考自b站Cookie、Session、Token究竟区别在哪?如何进行身份认证,保持用户登录状态?_哔哩哔哩_bilibili
? ?
|