跨域问题-用户登录管理
如果你是做网站开发的话,那么你就有可能碰到跨域登录问题。比如你的网站有两个域名,你打算做这样一件事,在其中任何一个域名下登录后,在另一个域名下就同时是登录状态,这采取什么样的方式来实现才是最合理的呢?
在讨论解决方案前,我们首先要搞清楚的是什么叫登录,什么意味着登录,登录的本质是什么几个问题。登录一般是怎么实现的呢?当然这有很多方式,下面介绍几个最常见的实现方式。
1 最简单的方式:在客户端写一个COOKIE,这个COOKIE必须是内存COOKIE,它的值都是用户登录名。这样在服务器处理请求的时候,看COOKIE信息是否存在用户名,如果存在,就认为是登录。这种实现方式是不安全的,因为任何用户都可以模改写提交的COOKIE。另外就是服务器对登录状态没有做任何记录。
2 用户名COOKIE+MEMCACHED实现方式:这种是在第一种实现方式上加上了服务器登录记录。即请求的COOKIE信息有用户名信息并不代表用户登录,并且以用户名作为KEY在MEMCACHED中找到对应的键值对,那么才认为该用户登录。这种方式比第一种方式安全了一些,因为它不再只以COOKIE的用户名作为登录状态,外加了服务器记录。
3 随机COOKIE+MEMCACHED实现方式:前两种实现方式在客户端的用户名就记录了用户的信息,比如一个用户登录了,另外一个用户模拟该用户(即在COOKIE里面设置另外一个人的用户名)请求服务,那么则可以冒充该用户。因此第三种实现方式浮出水面,那就是一个用户登录了,那么服务器给用户流览器生成一个随机串,通过随机串的长度,保证该随机串的唯一性,然后将该随机串以user_login_id(可以随意命名)为KEY存在用户流览器的COOKIE里面;另外再以随机串为KEY在MEMCACHED缓存内存存一些用户信息。此时基本可以利用一个临时用户流览器标识一个登录用户了,这样已基本安全了,也基本达到了商业化的水平了。
上面第三个登录方式可靠性算是挺可靠了,但是仍旧存在一定的风险。那就是用户登录时,如果COOKIE信息被外泄的话,那么另一个用户就可以冒充此用户做一些操作了。究其本质是因为用户的COOKIE值和MEMCACHED存在一个一对一的关系,尽管这些门槛对普通用户高了些。要解决这个问题也不是没有办法的,比如MEMCACHED以用户IP+随机串的方式,就更加安全了。
上面讨论了很多登录的实现,似乎还没有绕到本篇文章的主体呢:)实际上,明白了上面的登录,离解决跨域问题就已经不远了。
通过上面的讨论,使我们明白了实质上用户登录就是客户端流览器写一个COOKIE值的关键问题上,但另外一个问题也随之浮出水面:A.com域下面的COOKIE信息在B.com域下面是看不到的,因此在写COOKIE信息时,就必须在A.com域和B.com域两个下面同时设置相同的COOKIE信息跨域问题就迎刃而解了。
因此在一个域下面登录的时候,以GET参数方式将COOKIE信息带到另外一个域下面,那么此问题就得到了彻底解决了。
实际此问题远没有结束,还有很长的路要走,还有太多问题没有讨论。比如:本篇上面讨论的是相同服务器,如果是不同服务器又该怎么样处理;这里是A和B相同登录处理,如果要求在不同域下有不同的权限又将如何实现;如何实现登录信息的统一管理呢?
这些问题就留给读者吧。
thx
张久安
If you enjoyed this post, make sure you subscribe to my RSS feed!








