关于HTTP中cookie 和session机制

前言

Cookie是由网景公司的前雇员Lou Montulli 在1993年发明的。向前辈致敬。

1. Cookie和Session介绍

  Cookie 和Session 是为了在无状态下HTTP协议之上维护会话状态,使得服务器可以知道当前适合哪个客户在打交道。因为HTTP协议是无状态的,即每次用户请求到达服务器时,HTTP服务器并不知道这个用户是谁、是否登录过等。现在的服务器之所以知道我们是否已经登录,是因为服务器在登录时设置了浏览器的Cookie!Session则是借由Cookie而实现的更高层的服务器与浏览器之间的会话。

2. Cookie的实现机制

  Cookie是由客户端保存的小型文本文件,其内容为一系列的键值对。Cookie是由HTTP服务器设置的,保存在浏览器中,在用户访问其他页面时,会在HTTP请求中附上该服务器之前设置的Cookie。Cookie的实现标准定义在RFC2109:HTTP State Management Mechanism中,那么Cookie是怎么工作的呢?下面给出整个Cookie的传递流程:

    1.  浏览器(或者客户端)向某个URL发起HTTP请求(可以是任何请求,比如GET一个页面、POST一个登录表单等)

    2.  对应的HTTP服务器收到该HTTP请求,并计算应当返回给浏览器的HTTP响应。_ps_HTTP响应包括请求头和请求体两部分。

    3.  在响应头加入Set-Cookie字段,它的值是要设置的Cookie.

    4.  浏览器(或者客户端)收到来自服务器的HTTP响应。

    5.  浏览器在响应头中发现Set-Cookie字段,就会将该字段的值保存在内存或者硬盘中。Set-Cookie 字段的值可以是很多项Cookie,每一项都可以指定过期的

       时间Expires。默认的过期时间是用户关闭浏览器时。

    6.  浏览器下次给该服务器发送HTTP请求时,会将服务器设置的Cookie附加在HTTP请求的头字段Cookie中。浏览器可以存储多个域名下的Cookie,但只发送当前

       请求的域名曾指定的Cookie,这个域名也可以在set-Cookie字段中指定。

    7.  服务器收到这个HTTP请求,发现请求头中有Cookie字段,便知道之前就和这个用户打过交道了。这样就辨别了浏览器(或者客户端)。

    8.  过期的Cookie会被浏览器(或者客户端)删除。

   总之,服务器通过Set-Cookie响应头字段来指示浏览器保存Cookie,浏览器通过Cookie请求头字段来告诉服务器之前的状态。Cookie中包含若干个键值对,每个键值对都可以设置过期时间。

3. Cookie的安全隐患

  Cookie提供了一种手段使得HTTP请求可以附加当前的状态,现在的网站也是靠Cookie来标识用户的登录状态的:

    1.  用户提交用户名和密码的表单,这通常是一个POST HTTP 请求。

    2.  服务器验证用户名和密码,如果合法则返回200(OK)并设置Set-Cookie 为 authed = ture 。

    3.  浏览器存储该Cookie。

    4.  浏览器发送请求时,设置Cookie字段为authed = ture。

    5.   服务器收到第二次请求,从Cookie字段得知该用户已经登录。按照已登录用户的权限来处理此次请求

  这里面存在的问题在哪?

      我们知道可以发送HTTP请求的不只是浏览器,很多HTTP客户端软件也可以发送任意的HTTP请求,可以设置任何头字段。假如我们直接设置Cookie字段为authed = true

并发送该HTTP请求,服务器岂不是被欺骗了?这种攻击非常容易,Cookie是可以被篡改的!

4. Cookie防篡改机制 

 服务器可以为每个Cookie项生成签名,由于用户篡改Cookie后无法生成对应的签名, 服务器便可以得知用户对Cookie进行了篡改。一个简单的校验过程可能是这样的:

  1. 在服务器中配置一个不为人知的字符串(我们叫它Secret),比如:x$sfz32。
  2. 当服务器需要设置Cookie时(比如authed=false),不仅设置authed的值为false, 在值的后面进一步设置一个签名,最终设置的Cookie是authed=false|6hTiBl7lVpd1P。
  3. 签名6hTiBl7lVpd1P是这样生成的:Hash(‘x$sfz32‘+‘true‘)。 要设置的值与Secret相加再取哈希。
  4. 用户收到HTTP响应并发现头字段Set-Cookie: authed=false|6hTiBl7lVpd1P。
  5. 用户在发送HTTP请求时,篡改了authed值,设置头字段Cookie: authed=true|???。 因为用户不知道Secret,无法生成签名,只能随便填一个。
  6. 服务器收到HTTP请求,发现Cookie: authed=true|???。服务器开始进行校验: Hash(‘true‘+‘x$sfz32‘),便会发现用户提供的签名不正确。

通过给Cookie添加签名,使得服务器得以知道Cookie被篡改。然而故事并未结束,这样还是不安全。 因为Cookie是明文传输的, 只要服务器设置过一次authed=true|xxxx我不就知道true的签名是xxxx了么, 以后就可以用这个签名来欺骗服务器了。因此Cookie中最好不要放敏感数据。 一般来讲Cookie中只会放一个Session Id,而Session存储在服务器端

