一、基本概念
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,不安全。
③使用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。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/16131.html