用户鉴权

158 阅读4分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第9天,点击查看活动详情

用户鉴权

为什么会出现?HTTP协议是无状态的,一次请求对应一个响应,后续的系统操作,需要重新请求服务器。也就是说服务器无法识别客户端请求属于哪个用户发送的请求。为了维持前后请求,需要前端存储标记。

三种方式

1. Cookie

用户在登录之后将用户的id或者用户账户发送到客户端,客户端保存Cookie,客户端每次请求时自动带上保存的Cookie,服务器接收到请求时,取出Cookie的用户id来鉴别用户。

但是这种方式较为不安全,因为用户id、用户名这些信息都暴露在Cookie里。

cookie里有配置可以设置过期时间

补充面试题:

cookie是什么? Cookie是直接存储在浏览器中的一小串数据,是HTTP协议中的一部分,通常用于记录会话状态(登陆状态,购物车),个性化设置(自定义设置、主题),浏览器行为跟组。

Cookie\localStorage\sesssionStorage的区别:

CookieLocalStorageSessionStorage
存储的数据每次请求都会被发给服务器; 服务端可以通过HTTP header 操纵存储对象; 请求大小有限,不能存太大的数据; 作用域为域/路径在同源的所有标签页和窗口之间共享数据 数据不会过期,在浏览器/系统重启之后还在数据只存在于当前标签页,即使同源的另一标签页也是不同数据; 统一标签页下的同源iframe之间是共享的 页面绘画的数据在浏览器打开期间存在,重新加载当前页仍存在,但浏览器/系统重启后则不会保留

2. Cookie+Session

为了安全加上Session。Session接受请求之后保存一个会话id到服务器内存中,通过Cookie将此id发送给客户端,同样客户段每次请求是带上这个Cookie与服务器保存的Session ID对来鉴别用户。因为Cookie不保存用户信息,所以较为安全,但是降低了服务器性能,因为服务器需要在内存保存Session数据。

img

服务器只会返回cookie一个session id,所以session的具体内容可以自己保存,推荐使用Redis保存,存的快,宕机后丢失,并且可以通过redis设置过期时间

Session比cookie安全是因为Session是动态生成的,而且会过期,Cookie也会过期,但是他每次保存的Cookie的id是数据库里对应用户的那个id,每次都是一样的。而session id 每次都会重新生成,所以会不同。

3. Token

前后端分离后产生Token。Token使用非对称加密,密钥保存在服务器中,服务器将用户id写入Token,并对其加密发送给客户端。客户端接受后保存到本地,每次请求带上这个Token,Token通过密钥解析出用户id来鉴别用户。Token的编码技术通常基于base64,或者增加加密算法防篡改,jwt是一种成熟的编码方法。

token流程:

  1. 用户登录,服务端校验账号密码,获取用户信息
  2. 把用户信息,token配置编码成token,通过cookie set到浏览器
  3. 此后用户请求业务接口,通过cookie携带token
  4. 接口校验token有效性,进行正常业务接口处理

总结,以上三种用户鉴权方式都存在过期时间,一旦过期,及时请求单上鉴权,服务器校验时依然会返回登陆过期提示给客户端。

token过期

一种办法是,让用户重新登录获取新 token,显然不够友好,要知道有的 access token 过期时间可能只有几分钟。另外一种办法是,再来一个 token,一个专门生成 access token 的 token,我们称为 refresh token。

JWT

JWT是什么? JSON Web Token,通过数字签名的方式,以JSON对象为载体,在不同的服务终端之间安全地传输信息。

JWT有什么用? JWT最常见的场景就是授权认证,一旦用户登陆,后续每个请求都会将包含JWT,系统在每次处理用户请求之前,都要进行JWT安全校验,通过之后再进行处理。

JWT组成? JWT由三部分组成.进行拼接

  • Header
  • Payload
  • signature

img

参考文献

用户鉴权的三种方式,Cookie、Cookie+Session、Token

鉴权必须了解的5个知识点:cookie,session,token,jwt,单点登录