Web前端常见鉴权方式

177 阅读4分钟

1. session-cookie

这种方式是利用服务器端的 session(会话)和客户端的 cookie 来实现前后端的认证。由于 http 请求时是无状态的,服务器正常情况下是不知道当前请求之前有没有来过,如果我们需要记录状态,就需要在服务器端创建一个 session(会话),将同一个客户端的请求都维护在这个 session(会话)中,当请求到达服务器端的时候,先去查一下该客户端有没有在服务器端创建 session(会话),如果有则已经认证成功了,否则就没有认证。

session-cookie 认证过程

1.服务器在接受客户端首次访问时在服务器端创建 session,然后保存 session(我们可以将 seesion 保存在内存中,也可以保存在 redis 中,推荐使用后者),接着给这个 session 生成一个唯一的标识字符串,然后在响应头中返回给客户端。
2.签名,这一步只是对 session_id 进行加密处理,服务器会根据这个 secret 密钥进行解密(这步非必需)
3.客户端收到请求响应的时候会解析响应头,然后将 session_id 保存到本地 cookie 中,客户端在下次发起 http 请求时会在请求头中会带上这个 cookie 信息。
4.服务器在接受客户端请求时会去解析请求头 cookie 中的 session_id,然后根据这个 session_id 去找服务器端中该客户端的 session,然后判断该请求是否合法。

session-cookie 缺点

1.占资源:每个经过认证的用户都要存放 session 到内存中,随着认证用户的增多,服务端的开销也相应增大。
2.CSRF 攻击:基于 cookie 来进行用户识别时,用户的 cookie 如果被截获,就容易受到跨站请求伪造的攻击。

2. Token 验证(包括 JWT,SSO)

token 是用户身份的验证方式,我们通常叫:令牌。当用户第一次通过用户名和密码登录后,服务器生成 token 并将此 token 返回给客户端,以后客户端只需带上这个 token 前来请求数据就可以了,无需再次带上用户名和密码。
最简单的 token 组成:uid(用户唯一的身份标识)、time(当前时间的时间戳)、sign(签名,由 token 的前几位+盐以哈希算法压缩成一定长的十六进制字符串,可以防止恶意第三方拼接 token 请求服务器)。还可以把不变的参数也放进 token,避免多次查库。

token 认证过程

1.客户端通过用户名和密码请求登录
2.服务端收到请求,去验证用户名和密码
3.验证成功后,服务端会签发一个 Token,再把这个 Token 发送给客户端
4.客户端收到 Token 后把它存储起来,比如放在 Cookie 或 Local Storage
5.客户端再次向服务端请求资源时就带着服务端签发的 Token
6.服务端收到请求,然后去验证客户端请求里带着的 Token,如果验证成功就向客户端返回请求数据,否则返回 401(鉴权失败)

Token 优点

1.Token 可以避开同源策略(Cookie 是不允许跨域访问的,token 不存在)
2.Token 可以避免 CSRF 攻击(因为不需要 cookie)
3.Token 可以是无状态的,可以在多个服务间共享

Token 缺点

1.占带宽:正常情况下 token 要比 session_id 更大,需要消耗更多流量,挤占更多带宽
2.性能问题:相比于 session-cookie 来说,token 需要服务端花费更多时间和性能来对 token 进行解密验证

JWT(Json web Tokens)

JWT 原理

JWT 原理:服务器认证以后,生成一个 JSON 对象,发回给用户。之后用户与服务器通信的时候,服务器完全靠这个 JSON 对象认证用户身份。为了防止用户篡改数据,服务器在生成这个对象的时候,会加上签名。

单点登录(Single Sign On)

单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一。

OAuth(开放授权)

OAuth 是一个开放标准,允许用户授权第三方网站访问存储在另外服务器上的资源,而不需要将用户名和密码提供给第三方网站。

OAuth2.0 授权流程

1.客户端请求用户授权
2.授权服务器询问用户是否同意授权
3.用户确认授权,授权服务器下发授权凭证
4.客户端携带用户授权凭证请求访问令牌
5.授权服务器验证客户端身份和授权凭证,如果验证成功就下发访问令牌
6.客户端携带访问令牌请求用户受保护资源,资源服务器验证访问令牌,验证成功返回对应的用户数据