Web是基于 http 协议的,http 是一个无状态协议,所谓无状态是指一次请求与响应结束后,服务器不会记录任何与客户端相关的信息,这对于减轻服务器压力非常有帮助,然而现实中也会带来一些问题,如登录,我们希望的结果是在A页面登录后,B页面无需再登录操作,要做到这一点就需要服务器能够记录下客户端的信息(为不同的用户记录不同的信息),cookie 和 session 就是用来实现这个功能的,通常请求和响应称为会话,所以有时也会说 cookie 和 session 是用来维持会话状态的
cookie 是记录在客户端(浏览器)通过document.cookie进行读写
1 | //读取 |
cookie 默认生命周期为关闭浏览器,也可以进行设置
1 | document.cookie = 'name=xiaoming; expires=' + (new Date('2016-12-31')).toUTCString(); |
- 利用cookie可以在客户端(浏览器)存储数据,实现不同页面数据共享(大小约4K),但是由于cookie做为http请求头的一部分,每次请求都传递,所以尽量控制cooike的大小,并且cookie是记录在客户端(浏览器)的,所以不建议将隐私性的数据存储到cookie中。
- 由于浏览器的同源策略,cookie也有域的限制,但是可以设置同一个顶级域名下所有子域名不受域的限制。
session 是记录在服务器端的,通过后端语言实现读写,以PHP为例
1 |
|
- session 在服务端的存储方式是多样的,既可以存储在文件中也可以存储到数据库、内存中,所以一般认务没有大小限制,由于记录在服务端所以安全性也很好。
- 了解了cookie和session后,再来看两者间的关系,正如上面我们提到的,http协议是无状态的,要实现用户登录功能就必须要记录用户登录状态,配合cookie和session可以解决这个问题,实际的实现思路分为两种:
- 用户输入正确用户名和密码后,将登录信息存储在cookie中,每次请求会将这个存储的信息发送到服务器,通过检测这个信息判断用户是否已登录,但是由于cookie是记录在客户端(浏览器)的,所以安全性不好。
- 用户输入正确用户名和密码后,将登录信息存储在session中,由于session是存储在服务端,所以安全性很好,但是可能会带来另外一个问题,即服务器不能明确知道所存储的session信息是属于哪一个客户端(浏览器)。
- 实际上是通过cookie来解决这个问题的,具体实现过程是服务器在存储session信息后,会生成一个唯一标识(sessionid)并将这个标识响应给浏览器,浏览器将这个标识(sessionid)存储在cookie中,当下次再请求时浏览器会将这个标识(sessionid)传递给服务端,服务端利用这个标识找到对应的session,进而判断用户的登录情况。