浅谈 cookie与session

原创 2018年04月17日 18:01:20

  谈论这两个之前,首先要说的就是HTTP协议,HTTP协议是无状态的协议

 无状态是指协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。即我们给服务器发送 HTTP 请求之后,服务器根据请求,会给我们发送数据过来,但是,发送完,不会记录任何信息。

这意味着每个请求都是独立的,缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。

HTTP 协议这种特性有优点也有缺点,优点在于解放了服务器,每一次请求“点到为止”不会造成不必要连接占用,缺点在于每次请求会传输大量重复的内容信息。

客户端与服务器进行动态交互的 Web 应用程序出现之后,HTTP 无状态的特性严重阻碍了这些应用程序的实现,毕竟交互是需要承前启后的。

举个例子,简单的购物车程序也要知道用户到底在之前选择了什么商品。当你点击下单按钮时,由于HTTP协议无状态,所以并不知道是哪个用户操作的,但是我们要服务端认识这个用户,并且跟踪用户,这样才知道购物车里面有几本书。

于是,两种用于保持 HTTP 连接状态的技术就应运而生了,一个是 Cookie,而另一个则是 Session。


什么是cookie

 某些网站为了辨别用户身份而储存在用户本地终端(Client Side)上的数据(通常经过加密)。


在典型的网上购物场景中,用户浏览了几个页面,买了一盒饼干和两瓶饮料。最后结帐时,由于HTTP的无状态性,不通过额外的手段,服务器并不知道用户到底买了什么,所以Cookie就是用来绕开HTTP的无状态性的“额外手段”之一。服务器可以设置或读取Cookies中包含信息,借此维护用户跟服务器会话中的状态。

在刚才的购物场景中,当用户选购了第一项商品,服务器在向用户发送网页的同时,还发送了一段Cookie,记录着那项商品的信息。当用户访问另一个页面,浏览器会把Cookie发送给服务器,于是服务器知道他之前选购了什么。用户继续选购饮料,服务器就在原来那段Cookie里追加新的商品信息。结帐时,服务器读取发送来的Cookie就行了。

Cookie另一个典型的应用是当登录一个网站时,网站往往会请求用户输入用户名和密码,并且用户可以勾选“下次自动登录”。如果勾选了,那么下次访问同一网站时,用户会发现没输入用户名和密码就已经登录了。这正是因为前一次登录时,服务器发送了包含登录凭据(用户名加密码的某种加密形式)的Cookie到用户的硬盘上。第二次登录时,如果该Cookie尚未到期,浏览器会发送该Cookie,服务器验证凭据,于是不必输入用户名和密码就让用户登录了。


                                

当用户使用浏览器访问一个支持Cookie的网站的时候,用户会提供包括用户名在内的个人信息并且提交至服务器;接着,服务器在向客户端回传相应的超文本的同时也会发回这些个人信息,当然这些信息并不是存放在HTTP响应体(Response Body)中的,而是存放于HTTP响应头(Response Header);当客户端浏览器接收到来自服务器的响应之后,浏览器会将这些信息存放在一个统一的位置。自此,客户端再向服务器发送请求的时候,都会把相应的Cookie再次发回至服务器。而这次,Cookie信息则存放在HTTP请求头(Request Header)了。

什么是session

Session 是存储在服务器端的,避免了在客户端Cookie中存储敏感数据。

如果说Cookie机制是通过检查客户身上的“通行证”来确定客户身份的话,那么Session机制就是通过检查服务器上的“客户明细表”来确认客户身份。Session相当于程序在服务器上建立的一份客户档案,客户来访的时候只需要查询客户档案表就可以了。

当程序需要为某个客户端的请求创建一个session的时候,服务器首先检查这个客户端的请求里是否已包含了一个session标识 - 称为session id,如果已包含一个session id则说明以前已经为此客户端创建过session,服务器就按照session id把这个session检索出来使用(如果检索不到,可能会新建一个),如果客户端请求不包含session id,则为此客户端创建一个session并且生成一个与此session相关联的session id,session id的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个session id将被在本次响应中返回给客户端保存。

思考一下服务端如何识别特定的客户?这个时候Cookie就登场了。每次HTTP请求的时候,客户端都会发送相应的Cookie信息到服务端。实际上大多数的应用都是用 Cookie 来实现Session跟踪的,第一次创建Session的时候,服务端会在HTTP协议中告诉客户端,需要在 Cookie 里面记录一个Session ID,以后每次请求把这个会话ID发送到服务器,我就知道你是谁了。

所以说,session 的运行依赖 session id,而 session id 是存在 cookie 中的,也就是说,如果浏览器禁用了 cookie ,同时 session 也会失效(但是可以通过其它方式实现,比如在 url 中传递 session_id)


总结:

Session是在服务端保存的一个数据结构,用来跟踪用户的状态,这个数据可以保存在集群、数据库、文件中;
Cookie是客户端保存用户信息的一种机制,用来记录用户的一些信息,也是实现Session的一种方式。

本文暂不讨论安全问题,待补充~









Session与Cookie的区别与联系

Session与Cookie的区别与联系
  • u014336799
  • u014336799
  • 2015-11-01 23:58:50
  • 2379

session和cookie 区别(面试)

session原理: 1、session是保存在服务器端,理论上是没有是没有限制,只要你的内存够大 2、浏览器第一次访问服务器时会创建一个session对象并返回一个JSESSIONID=...
  • qq_35257397
  • qq_35257397
  • 2016-10-29 22:37:58
  • 2591

session与cookie区别精选

  • 2017年09月12日 10:29
  • 20KB
  • 下载

session和cookie的区别

  • 2018年01月09日 13:01
  • 3KB
  • 下载

PHP 关于cookie的应该

  • 2008年11月22日 14:41
  • 8KB
  • 下载

SESSION是否依赖COOKIE问题总结

Cookie与 Session,一般认为是两个独立的东西,Session采用的是在服务器端保持状态的方案,而Cookie采用的是在客户端保持状态的方案。但为什么禁用Cookie就不能得到Session...
  • CNYYGJ
  • CNYYGJ
  • 2016-12-01 00:21:23
  • 1717

老生常谈session、cookie的区别、安全性

一,为什么session,cookie经常会有人提到 做web开发的人基本上都会用session和cookie,但是仅仅只是会用,并不知道session和cookie的真正的工作原理,都只是凭着感觉...
  • rongwenbin
  • rongwenbin
  • 2016-06-29 17:30:07
  • 7206

深入分析理解session与cookie的作用

session与cookie在web开发中我们用到的不少了,那么关于session与cookie你有深入理解吗?今天我们就一起来看一篇关于深入分析理解session与cookie的作用的例子。 ...
  • u011816231
  • u011816231
  • 2017-04-06 09:38:59
  • 5033

session与cookie有效时间

session有效期 cookie有效期 session.cookie_lifetime session.gc_maxlifetime
  • ljl890705
  • ljl890705
  • 2017-12-21 15:44:24
  • 355

Cookie与SESSION有什么区别

  • 2011年06月26日 20:33
  • 30KB
  • 下载
收藏助手
不良信息举报
您举报文章:浅谈 cookie与session
举报原因:
原因补充:

(最多只允许输入30个字)