Home | 简体中文 | 繁体中文 | 杂文 | Github | 知乎专栏 | 51CTO学院 | CSDN程序员研修院 | OSChina 博客 | 腾讯云社区 | 阿里云栖社区 | Facebook | Linkedin | Youtube | 打赏(Donations) | About
知乎专栏多维度架构

11.12. Session/Cookie

为什么我要在这里提Session和Cookie,这也大型站点必须要处理问题。

11.12.1. Session

在集群环境中与单服务器是不一样的,集群组成可分为调度服务器和节点,节点数量不定,单个节点安装有web服务器,用户每次访问网站调度服务器随机分配一个节点给该用户, 举一个例子:用户在网站上看新闻,点击第一个连接被分配到node 1上去,当他看完这条新闻并单击下一条时,可能被分配到其它节点上,这里刚才建立的session在node 1上, 它就会因失去session而必须重新登录。

所以我们要同步所有节点上的Session, 另外如果能用Cookie代替Session的地方尽量使用Cookie。

11.12.2. Session 共享

解决方案:

  1. 不用Session,使用Cookie取而代之

  2. 共享Session,放到数据库中,放到Memcache中

PHP Session很有解决方案:

查看PHP手册 Session Extensions 章节,重写Session逻辑。

共享Session用Memcache,在php.ini中配置即可

session.save_handler = memcache
session.save_path = tcp://127.0.0.1:10001
			

11.12.3. Cookie

Cookie 我这里提到cookie是可以实现“单点登录”功能。

一个网站可能不指一组集群系统,如news.example.org, bbs.example.org, blog.example.org 要实现在一处登录即可在其它站点上同时也处于登录状态,就要用到Cookie来实现。

11.12.3.1. Cookie 安全

Cookie存储在用户端,Cookie数据极易伪造。下面提供几个方案。

  • 在Cookie数据上加干扰词

  • 在反向代理上做手脚

  • 负载均衡设备都提供Cookie保护功能

11.12.3.2. cookie-free domains

11.12.3.3. P3P

header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"');

				
<?php
header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"');
setcookie("test", $_GET['id'], time()+3600, "/", ".a.com");
?>