认证和授权
- 认证:(你是谁)是验证身份的凭据,通过这个凭据,系统就知道你是你。
- 授权:(你有权限干什么)掌管我们访问系统的权限。
RBAC模型
系统权限控制最常用的访问控制模型就是RBAC模型。RBAC即基于角色的权限访问控制,这是一种通过角色关联权限,角色同时又关联用户的授权的方式。在RBAC中,权限与角色关联,这样就极大的简化了权限的管理。
简而言之,一个用户可以拥有多个角色,每一个角色又可以被分配若干个权限,这样就构成了“用户-角色-权限”的授权模型。
Cookie & session & token
cookie和session都是用来跟踪浏览器用户身份的会话方式,但是两者的应用场景不太一样。
cookie:某些网站为了辨别用户身份而储存在用户本地终端上的数据。cookie存放在客户端,一般用来保存用户信息。
- cookie数据保存在客户端(浏览器),session数据保存在服务器端。相对来说session安全性更高。如果使用cookie的一些敏感信息不要写入cookie中,最好能将cookie信息加密然后使用到的时候再去服务端解密。
session:通过服务端记录用户的状态。
- token/JWT
- JWT本质上是一段签名的JSON格式的数据,由于它是带签名的,因此接收者便可以验证它的真实性。JWT由三部分组成:
- Header:描述JWT的元数据,定义了生成签名的算法以及token的类型。
- Payload:用来存放实际需要传递的数据。
- Signature(签名):服务器通过Payload、Header和一个密钥secret使用Header里面指定的签名算法(默认是SHA256)生成。
- JWT本质上是一段签名的JSON格式的数据,由于它是带签名的,因此接收者便可以验证它的真实性。JWT由三部分组成:
多服务器节点下session-cookie方案如何做 ?
举个例子:假如我们部署了两份相同的服务 A,B,用户第一次登陆的时候 ,Nginx 通过负载均衡机制将用户请求转发到 A 服务器,此时用户的 Session 信息保存在 A 服务器。结果,用户第二次访问的时候 Nginx 将请求路由到 B 服务器,由于 B 服务器没有保存 用户的 Session 信息,导致用户需要重新进行登陆。
考虑如下几种方案:
- 某个用户的所有请求都通过特性的哈希策略分配给同一个服务器处理。这样的话每个服务器都保存一部分用户的session信息,服务器宕机后其保存的所有session信息就完全丢失了。
- 每一个服务器保存session信息都是互相同步的,也就是说每一个服务器保存了全量的session信息。每当一个服务器的session信息发生变化,我们就将其同步到其他服务器,这种方案成本太大,并且节点越多同步成本也越高。
- 单独使用一个所有服务器都能访问到数据节点(比如缓存)来存放session信息。为了保证高可用,数据节点要尽量避免是单点。
如果没有cookie,session还能用吗?
一般是通过cookie来保存sessionID。假如使用cookie保存sessionID,如果客户端禁用了cookie,那么session就无法正常工作。但是不是没有cookie之后就不能使用session,可以将sessionID放在请求url里面。这种方案的话可行,但是安全性和用户体验感降低。也可以对sessionID进行加密之后再传入后端。
为什么cookie无法防止CSRF攻击,而token可以?
CSRF一般被翻译为跨站请求伪造(用你的身份去发送一些对你不友好的请求)。
进行session认证的时候,我们一般使用cookie来存储sessionID,当我们登陆后后端生成一个sessionID放在cookie中返回给客户端,服务器端通过redis获取其他存储工具保存着这个sessionID ,客户端登录以后每次请求都会带上这个sessionID,服务器端通过这个sessionID来标示你这个人,如果别人通过cookie拿到sessionID后就可以代替你的身份访问系统了。
session认证中cookie中的sessionID是由浏览器发送到服务端的,借助这个特性,攻击者就可以通过让用户误点攻击链接,达到攻击的效果。
但是我们使用token的话就不会存在这个问题,在我们登录成功获得token之后,一般会存放在localStorge(浏览器本地缓存中)。然后我们在前端通过某些方式会给每个发到后端的请求加上这个token,这样就不会出现CSRF漏洞的问题。因为即使你点击了非法链接发送了请求到服务端,这个非法请求是不会携带token的,所以这个请求将是非法的。
如何基于token进行身份验证 ?
在基于token进行身份验证的应用程序中,服务器通过Payload、Header和一个密钥(secret)创建令牌(token)并将token发送给客户端,客户端将token保存在cookie或者localstorge里面,以后客户端发出的所有请求都会携带这个令牌。你可以把它放在cookie里面自动发送,但是这样不能跨域,所以更好的做法是放在HTTP Header的Authorization字段中:Authorization: Bearer Token
。
什么是SSO ?
单点登录:用户登录多个子系统的其中一个就有权访问与其相关的其他系统。
什么是OAuth2.0?
OAuth是一个行业的标准授权协议,主要用来授权第三方应用获取有限的权限。它的最终目的是为第三方应用颁发一个有时效性的令牌token,使得第三方应用能够通过该令牌获取相关资源。
OAuth2.0比较常见的应用场景就是第三方登录,当你的网站接入了第三方登录的时候一般就是使用OAuth2.0协议。