5. Session的实现机制

    Session是存储在服务器端的,避免了在客户端Cookie中存储敏感数据。Session可以存储在HTTP服务器的内存中,也可以存在数据库中,对于重量级的应用甚至可以

  存储在数据库中。我们以存储在redis中的Session为例,来考察如何验证用户登录状态的问题。

    1.  用户提交包含用户名和密码的表单,发送HTTP请求。

    2.  服务器验证用户发来的用户名和密码

    3.  如果正确则把当前用户名(通常是用户对象)存储到redis中,并生成它在redis中的ID。 这个ID称为Session ID,通过Session ID可以从Redis中取出对应的用户

       对象, 敏感数据(比如authed=true)都存储在这个用户对象中。

    4.  设置Cookie为sessionId=xxxxxx|checksum并发送HTTP响应, 仍然为每一项Cookie都设置签名。

    5.  用户收到HTTP响应后,便看不到任何敏感数据了。在此后的请求中发送该Cookie给服务器。

    6.  服务器收到此后的HTTP请求后,发现Cookie中有SessionID,进行放篡改验证。

    7.  如果通过了验证,根据该ID从Redis中取出对应的用户对象, 查看该对象的状态并继续执行业务逻辑。

   Web应用框架都是实现上述过程,在Web应用中可以直接获取当前用户。相当于在HTTP协议之上,通过Cookie实现了持久的会话。这个会话便称为Session。

时间: 2024-12-24 07:03:53

关于HTTP中cookie 和session机制的相关文章

PHP 中cookie 和 session 的分析

1. PHP 的COOKIE cookie 是一种在远程浏览器端储存数据并以此来跟踪和识别用户的机制.     PHP 在http 协议的头信息里发送cookie,因此  setcookie()     函数必须在其它信息被输出到浏览器 前调用,这和对  header()    函数的限制类似. 1.1 设置cookie: 可以用 setcookie()或 setrawcookie()函数来设置 cookie.也可以通过向客户端直接发送http  头来 设置.     1.1.1  使用 set

理解Cookie和Session机制

转自:http://my.oschina.net/xianggao/blog/395675 会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话.常用的会话跟踪技术是Cookie与Session.Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份. 本章将系统地讲述Cookie与Session机制,并比较说明什么时候不能用Cookie,什么时候不能用Session. Cookie机制 Cookie技术是客户端的解决方案,Cooki

理解Cookie和Session机制(转)

目录[-] Cookie机制 什么是Cookie 记录用户访问次数 Cookie的不可跨域名性 Unicode编码:保存中文 BASE64编码:保存二进制图片 设置Cookie的所有属性 Cookie的有效期 Cookie的修改.删除 Cookie的域名 Cookie的路径 Cookie的安全属性 JavaScript操作Cookie 案例:永久登录 Session机制 什么是Session 实现用户登录 Session的生命周期 Session的有效期 Session的常用方法 Session

Cookie和Session机制详解

会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话.常用的会话跟踪技术是Cookie与Session.Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份. 会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话. ?Cookie是客户端技术,程序(服务器)把每个用户的数据以cookie的形式写给用户各自的浏览器.当用户使用浏览器再去访问服务器中的web资源时,就会带着

Cookie 和 Session机制具体解释

原文地址:http://blog.csdn.net/fangaoxin/article/details/6952954 会话(Session)跟踪是Web程序中经常使用的技术.用来跟踪用户的整个会话.经常使用的会话跟踪技术是Cookie与Session.Cookie通过在client记录信息确定用户身份.Session通过在server端记录信息确定用户身份. 本章将系统地讲述Cookie与Session机制.并比較说明什么时候不能用Cookie,什么时候不能用Session. 1.1 Cook

正确理解cookie和session机制原理

php中cookie和session是我们常用的两个变量了,一个是用户客户端的,一个用在服务器的但他们的区别与工作原理怎么样,下面我们一起来看看cookie和session机制原理吧. cookie和session机制之间的区别和联系 具体来说cookie机制采用的是在客户端保持状态的方案.它是在用户端的会话状态的存贮机制,他需要用户打开客户端的cookie支持.cookie的作用就是为了解决HTTP协议无状态的缺陷所作的努力. 而session机制采用的是一种在客户端与服务器之间保持状态的解决

Http中Cookie和Session介绍

先介绍下B/S系统的工作的完整过程.首先客户端的浏览器发出请求,服务端的webserver接受到请求后,调用相关请求的页面进行处理,处理完后将结果发送给客户端的浏览器进行显示.只能是浏览器向webserver发送请求,webserver响应请求,而webserver不会主动的向客户端发送信息.因为它不知道向谁发送哪些信息.把服务端比喻成一个矜持的小姑娘,你问她要什么她才会回答什么.浏览器与webserver的交互是暂时的,当请求响应的过程完毕后,这种连接也随之结束.换句话说webserver根本

cookie和session机制

一.cookie和session机制之间的区别和联系 1.cookie机制 Cookie意为"甜饼",是由W3C组织提出,最早由Netscape社区发展的一种机制.目前Cookie已经成为标准,所有的主流浏览器如IE.Netscape.Firefox.Opera等都支持Cookie. Cookie的含义是"服务器送给浏览器的甜点",即服务器在响应请求时可以将一些数据以"键-值"对的形式通过响应信息保存在客户端.当浏览器再次访问相同的应用时,会将原

关于cookie的文章(cookie与session机制)

会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话.常用的会话跟踪技术是Cookie与Session.Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份. 本章将系统地讲述Cookie与Session机制,并比较说明什么时候不能用Cookie,什么时候不能用Session. 1.1  Cookie机制 在程序中,会话跟踪是很重要的事情.理论上,一个用户的所有请求操作都应该属于同一个会话,而另一个用户的所有请求操作则应该属于另一个