关于Cookie和Session的理解

写在前面

在开始之前,先要理解会话(Session)的含义。Session跟踪是web中常用的技术,用来跟踪用户整个会话。Cookie和Session是常用的绘画跟踪技术。

Cookie是通过客户端记录确定用户身份,而Session通过在服务器端记录信息确定用户身份

1 Cookie机制

理论上,一个用户的所有请求操作都应该属于同一个会话,另一个用户的请求属于其他的一个会话。

Web应用程序是使用HTTP协议传输协议(可恶我计算机网络没学好啊=皿=)。HTTP协议是无状态、无连接协议,一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的连接。这就意味着服务器无法从连接上跟踪会话。所以Cookie设计是为了来实现Cookie跟踪会话。

1.1 什么是Cookie

简而言之,Cookie是一小段文本信息,作为一个通行证。客户端请求服务器,如果服务器需要记录该用户状态,就response一个Cookie给浏览器,客户端浏览器就会保存Cookie作为一个通行证,服务器端依靠这个通行证确认访问者用户身份。

而当浏览器再次请求该网站时,浏览器吧请求的网址连同Cookie一同提交给服务器,服务器再次检查Cookie用来辨别用户状态。服务器还可以根据需要修改Cookie内容。

1.2 Javascript操作Cookie

(……)

1.3 Cookie的不可跨域名性

这一点很好理解,不同的网站向客户端颁发不通的Cookie,A网站和B网站向客户端颁发的Cookie相互不可以修改。一个网站只操作这个网站的Cookie,从而保证用户的隐私安全。

1.4 Unicode编码:保存中文

中文属于Unicode字符,在内存中占4个字符,英文属于ASCII字符,在内存中占两个字节。Cookie使用Unicode字符时候需要对Unicode编码,否则会乱码。

1.5 设置Cookie的所有属性

除了name和value两个一般都会有的属性以外,Cookie还有几个其他常用属性。每个属性对应一个getter方法与一个setter方法。举几个例子:

String name: Cookie的名称,Cookie一旦创建,名称便不可更改;

Object value: Cookie的值,看情况是否需要编码;

int maxAge: Cookie的生存时间,单位为秒,maxAge之后该Cookie失效,如果为负数,则代表该Cookie为临时Cookie,关闭浏览器即失效,浏览器也不会保存该Cookie,如果为0,表示删除Cookie,默认值为-1;

boolean secure: 是否使用安全协议传输,比如HTTPS,SSL,默认值为false;

String path: 该Cookie使用的路径;

String domain: 可以访问该Cookie的域名;

int version: 版本号

1.6 Cookie的修改、删除

Cookie不可修改,如果要修改,只能够新建一个同名Cookie添加到response中覆盖原来的Cookie,若要实现删除,则将气maxAge设置为0。

1.7 Cookie的安全性

HTTP协议是无状态、无连接的,而Cookie是服务器端创建的,所以生成一个可信Cookie的关键在于客户端无法伪造出Cookie,我们采取的手段是单向函数。比如计算md5就是一个单向函数,假设写好了一个函数md5(String),我们可以通过这个函数得到结果,但是反推输入却很困难。

生成一个可信的Cookie的方法可以是"用户名:口令(md5值)"作为一个字符串构成一个Cookie发送给客户端。服务器验证的时候将其拆分成“用户名”和“口令(md5值)”在数据库中找到该用户的记录,并继续找到原口令。服务器端根据数据库中存储的口令计算其md5值,并和客户端Cookie的md5值进行比对,若一致,则Cookie有效。

目前根据md5值进行加密只是我作为一个初学者的简单思考,而且在这种方式中,用户的用户名是被暴露的,如果用户使用email作为用户名,那么其email就可以被泄露。

2 Session机制

啊啊啊啊啊头大了……

2.1 什么是Session

Session是另一种记录客户状态的机制,不同的是Cookie保存在客户端浏览器中,Session保存在服务器上。客户端浏览器访问服务器时,服务器把客户端信息以某种形式记录在服务器上。它和Cookie的差别,举个例子:

A国元首举行一个宴会,到场的人需要进行一个身份验证。Cookie相当于给客人发请帖,根据请帖入场,Session则是相当于等客人到场时查证宴请宾客名单入场。

2.2 Session的生命周期

Session保存在服务器端,为了获取更高的存取速度服务器一般把Session放在内存中,若Session内容太复杂,可能会引起很多问题比如内存溢出等。

Session在用户第一次访问服务器时自动创建,生成后只要用户继续访问,服务器就会更新Session最后访问时间,认为该用户活跃(active)了一次;

若用户长时间没有活跃,超过一个确定的时间,则会被从内存中删除。

2.3 Session对浏览器的要求

虽然Session保存在服务器内,对客户端是透明的,它的正常运行仍然需要客户端浏览器的智齿。这是因为Session需要使用Cookie作为识别标识。HTTP协议是无状态无连接的(不知道多少次重复这个原因了=。=)Session无法根据HTTP来判断是否为同一客户。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容