主题
cookie、session、token三兄弟
1、cookie、session、token三者区别
1.1 http无状态
由于http是无状态的,涉及到登录这种功能的时候,需要一种东西来存储用户登录状态,否则,即使刚刚登录了,发请求,服务器还是不认识你是谁。
cookie、session、jwt都可以用来制造状态,但是三者都有自己的特点。
1.2 三者区别
1.2.1 cookie
1)cookie基本原理
原理:
- 用户输入用户名密码登录,登陆成功后,服务端将用户的一些信息设置进入cookie
- 用户之后继续访问网站,会默认携带上cookie,此时服务器就知道是谁访问的自己了
- 当用户访问退出登录,服务器会删除用户的cookie
- 之后用户再访问网站,由于cookie被删除了,因此服务器就不知道是谁在访问自己了。
2)cookie的特点
- 客户端可以设置cookie,服务器也可以设置cookie
- 每次发请求会默认携带cookie
- cookie存在客户端(浏览器),用户可以随意操作它,不安全,不能用于存放敏感信息
- cookie存放的内容有大小限制,一个站点,一般最多允许20个cookie,总大小不超过4kb。
1.2.2 session
1)session基本原理
首先明确一点,session是基于cookie的,通过cookie的机制,制造一个服务端存储空间(对象)一般为内存,cookie存储于客户端,session存储于服务端 。
原理:
- 用户登录成功后,服务端会根据用户信息生成一个
session
,里面包含sessionID
,是唯一的,并将这个sessionID设置进入客户端的cookie里面。 - 用户再次访问服务器,会自动带上cookie,里面就有sessionID
- 服务端拿到sessionID,进行比对,有效则返回数据,无效就返回无效。
2)session的特点
- session相对于cookie机制,安全性得到了保障
- session存储于服务器内存,请求的用户多了会增加服务器压力,且重启服务器会丢失。
- 可以使用redis,或mongoDB来储存session,但这样,多个平台共享状态的问题,
- 多个平台共享状态,可以每个平台当读同步一份登录状态,这样也是造成服务器压力,若抽离用户状态,让多个平台都用这个服务的状态,有点烂费资源,在者,这个服务挂了,所有平台的登录状态都失效。
1.2.3 tooken(JWT)
1)token登录原理
这里说的是token登录的原理,而不是jwt生成token的原理,jwt原理可以查看《JWT在Nodejs中的使用》 原理:
- 用户登录成功,服务端用jwt + jwt秘钥 + 将用户信息 生成一个token,并将这个token返回给浏览器
- 浏览器将这个token存起来,可以是本地存储localStorage、sessionStorage,也可以是cookie
- 当再次发请求时候,带上token,一般放到headers里面,服务端受到请求,会用秘钥对token进行解密
- 解密成功,说明token是有效的,会得到token里面存储的信息
- 解密失败说明token是伪造的
2)token登录的特点
- token存储于客户端,服务端不需要存储,即使同时登录的用户再多,服务器压力也不会很大(登录造成的压力)
- token是用cpu的计算能力换取服务器的内存存储空间
- token机制是将信息都存储于token这段文本内,而且这段文本是经过特殊加密算法加密后生成的,即使被盗用,也没那么容易被解密。
- jwt生成的token无法自动失效,若要失效,可以借助与redis之类的工具。