JWT与Session

一种令牌格式, 改进了 Session 需要状态管理的缺点, 通过用户提供token来实现令牌发放

作为令牌格式, JWT 和 session 在用户认证上时常用到

Session

经典的 Session 登录流程如下

  • 用户向服务器发送用户名和密码。

  • 服务器验证通过后,在当前对话(session)里面保存相关数据,比如用户角色、登录时间等等。

  • 服务器向用户返回一个 session_id,写入用户的 Cookie。

  • 用户随后的每一次请求,都会通过 Cookie,将 session_id 传回服务器。

  • 服务器收到 session_id,找到前期保存的数据,由此得知用户的身份。

单机环境下, session 实现简单, 方便快速, 服务器维护与用户的连接(下称 Sesssion), 用户传入 id 来更新session

但是分布式集群下, 各个服务需要不断的请求并写入session, 这使得session服务器成为了登录中心服务器, 一旦中心服务器挂了, 整个分布应用宕机

既然服务器维护session成本这么高, 干脆不维护了, 让用户维护

于是诞生了 JWT

JWT

JWT 的原理是,服务器认证以后,生成一个 JSON 对象,发回给用户,就像下面这样。

{
  "姓名": "张三",
  "角色": "管理员",
  "到期时间": "2018年7月1日0点0分"
}

服务器就不保存任何 session 数据了,也就是说,服务器变成无状态了,从而比较容易实现扩展。