taobao.com 和 tmall.com 为什么能做到登录
目录:
- 登录互通
- Cookie/Session的跨域共享
- Cookie/Session的跨域共享的几种方法
- 存储到服务器(数据库:mysql...、mamcache、redis)
- 服务端同步(依赖 cookie)
- 服务器同步
- 总结
- taobao.com 和 tmall.com 登录互通
登录互通
当前非常火的单点登录SSO,在多个系统的集群里,用户只需一次登陆,其他系统也会感知到用户登陆,不需要用户重新输入用户名密码登陆。
这是外行人的理解,内行人就得看看其中的黑魔法。
首先引入一个概念,Cookie/Session的跨域共享。
Cookie/Session的跨域共享
同域共享 Session介绍跨域共享之前,先说同域共享。多个站点在同一个域名下面是可以共享 Cookie 的,这是浏览器默认为我们做的工作,浏览器会把 Cookie 和 它的域存在本地,当你跳转到同域站点会在本地读取 Cookie 并带到请求的 header 发送给服务端。
跨域共享 Session
跨域共享顾名思义就是不同域名下也能共享 Cookie,实现身份验证,淘宝跟天猫的登陆互通就是这么干的。
Cookie/Session的跨域共享的方法;
-
存储到服务器(数据库: mongodb 、mysql...、memcache、redis):
用户第一次登录时,服务端将 session 信息存储到服务器上。当用户跳转到另一个跨域页面时,会向服务器查看当前用户 session 的情况,如果有则直接返回实现登录状态同步。 -
服务端同步(依赖 cookie):
当用户跳转到另一个跨域页面B时,B服务端检查是否存在这个session,若没有就将 session 同步到 B服务端,实现 session 的同步。 -
服务器同步:
部署一台专门用作登录的服务器,用户首次登录会将 session 存入服务器,然后服务器将 session 同步到其他服务器上,达到 session 共享的目的。
总结:
其实单点登录的实现:用户第一次登录时,服务端将 session 信息存储到服务器上。当用户跳转到另一个跨域页面时,会向服务器查看当前用户 session 的情况,如果有则直接返回实现登录状态同步。
简单来说就相当于实现一个中转站,这个中转站存放着需要共享登录状态服务应用的 session 信息,它就相当于一把钥匙,当用户进行应用跳转的时候都会来中转站看一看,如果 session 存在就直接使用这把钥匙把通往另一个应用的门打开,如果不在就得先确认用户身份(登录)制造 session 钥匙存在中转站再把门打开,用户的身份存储和身份的有效时间都是中转站说了算,统一管理的。
实现:
SSO流程图
taobao.com 和 tmall.com 登录互通
回过头来寻找淘宝跟天猫 Seesion 共享的方法:
tmall-jsonpcookie
我是用qq作为用户名,羞涩打码~
不难发现当我登录过之后跳转到 tmall ,tmall 通过jsonp的形式加载login_api.do?xxxxxx文件来获取用户的 Cookie 从而实现 cookie 的共享,这个文件在登录淘宝的时候就会生成。
END......我是个有底线的家伙......END