Web用户登陆常见方案

Web用户登陆常见方案

服务端维护会话(Session)

服务端维护会话(Session)时,主体流程如下

用户请求Header中没有Cookie, 或Cookie中没有session-id

  • 1.用户未登录,跳转至登陆入口,用户填写用户名密码.
  • 2.服务端验证密码通过后,生成session并保存到服务端(session内包含用户信息)
  • 3.服务端下发Set-Cookie, 内容为session-id(仅ID)

用户请求Cookie已包含session-id

  • 1.验证Session id是否有效, 并读取服务端存储的session
  • 2.根据session信息验证用户是否合法(可灵活根据IP,终端等验证)
  • 3.验证完成

服务端维护会话的优缺点如下.
优点:

  • 1.节省客户端网络传输(Header只传输id)
  • 2.Session可存储信息量大,可自由拓展
  • 3.服务端可自由控制所有Session

缺点:

  • 1.多台应用服务器同时提供服务时, 需要Session共享(通常存放在Redis中)
  • 2.Redis崩溃之后,所有用户会话丢失

服务端不维护会话(JWT)

常见的服务端不维护会话的实现是JWT(JSON Web Tokens).基本思路是扩充Cookie的信息量,即用户发送的Cookie中包含此会话的所有信息(Cookie内容为一个JSON).

主体流程如下:

用户请求Header中没有Cookie

  • 1.用户未登录,跳转至登陆入口,用户填写用户名密码.
  • 2.服务端验证密码通过后,生成JWT并加密(JWT内包含Cookie过期时间的等信息)
  • 3.服务端下发Set-Cookie, 内容为JWT所有内容

用户请求带有Cookie

  • 1.从Cookie中解析JWT,解析失败则返回未登录提示
  • 2.验证JWT的过期时间,用户名是否与当前请求一致.
  • 3.验证完成

JWT验证关键点:

  • 确保生成JWT的密钥不泄露
  • 确保外部无法伪造JWT

常见的JWT属性:

  • iss (issuer):签发人
  • exp (expiration time):过期时间
  • sub (subject):主题
  • aud (audience):受众
  • nbf (Not Before):生效时间
  • iat (Issued At):签发时间

服务端不维护会话(JWT)的优缺点如下.
优点:

  • 1.服务端无需存储会话状态,业务更容易拓展
  • 2.可低成本实现多点登陆

缺点:

  • 1.每次HTTP访问,Cookie都携带了全量的用户信息,网络流量变大
  • 2.服务端无法低成本废止某个会话

参考资料

  • https://tools.ietf.org/html/rfc7519#section-11.2
  • https://jwt.io/

版权声明:本文为cntechpower原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。