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。

  • 4
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: SessionCookieTokenJWT都是在Web开发中用于管理用户身份认证和会话管理的工具。 1. SessionSession指的是服务器端保存的用户信息。当用户登录成功后,服务器会创建一个session,为该用户分配一个session ID,并将该ID保存到cookie中,发送给客户端。客户端浏览器保存了这个cookie,以后每次请求都会带上这个cookie,服务器通过这个cookie就可以识别出用户身份,从而进行相应的操作。Session机制存在一定的风险,比如会话劫持、会话固定等问题,需要注意安全性。 2. CookieCookie是一种客户端保存用户信息的机制,它是由服务器在响应HTTP请求时通过Set-Cookie头部字段发给客户端浏览器的一小段文本信息。浏览器将这些信息保存在客户端,以后每次向服务器发送请求时都会自动带上这些cookie,从而实现身份认证和会话管理。但是Cookie也存在一些安全问题,比如会话劫持、跨站脚本攻击等问题。 3. TokenToken是一种用户身份认证和授权的机制,通常由服务器生成,以便在客户端和服务端之间进行身份认证和授权。客户端在登录成功后,服务器会为该用户生成一个Token,并将Token发送给客户端浏览器。客户端在之后的请求中需要携带该Token,服务器验证Token的有效性后,就可以识别出用户身份,并进行相应的操作。Token相比SessionCookie,具有更高的安全性和可扩展性。 4. JWTJWT是一种基于Token的身份认证和授权机制。JWT包含三部分,分别是头部、载荷和签名。头部包含加密算法和类型等信息;载荷包含用户的身份信息和相关的元数据等信息;签名则是对头部和载荷进行签名生成的一段密文,用于验证Token的有效性。JWT具有无状态、可扩展、跨域等特点,被广泛用于Web开发中的用户身份认证和授权。 ### 回答2: SessionCookieTokenJWT都是常见的身份验证和会话管理方法。下面我会分别介绍它们。 SessionSession是服务器端记录用户状态的一种机制。当用户通过用户名和密码登录后,服务器会为该用户创建一个唯一的Session。之后,用户再发送请求时,服务器会根据Session来识别用户并获取用户的状态信息。 CookieCookie是一种在客户端存储的小型文本文件。在用户通过用户名和密码登录成功后,服务器可以将一个包含Session信息的Cookie发送给客户端,客户端会将该Cookie保存下来。之后,客户端发送请求时,会自动附带上该Cookie,用于向服务器证明用户的身份。 TokenToken是一种代表用户身份的令牌。与Cookie不同,Token是在客户端保存的,并且不需要服务器端存储用户状态。当用户登录成功后,服务器会生成一个Token并发送给客户端,客户端将其保存起来。之后,客户端发送请求时,会将Token作为请求头信息的一部分发送给服务器,服务器根据Token验证用户身份。 JWTJWT(JSON Web Token)是一种基于JSON的开放标准,用于在各方之间安全传输信息。它由三部分组成:Header、Payload和Signature。其中,Header用于描述JWT的元数据,Payload用于存储实际传输的数据,Signature用于验证JWT的合法性。在使用JWT进行身份验证时,服务器会生成一个JWT并发送给客户端,客户端将其保存起来。之后,客户端发送请求时,会将JWT作为请求头信息的一部分发送给服务器,服务器根据JWT验证用户身份的合法性。 总结:SessionCookieTokenJWT都是常用于身份验证和会话管理的方法,它们各有优劣和适用场景。SessionCookie依赖于服务器端存储用户状态,而TokenJWT则可以减轻服务器的负担,并且适用于分布式系统。其中,JWT由于其自包含性和可扩展性,在分布式系统和前后端分离的架构中得到了广泛应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

傲娇味的草莓

佛系少女只是想记录学习痕迹

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值