什么是认证和授权?
认证解决的就是你是谁的问题,当登录一个web电商平台,当你很high的浏览商品的时候并不需要你的认证,但是当你准备下单的时候就需要你登录。要解决你是谁的问题?主要是你的账户有没有钱:)
当你登录之后,接下来最重要的是授权阶段,主要是区分你是不是VIP用户或admin用户。
什么是session?什么是cookie?
http是无状态的服务,当你首次登录web应用之后,http并不知道。如果服务器或者浏览器没记录下来的话,再次刷新页面可能就需要你重新登录。 这显然是不合理的。
因此session这个概念出现了。 这个是和用户紧密结合在一起的,主要解决服务器对用户的认证。
例如有的网站长时间不操作就需要重新登录,就是我们所说的session过期了,需要重新登录。
cookie是存在于用户浏览器本地。一般服务器将sessionid发送给浏览器将其保存在cookie中。
什么是stick session?
当单体应用不足以支撑web应用的时候,一般会多实例部署前面加一个负载均衡器让多个服务实例提供服务。用户感觉不到自己在访问哪个服务器。
但是session同步是一个问题。
因为用户是通过负载均衡进来的,两次访问可能落在不同的svr上,如果第一次是在svr1上进行登录的,第二次是请求被分配到svr2上。如果再让用户重新登录那用户体验肯定糟糕透了。 用户莫名其妙间歇性登录。
因此出现了stick session即粘性session。 将session和用户访问的svr进行黏连。
当用户量上来之后,stick session会对负载均衡和服务器造成很大的压力。因此一般大流量网站不使用这种方式保持session。
如何解决session同步的问题?
- 第一种解决方案会话同步复制
也就是让这个会话数据在这个服务器之间进行同步复制。
可以解决问题但是它会引入复杂性,整个服务器集群之间,需要引入这个复杂的这个状态同步协议,整体性能和扩展性反而会变低。
- 第二种无状态会话
不存在这个服务器上,而是存在客户端的这个浏览器里。
通过这个请求响应循环捎带来传递用户数据,这种方式确实可以做到这个服务器端和负载均衡器,都不需要存状态,比较容易扩展。
但是用户数据存在浏览器cookie当中是有泄露风险。
浏览器对这个cookie大小是有限制的,一般是4k
- 第三种集中状态会话
将session集中存储redis中当,负载均衡器和这个服务器都可以水平扩展。提高了系统的可扩展性。