2021-07-07
https://www.jianshu.com/p/4a00c0c3bf1d
主要内容
- 鉴权的作用
- 几种常见的鉴权
- 各个鉴权的适用场景
一、什么是鉴权
鉴权是指验证用户是否有权利访问系统的行为。
二、目前常见的鉴权方式
常见的鉴权方式有以下4种方式:
- HTTP Basic Authentication
- token
- session + cookie
- OAuth
2.1 HTTP Basic Authentication鉴权方式
这是HTTP协议实现的基本认证方式,我们在浏览网页时,从浏览器正上方弹出的对话框要求我们输入账号密码,正是使用了这种认证方式。
2.1.1 HTTP Basic Authentication鉴权方式的流程
2.1.2 HTTP Basic Authentication鉴权方式的注销
认证成功后,客户端每次发送请求都会带上Authorization头部参数,除了使session过期外,客户端如何主动注销登录呢?下面是一种解决方案:
首先需要服务端专门设置一个专门用于注销的账号,客户端主动去修改请求头Authorization信息,当服务端读取到是这个专用于注销的账户,就执行注销流程。
2.1.3 HTTP Basic Authentication鉴权方式的适用范围
这种认证方式存在缺陷,首先它把加密后的账密直接放在请求头,加上base64加密的方式是可逆的,这样账密就容易泄露。所有这种认证方式一般用于对安全要求性不高的系统上。
2.2 token鉴权方式
2.2.1 token鉴权方式流程
- 客户端使用账密登录
- 服务端验证账密
- 账密验证通过,服务端生成一个token,再把token发送给客户端
- 客户端通过cookie或者其他方式将token存储起来
- 客户端以后发送请求都需要带上token
- 服务端验证token的合法性,校验通过则返回资源,不通过则返回401状态码
2.2.2 token鉴权方式适用场景
token验证比较灵活,适用于大部分场景。
常用的token鉴权方式的解决方案是JWT,JWT是通过对带有相关用户信息的json进行加密,加密的方式比较灵活,可以根据需求具体设计,这里就不做过多介绍。
2.3 session + cookie鉴权方式
2.3.1 session + cookie鉴权方式的问题
session一般是存在内存里的,随着用户的增多,服务器的开销也明显变大了。
以上问题可以通过适当增加服务器来满足需求,但这样session的认证方式就会出现问题,比如已登录的用户session存在服务器A上,可是由于负载均衡,下次请求到了另一台服务器B上,服务器B没有保存session,则又要求用户再次登录,这明显是不合理的。
Tomcat服务器提供了集群之间session共享的解决方案,不同服务器之间通过复制更新session的方式来共享session,但如果集群的数量很多,检查和复制的行为会占去一定资源,因此这种方式在服务器比较多的情况下是不理想的。
如果通过哈希的方式某个用户请求路由到某一台服务器上,那么这个用户只需在这台服务器上保存session,可以解决上述问题,但同时这也限制了集群负载均衡的能力,可能会出现某一时刻,大量的请求到达某一台服务器,但是其他服务器又相对空闲的情况。
最后一点,由于sessionid是基于cookie存储的方式保存,如果cookie被截获,用户就容易受到跨站请求伪造的攻击,这是不安全的。
2.4 OAuth鉴权方式
请看--》身份认证系统OAuth2的四种模式
作者:n油炸小朋友
链接:https://www.jianshu.com/p/4a00c0c3bf1d
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。