HTTP 协议是无状态的。

  • 即服务器对于客户端每次发送的请求都认为它是一个新的请求。
  • 本次请求和上次请求无法判断是不是同一个客户端操作的。

随着 Web 应用的发展,如在线购物网站,需要登录的网站等,马上就面临一个问题,那就是要管理会话,必须记住哪些用户登录了系统,哪些用户往自己的购物车中放了商品, 也就是说必须把每个用户区分开


session 机制

  • session 是一种记录服务器和客户端会话状态的机制。
  • session 主要用来存储所有访问过该服务端的客户端的用户信息(也可以存储其他信息),从而实现保持用户会话状态。
  • session 是基于 cookie 实现的,session 存储在服务器端,sessionid 会被存储到客户端的 cookie 中。

注:cookie 是浏览器访问服务器后,服务器传给浏览器的一段数据(key-value)

cookie 特点:

  • cookie 存放在客户端
  • cookie 有个数限制(不同浏览器的cookie个数不等) ,
  • cookie 大小一般是4K,
  • cookie 可设置失效时间(如果没设置,默认是关闭浏览器时失效),
  • cookie 是不可跨域的(当前域名下有效)。

session 工作流程

  • 浏览器在第一次访问服务器时,服务器会创建一个 session,代表用户的一次会话过程,服务器会为每一个 session 都分配一个唯一的 sessionid,以保证每个用户都有一个不同的session 对象。
  • 服务器在创建完 session 后,同时会创建一个特殊的 cookie(name为JSESSIONID,value为sessionid),并将该 cookie 发送至浏览器端。
  • 当用户向服务器发送新的请求时,浏览器会携带这个 cookie 对象,把 sessionid 传回给服务器,服务器根据 sessionid 找到与该用户对应的 session 对象,从而区分不同用户。

session 登录验证机制

用户在登录认证成功之后,并且往 session 对象里面放入了用户登录成功的凭证,才能用来进行真正意义上的管理会话。

session 机制存在的不足

  • 开销问题:服务端需要保存每个用户的 session 信息,当用户越来越多时,内存的开销也会不断增加;
  • 持久化问题:解决重启服务器后session就消失的问题。在数据库中存储 session,而不是存储在内存中;
  • CORS问题(跨域共享):在服务器A上登录, sessionid 保存在A上,假设下一次请求被转发到服务器B怎么办?会限制了服务器扩展能力;
  • CSRF问题(跨站请求伪造):session 伪造/劫持等安全性问题。

token 验证机制

token 是服务端生成的一串字符串,作为客户端进行请求的一个令牌。

  • token 认证流程:
  • 客户端使用用户名跟密码请求登录
  • 服务端收到请求,去验证用户名与密码
  • 验证成功后,服务端会签发一个 token 并把这个 token 发送给客户端
  • 客户端收到 token ,会把它存储起来,如存放在 cookie 或 localStorage 中
  • 客户端每次向服务端请求资源的时候需要带着服务端签发的 token(注:token 放到 HTTP 请求的 Header 里)
  • 服务端收到请求,然后去验证客户端请求中的 token ,如果验证成功,就向客户端返回请求的数据。

token 验证流程图示

token 验证流程

token 数字签名

token 机制优点

  • 服务端无状态:服务端不存储 token 信息, token 存在客户端中
  • 可扩展性好:不存储 session 信息,负载均衡器能够将用户信息从一个服务传到其他服务器上。
  • 支持跨域访问:CORS(跨域资源共享)
  • 安全性:token 通过HTTP header传送,防止CSRF(跨站请求伪造)
  • 基于标准:如JWT标准。JSON Web Token,最流行的跨域认证解决方案