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

Rah*_*hul 102 cookies http session-cookies

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

小智 131

HTTP COOKIES

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

浏览器请求示例:

GET /index.html HTTP/1.1
Host: www.example.com
Run Code Online (Sandbox Code Playgroud)

来自服务器的示例答案:

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
Run Code Online (Sandbox Code Playgroud)

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

GET /spec.html HTTP/1.1
Host: www.example.com
Cookie: foo=10; bar=20
Accept: */*
Run Code Online (Sandbox Code Playgroud)

会话:服务器端cookie

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

用法示例

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

优点和缺点

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

Cookie优点:

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

Cookie缺点:

会议优点:

  • 通常更容易使用,在PHP中可能没有太大区别.
  • 无限存储

会议缺点:

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

  • 很大程度上误导性的答案 - 会话不是cookie.https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#HTTP_session您可以拥有会话变量,具体取决于在服务器上实施会话管理的方式.您通常拥有一个或多个与会话管理相关的cookie,方法是保存会话标识符.REST和RESTful也与cookie或会话管理无关 - REST和RESTful实现可以有会话和cookie. (5认同)
  • 会话优点:“安全”? (2认同)
  • 参见/sf/ask/2453838831/我不是说会话通常不是用cookie实现的,但是会话管理还有其他选择,因此这是错误的谈论会话变量作为服务器端Cookie。我在2017年在上面的评论中说“ REST和RESTful实现可以具有会话和cookie”时,也指的是JWT。尽管一些纯粹主义者可能会争辩说这不是实现REST API的正确方法。 (2认同)

nik*_*org 53

你可能意味着Http Only cookies和他们的对手部分之间的区别?

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


Gol*_*rol 31

所有cookie都是客户端服务器

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

但基本上它是相同的cookie.

但是,行为可能会改变

Cookie基本上是name=value一对,但在值之后可以是一串分号分隔的属性,如果客户端(或服务器)如​​此实现,则会影响cookie的行为.这些属性可以是关于生命周期,上下文和各种安全设置.

仅限HTTP(不仅仅是服务器)

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

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

实现'唯一'的替代方案

如果要仅在服务器上存储值,或仅在客户端上存储值,则需要其他类型的存储,例如服务器上的文件或数据库,或客户端上的本地存储.

  • @KaranChadha,您好,如果您有疑问,请使用页面顶部的“提问”按钮作为正式问题提出。对一个 7 年前的问题的评论可能不会引起足够的关注。添加此问答的链接,甚至专门添加此答案的链接当然可以。您可以使用每个帖子底部的“分享”按钮。 (2认同)

KJ *_*han 6

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

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

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

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

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

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

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

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

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

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

参考:维基百科