HTTP - cookie
用户识别的技术
当你访问一个站点时,这个服务器如何来判断这个用户是谁呢?我们可能会第一个想到使用cookie,在写cookie之前,我们先来看看其他几种识别技巧。
- 承载用户信息的HTTP首部。
可以从From、User-Agent、Referer、Auehorization等首部来将用户的信息在请求的同时发送给服务器作为服务器识别用户的一种方法。 - 客户端IP地址跟踪,通过IP地址进行识别。
将客户端的IP地址作为一种表示,web服务器可以找到承载HTTP请求的TCP链接另外一端的IP地址。但是它存在比较多的缺陷(限制),比如多用户共享IP地址、防火墙隐藏IP地址、网络服务提供商动态分配IP地址等。 - 用户登陆,用认证方式来识别用户。
服务器可以要求用户通过用登陆认证来显示的查询用户是谁,可以用www-Authenticate首部和Authorization首部向web站点传送用户相关的信息,但是在当用户需要在多个站点或者跳转到另一个站点的时候需要重新验证,这会大大降低用户的体验。 - 胖URL,在URL中嵌入识别信息。
这种方式会为每个用户生成特定版本的URL来追踪用户的身份,改动后包含状态信息的URL称之为胖URL,但是它也存在相当大的问题,比如无法共享URL、破坏缓存(为每个用户生成特有的版本意味着不再有可供公共访问的URL需要缓存了)、非持久的(当用户退出登陆时所有的信息都会丢失)。
关于cookie
cookie是识别当前用户,实现持久会话的比较好的方式。Cookie 是在 HTTP协议下,服务器或脚本可以维护客户工作站上信息的一种方式。Cookie 是由 Web服务器保存在用户浏览器(客户端)上的小文本文件,它可以包含有关用户的信息。无论何时用户链接到服务器,Web 站点都可以访问 Cookie 信息。目前有些 Cookie 是临时的(会话cookie),有些则是持续的(持久cookie)。临时的 Cookie只在浏览器上保存一段规定的时间,一旦超过规定的时间,该 Cookie 就会被系统清除。它们之间唯一的区别就是它们的过期时间(利用Expires或Max-Age参数来说明过期时间)。
cookie的工作流程
cookie就像是服务器给用户的一个标记,当用户访问一个web站点的时候,这个web站点就可以读取此服务器给用户的所有标记。用户首次访问web站点时是空白的,此时服务器会给此用户一个cookie(以便于自身以后识别此用户),cookie中包含了一个由键值对(名字=值)这样的信息构成的列表,并且通过Set-Cookie或者Set-Cookie2 HTTP响应首部将其贴到用户身上,同时会向首部添加一个Domain属性来控制哪些站点可以看到这个cookie。浏览器会记住从服务器返回的cookie内容,并将它储存在浏览器的数据库中。当用户再次访问这个站点时,浏览器会挑中响应服务器的缓存发送出去。(不同的站点使用不同的cookie,浏览器只会将对应站点的cookie发送出去)
cookie的成分与版本
cookie分为0和1两个版本,0版本是网景公司定义的,它定义了Set-Cookie响应首部和cookie请求首部以及控制cookie的字段。它的Set-Cookie首部有如下主要字段。
- NAME = VALUE ,强制的,这个列表会发送给服务器。
- Expires,可选的,这个属性指定一个日期来定义cookie的实际生存日期。
- Domain,可选的。浏览器只向指定域中的服务器发送此cookie。
版本一引入了Set-Cookie2和Cookie2首部,但它也能与版本0系统互相操作,他做了如下的主要改动。 - 为每个cookie关联上解释文本
- 允许在浏览器退出时不考虑时间强制销毁
- 用相对秒数来表示cookie的声明期而非绝对时间
- 通过端口号,而不仅仅是域和路径来控制
cookie与缓存
这一部分待扩充。
- 如果无法缓存文档要将其标识出来
- 缓存Set-Cookie首部时要小心
- 小心处理带有cookie首部的请求
cookie in javascript
javascript是运行在客户端的脚本,因此一般是不能设置session因为session是在服务器端运行的,而cookie是在客户端的,我们来看看在javascript中对cookie的操作。
- 设置cookie
document.cookie="name"+value;
- 读取cookie
document.cookie.split(";");
会得到一个数组。 - 设置时间
通过这是expires属性来设置这个cookie的有效期 - 利用jquery库来操作cookie
$.cookie('the_cookie', 'the_value', { expires: 7, path: '/' }); $.cookie('the_cookie');
session、localstorage和sessionstorage与cookie的区别
- session
cookie和session都是用来跟踪浏览器用户身份的会话方式,但是他们有很大的区别,cookie保存在客户端而session保存运行在服务端,当web服务器用的是session那么所有的数据都保存在服务器上,客户端每次请求的时候会发送当前会话的sessionid(是服务器和客户端链接时候随机分配的),服务器根据sessionid判断响应的用户数据标治,所以说session的生命周期在关闭浏览器之前存在。不同的是cookie在客户端存在只要不关闭浏览器cookie一直有效,如果设置了有效时间,cookie会保存在客户端的硬盘上,下次再访问该网站的时候,浏览器先检查有没有cookie,如果有的话,就读取该cookie,然后发送给服务器。安全性方面cookie不如session,别人可以分析放在本地的cookie并进行欺骗,此时服务器可能还认为cookie是合法的。 - localstorage
localStorage 是 HTML5 标准中新加入的技术,除非被清除,否则永久保存,仅在客户端(即浏览器)中保存,不参与和服务器的通信,源生接口可以接受,亦可再次封装来对Object和Array有更好的支持, localStorage 接替了 Cookie 管理购物车的工作,同时也能胜任其他一些工作。比如HTML5游戏通常会产生一些本地数据,localStorage 也是非常适用的。 - sessionstorage
sessionStorage 与 localStorage 的接口类似,但保存数据的生命周期与 localStorage 不同。做过后端开发的同学应该知道 Session 这个词的意思,直译过来是“会话”。而 sessionStorage 是一个前端的概念,它只是可以将一部分数据在当前会话中保存下来,刷新页面数据依旧存在。但当页面关闭后,sessionStorage 中的数据就会被清空。仅在客户端(即浏览器)中保存,不参与和服务器的通信。如果遇到一些内容特别多的表单,为了优化用户体验,我们可能要把表单页面拆分成多个子页面,然后按步骤引导用户填写。这时候 sessionStorage 的作用就发挥出来了。**注意:localstorage和sessionstorage与cookie都存在与客户端,他们都有可能存在XSS(跨站脚本攻击)的风险。