在服务器和客户端创建cookie之间有什么区别?这些被称为服务器端cookie和客户端cookie吗?是否有一种方法可以创建只能在服务器或客户端上读取的cookie?
在服务器和客户端创建cookie之间有什么区别?这些被称为服务器端cookie和客户端cookie吗?是否有一种方法可以创建只能在服务器或客户端上读取的cookie?
Cookie是网站用于在浏览器上存储状态信息的键值对。例如,当浏览器请求一个网页时,网站可以发送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。第二个cookie将在9月30日过期。 在每个后续请求中,浏览器都会将cookie发送回服务器。
GET /spec.html HTTP/1.1
Host: www.example.com
Cookie: foo=10; bar=20
Accept: */*
服务器端的Cookies被称为“会话”。在这种情况下,网站在浏览器上存储一个包含唯一会话标识符的单个Cookie。状态信息(如上面的foo=10和bar=20)存储在服务器上,并使用会话标识符将请求与存储在服务器上的数据匹配。
您可以使用会话和Cookies来存储:身份验证数据、用户首选项、电子商务网站中图表的内容等等...
以下是解决方案的优缺点。这些是我首先想到的,肯定还有其他的。
Cookie优点:
Cookie缺点:
会话优点:
会话缺点:
安全
? - user2167582您可能是指Http Only cookie与它们的对应物之间的区别?
Http Only cookie 不能被客户端 JavaScript 访问(读取或写入),只能在服务器端访问。如果未设置 Http Only 标志,或者 cookie 是在(客户端)JavaScript 中创建的,则该 cookie 可以在客户端 JavaScript 和服务器端中读取和写入。
所有的cookie都是客户端和服务器共用的
没有区别。普通cookie可以在服务器端或客户端设置。 “经典”cookie将随每个请求返回。由服务器设置的cookie将在响应中发送给客户端。只有在显式设置或更改时,服务器才会发送cookie,而客户端会在每个请求上发送cookie。
但从本质上讲,它们是相同的cookie。
不过,行为可能会发生改变
Cookie基本上是一个名称=值
对,但值后面可以是一些分号分隔的属性,如果客户端(或服务器)实现了它,则会影响 cookie的行为。这些属性可能涉及生存期、上下文和各种安全设置。
HTTP-only(不仅限于服务器)
其中之一的属性可以由服务器设置,以指示它是一个HTTP-only cookie。这意味着cookie仍然来回发送,但它在JavaScript中不可用。请注意,cookie仍然存在!这只是浏览器内置的保护措施,但是,如果有人使用像IE5这样的过时浏览器或某些自定义客户端,他们实际上可以读取cookie!
因此,似乎存在“服务器cookie”,但实际上并不存在。这些cookie仍然发送到客户端。在客户端上,没有办法阻止cookie被发送到服务器。
实现“仅限”的替代方法
如果您想仅在服务器或仅在客户端存储值,则需要其他一些类型的存储,例如服务器上的文件或数据库,或客户端上的本地存储(Local Storage)。
document.cookie="foo=bar"
,然后跟着 fetch("/foobar", {credentials: 'include'} )
,没有包含 foo=bar
的 cookie 被发送。我刚刚在这个网站上使用 DevTools 和控制台直接尝试了一下这段代码。 - oligofrenHttpOnly
属性,可以防止脚本(主要是Javascript)读取您的Cookie,从而作为防御机制防止通过XSS进行Cookie盗窃,但仅将Cookie发送到预期的服务器。
因此,在大多数情况下,由于Cookie用于带来“状态”(记忆过去用户事件),在客户端创建Cookie并没有太大价值,除非您了解服务器使用/响应的Cookie。
参考:维基百科本地存储实际上比Cookie更容易使用。关于Cookie和本地存储的简明概述,请参阅:
一点说明:你可能会使用在JavaScript中创建的cookie来存储GUI相关的内容,这些内容只需要在客户端上使用。但是cookie会被发送到每个请求中的服务器,成为http-request headers的一部分,从而使请求包含更多数据,因此发送速度较慢。
如果您的页面具有50个资源,例如图像、CSS文件和脚本,则cookie通常会随每个请求一起发送。有关详细信息,请参阅Does every web request send the browser cookies?
本地存储没有这些与数据传输相关的缺点,它不发送任何数据。它非常好。