一、session的状态保持及弊端
(1)当用户第1次通过浏览器使用用户名和密码访问服务器时,服务器对用户名和密码进行验证。
(2)验证成功后,在服务器端生成并保存session数据,通过cookie向浏览器返回sessionId,浏览器将sessionId记录在cookie中。
(3)当浏览器再次访问时,会默认携带cookie中的sessionId,服务器校验sessionId存在或有效,如果存在就保持当前会话,不需要重新登录,返回浏览器所需数据。
好处:
session的主要实现是:用户登录后保持会话信息,使得打开不同页面不需要重新登录。
如果会话超时,或者服务器重启(如果session存在服务内存中),那么要求用户重新登录,这也是自动登录的由来。
弊端:
1、通常session是存储在内存中的,用户过多时,服务器压力会增大。
2、存在安全问题,CSRF跨站伪造请求攻击。
session是基于cookie进行用户识别的, cookie如果被截获,用户就会很容易受到跨站请求伪造的攻击。
3、扩展性不强,无法直接支持分布式服务部署。
二、token(令牌)认证机制
(1)客户端登录成功后,服务器会对userId和userId对应的用户信息进行加密,加密后的字符会在响应主体中{token:'字符串'}返回给客户端,但并不对token进行保存。
(2)客户端可以通过cookie或sessionStorage或localStorage对token进行存储。
(3)客户端再次请求时不会默认携带,需要在请求头中添加认证字段Authorization并携带token信息,服务器端对token信息进行解密,解密完成后进行用户数据的查询,如果查询到,则认证通过,实现状态保持。
所以,即时有了多台服务器,服务器也只是做了token的解密和用户数据的查询,它不需要在服务端去保留用户的认证信息或者会话信息,这就意味着基于token认证机制的应用不需要去考虑用户在哪一台服务器登录了,这就为应用的扩展提供了便利,解决了session扩展性的弊端。