服务器端cookie和客户端cookie之间有什么区别?

时间:2011-08-03 05:41:57

标签: http cookies session-cookies

在服务器和客户端上创建cookie有什么区别?这些是服务器端cookie和客户端cookie吗?有没有办法创建只能在服务器或客户端上读取的cookie?

5 个答案:

答案 0 :(得分:125)

HTTP COOKIES

Cookie是网站用于在浏览器上存储状态信息的键/值对。 假设您有一个网站(example.com),当浏览器请求网页时,该网站可以发送cookie以在浏览器上存储信息。

浏览器请求示例:

GET /index.html HTTP/1.1
Host: www.example.com

来自服务器的示例答案:

HTTP/1.1 200 OK
Content-type: text/html
Set-Cookie: foo=10
Set-Cookie: bar=20; Expires=Fri, 30 Sep 2011 11:48:00 GMT
... rest  of the response

这里有两个cookie foo = 10和bar = 20存储在浏览器中。第二个将于9月30日到期。 在每个后续请求中,浏览器都会将cookie发送回服务器。

GET /spec.html HTTP/1.1
Host: www.example.com
Cookie: foo=10; bar=20
Accept: */*

SESSIONS:服务器端cookie

服务器端cookie称为“会话”。在这种情况下,网站在浏览器上存储一个包含唯一会话标识符的cookie。状态信息(foo = 10和bar = 20以上)存储在服务器上,会话标识符用于将请求与存储在服务器上的数据进行匹配。

用法示例

您可以使用会话和Cookie来存储:身份验证数据,用户首选项,电子商务网站中图表的内容等等。

优点和缺点

以下解决方案的优缺点。这是我想到的第一个,肯定还有其他的。

Cookie优点:

  • 可扩展性:所有数据都存储在浏览器中,因此每个请求都可以通过负载均衡器到达不同的Web服务器,并且您拥有完成请求所需的所有信息;
  • 可以通过浏览器上的javascript访问它们;
  • 不在服务器上,他们将在服务器重启后继续存在;
  • RESTful:请求不依赖于服务器状态

Cookie缺点:

会话优点:

  • 通常更容易使用,在PHP中可能没什么区别。
  • 无限存储

会话缺点:

  • 更难以扩展
  • 在Web服务器重新启动时,您可能会丢失所有会话,具体取决于实现
  • 不是RESTful

答案 1 :(得分:51)

您可能意味着Http Only cookies与其对应部分之间存在差异?

Http只能在客户端JavaScript(仅服务器端)访问(读取或写入)cookie。如果未设置Http Only标志,或者在(客户端)JavaScript中创建cookie,则可以在(客户端)JavaScript和服务器端读取和写入cookie。

答案 2 :(得分:28)

所有Cookie都是客户端服务器

没有区别。常规cookie可以设置为服务器端或客户端。 “经典”cookie将随每个请求一起发回。由服务器设置的cookie将在响应中发送到客户端。服务器仅在显式设置或更改cookie时发送cookie,而客户端在每个请求上发送cookie。

但基本上它是相同的cookie。

但是,行为可以改变

Cookie基本上是name=value对,但after the value可以是一串分号分隔的属性,它们会影响Cookie的行为 if < / em>它是由客户端(或服务器)实现的。 这些属性可以是关于生命周期,上下文和各种安全设置。

仅限HTTP(不仅限服务器)

服务器可以设置其中一个属性,以指示它是仅HTTP的cookie。这意味着cookie仍然来回发送,但它不能在JavaScript中使用。但请注意,cookie仍然存在!它只是浏览器中的内置保护,但如果有人会使用像IE5这样荒谬的旧浏览器,或者某些自定义客户端,他们实际上可以读取cookie!

所以看起来有'服务器cookie',但实际上没有。这些cookie仍然发送给客户端。在客户端上,无法阻止cookie被发送到服务器。

实现“唯一”的替代方案

如果您只想在服务器上存储一个值,或者只在客户端上存储一个值,那么您需要一些其他类型的存储,例如服务器上的文件或数据库,或客户端上的本地存储。

答案 3 :(得分:2)

  1. 是的,您可以创建只能在服务器端读取的cookie。这些被称为“仅HTTP” -cookie,如其他答案中所述

  2. 不,(我知道)没有办法创建只能在客户端读取的“ cookie”。 Cookies旨在促进客户端与服务器之间的通信。

  3. 但是,如果您想要类似“ client-only-cookies”的选项,则有一个简单的答案:使用“本地存储”。

实际上,本地存储在语法上比cookie更简单。有关Cookie与本地存储的简要概述,请访问:

https://courses.cs.washington.edu/courses/cse154/12au/lectures/slides/lecture21-client-storage.shtml#slide8

要点:您可能会使用在JavaScript中创建的cookie来存储只在客户端需要的与GUI相关的内容。但是对于每次发出的请求,cookie都会发送到服务器,它成为http-request标头的一部分,因此使请求包含更多数据,因此发送速度较慢。

如果您的页面有50个资源(例如图像,css文件和脚本),则cookie(通常)随每个请求发送。 Does every web request send the browser cookies?

中的更多内容

本地存储没有那些与数据传输有关的缺点,它不发送任何数据。太棒了。

答案 4 :(得分:0)

在服务器和服务器上创建cookie有什么区别 客户?

您所指的是可以在客户端上定向设置cookie的2种方法,即:

  • 通过服务器
  • 通过客户端(大多数情况下是浏览器)

通过服务器: 来自服务器的Set-cookie响应标头指示客户端在该特定域上设置cookie。实际创建和存储cookie的实现位于浏览器中。对于对同一域的后续请求,浏览器会自动为每个请求设置Cookie请求标头,从而使服务器将某种状态设为原本无状态的HTTP协议。浏览器使用DomainPath cookie属性来确定要将哪些cookie发送到服务器。 服务器仅接收name=value对,仅此而已。

通过客户: 可以使用document.cookie = cookiename=cookievalue在浏览器上创建cookie。但是,如果服务器不打算响应用户创建的任何随机cookie,那么这种cookie就没有用。

这些叫服务器端Cookie和客户端Cookie吗?

Cookie始终属于客户端。没有服务器端Cookie。

有没有一种方法可以创建只能在服务器上读取的cookie 还是在客户身上?

由于读取cookie值取决于服务器和客户端,因此取决于是否需要读取cookie。 在客户端,通过设置cookie的HttpOnly属性,可以防止脚本(主要是Javscript)读取您的cookie,从而充当通过XSS防止cookie盗窃的防御机制,但会将cookie发送给仅限目标服务器。

因此,在大多数情况下,由于使用cookie来带来“状态”(过去用户事件的记忆),因此在客户端创建cookie不会增加太多价值,除非人们知道服务器使用/响应的cookie。

参考:Wikipedia