基于cookie-session和token的认证模式
用户认证
http是一个无状态的协议,一次请求结束后,下次在发送服务器就不知道这个请求是谁发来的了(同一个IP不代表同一个用户),在web应用中,用户的认知和鉴权是非常重要的一环,实践中有多种能用方案
Cookie-session认证模式
在web应用发展初期,大部分采用基于Cookie-Session的会话管理方式,逻辑如下
- 客户端使用用户名,密码进行认证
- 服务端验证用户名,密码正确后生成并存储Session,将SessionID通过Cookie返回给客户端
- 客户端访问需要认证的接口时在Cookie中携带SessionID
- 服务器通过SessionID查找Session并进行鉴权,返回给客户端需要的数据
基于session的方式存在多种问题
- 服务器需要存储session,并且由于session需要经常快速查找,通常存储在内存或内存数据库中,同时在线用户较多时需要占用大量的服务器资源
- 当需要扩展时,创建session的服务器可能不是验证session的服务器,所以还要将所有的session单独存储共享
- 由于客户端使用cookie存储sessionID,在跨场景下需要进行兼容性处理,同时这种方式也难以防范CSRF攻击
Token认证模式
鉴于基于session的会话管理方式存在上述多个缺点,基于Token的无状态会话管理方式诞生了,所谓无状态,就是服务器可以不再存储信息,甚至是不再存储session,逻辑如下
- 客户端使用用户名,密码进行认证
- 服务端验证用户名,密码正确后生成token返回客户端
- 客户端保存token,访问需要认证的接口在URL参数或HTTP Header中加入Token
- 服务器通过解码Token进行鉴权,返回给客户端需要的数据
基于Token会话管理方式有效解决了基于Session的会话管理方式带来的问题
- 服务端不需要存储和用户鉴权有关的信息,鉴权信息会被加密到Token中,服务端只需要读取Token中包含的鉴权信息即可
- 避免了共享Session导致的不易扩展问题
- 不需要依赖Cookie,有效避免Cookie带来的CSRF攻击问题
- 使用CORS可以快速解决跨域问题