【问题标题】:What is the difference between server side cookie and client side cookie?服务器端 cookie 和客户端 cookie 有什么区别?
【发布时间】:2011-10-18 19:49:07
【问题描述】:

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

【问题讨论】:

  • 没有“服务器端 cookie”与“客户端 cookie”之类的东西。只有 cookie、名称/值对在 HTTP 标头中发送,请求和响应都有。
  • 可能引用会话变量,这些变量在服务器上保存数据。通常还有一个会话标识符作为客户端 cookie 保存。
  • 这个问题很可能是指 cookie 在服务器端编码的不同方式(即它们在“Cookie”和“Set-Cookie”响应标头中的编码方式)和客户端(即它们在“Cookie”请求标头中的编码方式 - $Path 变量和所有爵士乐)。见RFC 2109
  • 稍微重命名这些东西可能会放大主要区别:客户端集和服务器集cookie。 Cookie 是在请求​​和响应中发送的,但主要区别在于 cookie(或引用会话的另一个 id)是在哪一侧创建的。

标签: http cookies session-cookies


【解决方案1】:

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

您所指的是可以将cookie定向到客户端设置的两种方式,它们是:

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

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

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

这些被称为服务器端cookies和客户端cookies吗?

Cookie 始终属于客户端。没有服务器端 cookie 这样的东西。

有没有办法创建只能在服务器上读取的cookie 还是在客户端?

由于读取 cookie 值取决于服务器和客户端,这取决于是否需要读取 cookie。 在客户端,通过设置 cookie 的 HttpOnly 属性,可以防止脚本(主要是 Javscript )读取您的 cookie ,从而起到防止通过 XSS 窃取 cookie 的防御机制,但将 cookie 发送到预期仅限服务器。

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

参考:Wikipedia

【讨论】:

    【解决方案2】:

    HTTP Cookie

    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: */*
    

    会话:服务器端 cookie

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

    使用示例

    您可以同时使用会话和 cookie 来存储:身份验证数据、用户偏好、电子商务网站中图表的内容等...

    优点和缺点

    以下解决方案的优缺点。这些是我首先想到的,肯定还有其他的。

    Cookie 优点:

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

    Cookie 缺点:

    会议优点:

    • 一般来说更容易使用,在 PHP 中可能没有太大区别。
    • 无限存储

    会话缺点:

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

    【讨论】:

    • 会话专家:secure?
    • 为什么会话更安全?如果您通过 http 发送会话 cookie,它可能会被劫持。如果网站使用 https 安全性应该与您使用安全 cookie 相同(加密、签名等...)
    • Cookie 缺点:使每个请求变大,可能会影响性能。我不知道数字,但由于人们确实使用无 cookie 域来处理事情,我认为这很重要。
    • 严重误导的答案 - 会话不是 cookie。 en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#HTTP_session 您可以拥有会话变量,具体取决于在服务器上实现会话管理的方式。通过持有会话标识符,您通常拥有一个或多个与会话管理相关的 cookie。此外,REST 和 RESTful 与 cookie 或会话管理无关 - REST 和 RESTful 实现可以有会话和 cookie。
    • 请参阅stackoverflow.com/questions/35054840/… 我并不是说会话通常不使用 cookie 实现,而是说会话管理还有其他选项,因此将会话变量称为服务器端 cookie 是错误的。当我在 2017 年在上面的评论中说“REST 和 RESTful 实现可以有会话和 cookie”时,我也指的是 JWT。尽管一些纯粹主义者可能会争辩说这不是实现 REST API 的正确方法。
    【解决方案3】:

    所有cookies都是客户端服务器

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

    但本质上它是同一个cookie。

    但是,行为可以改变

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

    仅 HTTP(不是仅服务器)

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

    所以看起来好像有“服务器 cookie”,但实际上没有。这些 cookie 仍会发送到客户端。在客户端上,无法阻止将 cookie 发送到服务器。

    实现“唯一性”的替代方案

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

    【讨论】:

    • 嗨,我对这些概念很陌生并且有一些疑问。对不起,我的问题可能听起来很傻,但我还是会问。非常感谢任何帮助 - 可以将已在客户端设置的 cookie 发送到任何域吗?我的意思是,这不是安全威胁吗?此外,它如何与非浏览器客户端(如 API 等)一起使用?
    • 嗨@KaranChadha,如果您有任何问题,请使用页面顶部的“”按钮作为正式问题提出。一个关于 7 年老问题的评论线程可能不会引起足够的关注。添加到此问答的链接,甚至是专门添加到此答案的链接,当然都可以。为此,您可以使用每个帖子底部的“分享”按钮。
    • 这是真的吗?客户端生成的 cookie 似乎没有被传输。如果执行document.cookie="foo=bar" 后跟fetch("/foobar", {credentials: 'include'} ),则不会发送包含foo=bar 的cookie。刚刚使用 DevTools 和控制台直接在此站点上尝试了该代码。
    • 是的,says also the docs,但有一些细节可能会导致这种情况,比如缺少 expires 属性。
    • @MarinosAn 是的,它可以。但是我的回答有点简短,涉及到修改 cookie 行为的属性,所以我现在稍微扩展一下。
    【解决方案4】:
    1. 是的,您可以创建只能在服务器端读取的 cookie。这些被称为“仅限 HTTP”-cookie,如其他答案中所述

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

    3. 但是,如果您想要“仅客户端 cookie”之类的东西,有一个简单的答案:使用“本地存储”。

    本地存储在语法上实际上比 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?

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

    【讨论】:

      【解决方案5】:

      您可能是指Http Only cookies 和他们的对应部分之间的区别?

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-09-28
        相关资源
        最近更新 更多