session、token、cookie、JWT的区别一定要懂

一、基本概念

1.1 认证

认证authentication,指的是验证访问者的身份

  • 常见认证方法
    • 用户名密码认证
    • 短信验证码认证
    • 邮箱验证码认证
    • 扫码认证
    • 人脸识别或者其他生物特征识别认证
1.2 授权

授权authorization,指的是用户通过身份认证后,能够访问指定的某些资源

  • 常见授权模型—3种
    • ACL(Access Control List):ACL中包含用户资源资源操作三个关键内容。通过将资源以及资源操作授权给用户,使得用户具有操作某项资源的权限
    • RBAC(Role-Based Access Control):对用户进行角色分类,通过角色来判断用户是否拥有对某种资源的资源操作权限
    • ABAC(Attribute Base Access Control):基于计算一个或者一组属性是否满足某条件来判断是否有操作权限
1.3 鉴权凭证

首次进行用户登录之后,服务端会发给客户端一个用户凭证,表示这个用户已经通过认证,之后的请求,用户只需要携带上这个凭证来证明自己的身份就好。

  • 鉴权凭证分类—根据存储方式
    • 基于单机的session
    • 需要存储的token
    • 不需要存储的JWT

二、Cookie和Session的区别

安全性:Seesion比Cookie安全,Session存储在服务器端,Cookie存储在客户端

存取值的类型不同:Cookie只支持字符串数据类型,想要设置其他数据类型需要转换成字符串。Session可以存储任意类型

有效期不同:Cookie有效期长,比如默认登录状态。Session一般失效时间短,客户端会话浏览器关闭/session超时都失效。

存储大小不同:Cookie单个数据保存大小4K,Session保存的内存空间远大于cookie,但访问量过多也会造成占用服务器资源

三、Token和Session的区别

sessionid是连接cookie和session的桥梁

①Session是一种记录服务器和客户端会话状态的机制,使服务端有状态变化,可以记录会话信息。Token是令牌,访问资源接口API时所需要的资源凭证,使服务端无状态变化,不会存储会话信息。

②sessionid以及id所代表的客户端信息都保存在内存/数据库,sessionid在服务端也会保存。token私钥签名保存在数据库,不保存会话信息。

③sessionid是无规则的随机数,由服务端在客户端登陆后随机生成。Token是身份信息和签名生成的,是一个整体传给客户端。token和sessionid都可以保存在客户端的Cookie/Local Storage中。

④sessionid是服务端设置在cookie中,客户端每次请求都会带上sessionid。token是通过响应体返回给客户端,存储在cookie/local Strorage,客户端再次请求不会默认带上token,但是可以在请求头Authorization携带token。

⑤Session和Token并不矛盾,身份认证token安全性比session高。token每个请求都有签名,能防止监听和攻击,session必须依赖链路层来保证通信安全。

⑥session只提供一种简单的认证,只要由sessionid就有user的全部权限。Token是令牌,代表执行某些操作的权限。OAuth Token或者类似机制提供 认证授权,认证针对用户,授权针对第三方app,目的是让第三方app拥有访问用户资源的权限,token唯一,不可移植。

四、Token和JWT的区别

相同点

①都是访问资源的令牌

②都可以记录用户的信息

③使服务端无状态变化

④都是只有验证身份成功后,客户端才能访问服务端上受保护的资源。

不同点

①Token是服务端验证客户端发送的Token时,需要去数据库查询获取用户信息,然后验证token是否有效。

②JWT是将Token和Payload加密存储与客户端,服务端使用解钥解密校验即可,减少查询数据库,JWT自包含用户信息和加密的数据。

五、JWT、Session、Cookie的区别

相同点

JWT、Session、Cookie都提供安全的用户身份认证

不同点

①JWT具有加密签名,Session和cookie没有

②JWT无状态,声明存储在客户端,而不是存储在服务端内存。Cookie和Session有状态,存储在服务器内存中。

③JWT身份验证在本地,不需要请求查询数据库,减少大量的资源消耗,可以对用户进行多次身份验证。Session和Cookie验证的过程会消耗大量的服务器资源。

④Session和Cookie只能用在单个节点的域或者它的子域中有效,第三个节点访问会被禁止,不可跨域。JWT支持跨域认证,能够通过多个节点进行用户认证,就是跨域认证。

六、简单总结

Cookie:保存在客户端,大小有限制,有状态,除非特殊情况客户端每次请求头都会默认带上cookie

Session:保存在服务器,服务器有一定的资源开销,允许第三方调用API接口,不跨域,不实现与第三方共享资源。

Token:保存在客户端,保存在任何地方,无限制,无状态

JWT:加密数据签名,自包含用户信息,减少查询数据库,分担服务器的资源压力,无状态,可以跨域认证。

七、使用cookie考虑问题

①存储在客户端,数据容易被篡改,使用前需要验证合法性

②敏感数据一般不存放在cookie,不安全。

③使用httpOnly在一定程度上可以提高安全性

④存储数据有限制,一般是4KB,减少大数据内存的存储,cookie体积的占用。一个浏览器对一个网站最多存放20个cookie,浏览器一般只允许存放300个cookie。

⑤设置正确的domain、path,减少数据传输

⑥cookie不可以跨域

⑦移动端对cookie支持性不良好,session也是基于cookie实现,移动端一般用token

八、使用session考虑问题

①session存储在服务器内存,同时多用户在线,session会占据更多的内存,需要定期去服务端清除过期的session。

②sessionid存储在cookie,是连接cookie和session的桥梁。浏览器禁止cookie不支持cookie,需要重写url。session基于cookie实现,但是不一定非要靠cookie才能实现。

③网站采用集群部署的时候,多台web服务器之间无法共享session。session是单个服务器创建,处理用户请求不一定是同一台服务器,其他的服务器无法拿到之前放入单个服务器的session登录凭证信息。

④session跨域问题,多个应用共享session时候,不同的引用部署在不同的主机,需要在各个应用之间做好cookie跨域处理。

⑤移动端对cookie支持性不良好,session基于cookie实现,移动端一般用token

九、使用token考虑问题

①token完全由应用管理,所以它可以避开同源策略

②token存储在数据库中查询时间过长,可以考虑放在内存中,比如redis

③token可以避免CSRF攻击

④移动端常用token

十、使用JWT考虑问题

①JWT不依赖cookie,使用任何域名提供API服务而不需要担心跨域资源共享问题(CORS)

②JWT默认不加密,但也可以加密。生成原始token以后,可以用密钥再次加密。JWT不加密情况不建议把敏感数据放入其中

③JWT不仅用于用户登录,也可以用于信息交流。JWT可以减低查询数据库的次数。

④优点是服务器不再需要存储session,服务器认证鉴权有更好的可扩展性。

⑤缺点是服务器不再需要存储session,无法废弃token或者更改token权限。JWT一旦签发直到过期之前都有效。

⑥JWT自包含用户信息,一旦泄漏,任何人都可以盗用令牌的权限。为了减少盗用JWT有效期应该尽量的短。

⑦JWT适合签发一次性的命令认证,颁发有限期极短的JWT,减少暴露的危险。每次操作都会生成新的JWT,不需要保存,实现真正的无状态。

⑧减少盗用,JWT使用HTTPS传输协议较好,不建议使用HTTP。

猜你喜欢

转载自blog.csdn.net/weixin_45709829/article/details/124003742