Session和Cookie

Session和Cookie

Scroll Down

用作身份识别和用户跟踪

在Web发展历史中,sessioncookie都是伟大的存在,其初衷都是为了记住用户在网站上的浏览信息,如果没有其他替代品的出现,几乎所有web站点都离不开sessioncookie

为什么需要

Http协议是无状态的,也就导致服务器无法分辨是谁浏览了网页。为了维持用户在网站的状态,比如登陆、购物车等,出现了先后出现了四种技术,分别是隐藏表单域URL重写cookiesession

为了解决Http协议无法维持状态的问题,1994年网景通讯的一名员工 Lou Montulli将 “magic cookies” 的概念应用到 Web 通讯中。他试图解决 Web 的第一个购物车应用,现在购物车成了购物网站的支柱。他的原始说明文档提供了 cookie 工作原理的基本信息,该文档后来被作为规范纳入到 RFC 2109(大多数浏览器的实现参考文档)中,最终被纳入到 RFC 2965 中。Montulli 也被授予 cookie 的美国专利。网景浏览器在它的第一个版本中就开始支持 cookie,现在所有 Web 浏览器都支持 cookie。(这里只介绍cookie与session)

是什么

cookie是浏览器保存在用户电脑上的一小段文本,用来保存用户在网站上的必要的信息。Web页面或服务器告诉浏览器按照一定的规范存储这些信息,并且在以后的所有请求中,这些信息就会自动加在http请求头中发送给服务器,服务器根据这些信息判断不同的用户。并且cookie本身是安全的。

如何创建

Web 服务器通过发送一个称为Set-Cookie的 HTTP 消息头来创建一个 cookieSet-Cookie消息头是一个字符串,其格式如下(中括号中的部分是可选的):

Set-Cookie: value[; expires=date][; domain=domain][; path=path][; secure]

value

value部分,通常是一个name=value格式的字符串。事实上,这种格式是原始规范中指定的格式,但是浏览器并不会对cookie值按照此格式来验证。实际上,你可以指定一个不含等号的字符串,它同样会被存储。然而,最常用的使用方式是按照name=value格式来指定cookie的值(大多数接口只支持该格式)。

发送回服务器的cookie只包含cookie设置的值,而不包含cookie的其他可选项,而且浏览器不会对cookie做任何更改,会原封不动的发送回服务器。当存在多个cookie时,用分号和空格隔开:

Cookie: name=value; name1=value1; name2=value2/pre>

cookie过期时间

如果不设置cookie过期时间,cookie会在会话结束后销毁,称为会话cookie。如果想将会话cookie设置为持久cookie,只需设置一下cookie的过期时间即可,该选项的值是一个Wdy, DD-Mon-YYYY HH:MM:SS GMT日期格式的值。注意这个失效日期则关联了以name-domain-path-secure为标识的 cookie。要改变一个cookie的失效日期,你必须指定同样的组合。

持久cookie是无法改成会话cookie,除非删除这个cookie,然后重新建立这个cookie。

domain 选项

domian选项设置了cookie的域,只有发向这个域的http请求才能携带这些cookie。一般情况下domain会被设置为创建该cookie的页面所在的域名。

像 Yahoo! 这种大型网站,都会有许多name.yahoo.com形式的站点(例如:my.yahoo.com, finance.yahoo.com等等)。将一个cookiedomain选项设置为yahoo.com,就可以将该cookie的值发送至所有这些站点。浏览器会把domain的值与请求的域名做一个尾部比较(即从字符串的尾部开始比较),并将匹配的cookie发送至服务器。

path 选项

path选项和domain选项类似,只有包含指定path的http请求才能携带这些cookie。这个比较通常是将path选项的值与请求的URL从头开始逐字符比较完成的。如果字符匹配,则发送Cookie消息头,例如:

set-cookie:namevalue;path=/blog

所以包含/blog的http请求都会携带cookie信息。

secure 选项

该选项只是一个标记而没有值。只有当一个请求通过SSLHTTPS创建时,包含secure选项的cookie才能被发送至服务器。这种cookie的内容具有很高的价值,如果以纯文本形式传递很有可能被篡改。

事实上,机密且敏感的信息绝不应该在cookie中存储或传输,因为cookie的整个机制原本都是不安全的。默认情况下,在HTTPS链接上传输的cookie都会被自动添加上secure选项。

HTTP-Only

HTTP-Only的意思是告之浏览器该cookie绝不能通过JavaScriptdocument.cookie属性访问。设计该特征意在提供一个安全措施来帮助阻止通过JavaScript发起的跨站脚本攻击(XSS)窃取cookie的行为。

JavaScript中通过document.cookie属性,你可以创建、维护和删除cookie。创建cookie时该属性等同于Set-Cookie消息头,而在读取 cookie时则等同于Cookie消息头。

删除cookie

会话cooke (Session cookie)在会话结束时(浏览器关闭)会被删除。

持久化cookie(Persistent cookie)在到达失效日期时会被删除。

如果浏览器中的cookie数量达到限制,那么cookie会被删除以为新建的cookie创建空间。

session

session的作用和cookie差不多,也是用来解决Http协议不能维持状态的问题。但是session只存储在服务器端的,不会在网络中进行传输,所以较cookie来说,session相对安全一些。但是session是依赖cookie的,当用户访问某一站点时,服务器会为这个用户产生唯一的session_id,并把这个session_idcookie的形式发送到客户端,以后的客户端的所有请求都会自动携带这个cookie(前提是浏览器支持并且没有禁用cookie)。

用下面这个图来了解下session的工作原理:

session和cookie.png

禁用cookie时如何使用session

有些时候,为了安全浏览器会禁用cookie这时可以用传参的方式将session_id发送到服务器,session可以照常工作.

删除session

会话关闭后,session会自动失效,如果想手动删除session,可以在服务器端编程实现。如PHP是这样做的

$_SESSION = array();

session_destory();

总结

两个都可以用来存私密的东西,同样也都有有效期的说法。

区别在于:

session是放在服务器上的,过期与否取决于服务期的设定,cookie是存在客户端的,过期与否可以在cookie生成的时候设置进去。

  1. cookie数据存放在客户的浏览器上,session数据放在服务器上

  2. cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗,考虑到安全应当使用session

  3. session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用cookie

  4. 单个cookie在客户端的限制是4K,就是说一个站点在客户端存放的cookie不能超过4K。

  5. 所以个人建议:

将登陆信息等重要信息存放为session
其他信息如果需要保留,可以放在cookie