用户认证

用户认证是互联网服务中重要流程,决定了服务的安全性。生活中靠身份证,网络上就要靠账号和密码。HTTP作为一种无状态协议,没办法记住用户的登录状态。因此我们需要借助一些手段,来判断用户的登录状态,从而决定用户是否具有操作权限。

用户认证:

  1. 传统Session用户认证
  2. 基于Token的用户认证

基于Session的用户认证

早期互联网使用Cookie(客户端)和Session(服务端)来记录和认证用户信息。Session与Cookie均是用来记录一系列状态,的区别在于Session是记录在服务端的,而Cookie是记录在客户端的。

认证流程:

  1. 用户向服务器发送用户名和密码。
  2. 服务器验证通过后,在当前对话(session)里面保存相关数据,比如用户角色、登录时间等等。
  3. 服务器向用户返回一个 session_id,写入用户的 Cookie。
  4. 用户随后的每一次请求,都会通过 Cookie,将 session_id 传回服务器。
  5. 服务器收到 session_id,找到前期保存的数据,由此得知用户的身份。

996415-20180508203515598-1955105543.png

缺点

  1. Session 需要存在服务器内存中,这样就不能跨实例共享。当下一次请求被分发到另一个实例的时候,需要重新登录。
  2. 在高并发情况下,Session 需要放在内存中,受限于服务器内存的大小。Token只需要在服务器进行解析验证。
  3. Session 依赖于浏览器的 Cookie 机制,对于部分软件和移动客户端很难支持。而Token不仅在Web还是移动端都有很好的支持。

因为种种限制,现在广泛使用的是基于Token的用户认证。

基于Token的用户认证

token 是登录之后服务器返回的一段加密字符串(加密算法有多种),存储到本地。在客户端请求服务端数据的时候可以带上(放在请求头headers,参数都行),以下只是思路。

认证流程

  1. 当用户登录成功后,服务器端就会通过指定算法生成一个 token,将token 存放在 redis,再将这个 token 值返回给客户端。
  2. 客户端将 token 存储在 localstorage 或 sessionstorage中 (小程序可以存放在 app.global )。
  3. 当客户端调用接口请求数据时,携带 token 值发送给服务器。
  4. 服务器接收到客户端的请求之后,会先解析返回的 token 得到用户信息验证,并取出 token 值与保存在 redis 的token值做对比。
  5. 如果token对比成功,说明用户处于登录状态,否则表示登录状态失效,需要用户重新登陆。用户每次重新登陆会刷新token的过期时间。

棕旨
56 声望1 粉丝

前端小白的进阶之旅