在服务器和客户端上创建cookie有什么区别?这些称为服务器端Cookie和客户端Cookie吗?有没有一种方法可以创建只能在服务器或客户端上读取的cookie?
在服务器和客户端上创建cookie有什么区别?这些称为服务器端Cookie和客户端Cookie吗?有没有一种方法可以创建只能在服务器或客户端上读取的cookie?
Answers:
Cookies是网站用于在浏览器中存储状态信息的键/值对。假设您有一个网站(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。状态信息(上面的foo = 10和bar = 20)存储在服务器上,并且会话标识符用于将请求与存储在服务器上的数据进行匹配。
您可以同时使用会话和cookie来存储:身份验证数据,用户首选项,电子商务网站中图表的内容等。
以下是解决方案的优缺点。这些是我首先想到的,肯定还有其他人。
Cookie优点:
Cookie缺点:
专业会议:
会话缺点:
secure
?
您可能是说Http Only cookie和其对应部分之间的区别?
Http仅cookie无法在客户端JavaScript(仅服务器)中访问(读取或写入)。如果未设置Http Only标志,或者在(客户端)JavaScript中创建了cookie,则可以在(客户端)JavaScript和服务器端中读取和写入cookie。
所有cookie都是客户端和服务器
没有区别。可以在服务器端或客户端设置常规Cookie。“经典” cookie将随每个请求一起发送回去。服务器设置的cookie将作为响应发送给客户端。服务器仅在显式设置或更改cookie时发送cookie,而客户端在每个请求时发送cookie。
但本质上是相同的cookie。
但是,行为可以改变
Cookie基本上是name=value
一对,但是在值之后可以是一串用分号分隔的属性,这些属性会影响Cookie的行为(如果由客户端(或服务器)实现的话)。这些属性可以与生存期,上下文和各种安全设置有关。
仅HTTP(不是仅服务器)
服务器可以设置这些属性之一,以指示它是仅HTTP的cookie。这意味着cookie仍会来回发送,但在JavaScript中将不可用。但是请注意,cookie仍然存在!它只是浏览器中的内置保护,但是如果有人使用像IE5这样可笑的旧浏览器或某些自定义客户端,他们实际上可以读取cookie!
因此,似乎有“服务器cookie”,但实际上没有。这些cookie仍将发送给客户端。在客户端上,无法阻止将cookie发送到服务器。
实现“唯一性”的替代方法
如果要只在服务器上或仅在客户端上存储值,则需要某种其他类型的存储,例如服务器上的文件或数据库,或客户端上的本地存储。
document.cookie="foo=bar"
,然后fetch("/foobar", {credentials: 'include'} )
没有包含发送的cookie foo=bar
。刚刚使用DevTools和控制台在此站点上直接尝试了该代码。
是的,您可以创建只能在服务器端读取的cookie。这些称为“仅HTTP” -cookie,如其他答案中所述
不,(我知道)没有办法创建只能在客户端读取的“ cookie”。Cookies旨在促进客户端与服务器之间的通信。
但是,如果您想要类似“ client-only-cookies”的选项,则有一个简单的答案:使用“本地存储”。
实际上,本地存储在语法上比cookie更易于使用。有关Cookie与本地存储的简要概述,请参见:
重点:您可以使用在JavaScript中创建的cookie来存储只在客户端需要的与GUI相关的内容。但是对于每次发出的请求,cookie都会发送到服务器,它成为http-request标头的一部分,因此使请求包含更多数据,因此发送速度较慢。
如果您的页面有50个资源(例如图像,css文件和脚本),则cookie(通常)随每个请求一起发送。有关每个Web请求是否发送浏览器cookie的更多信息。
本地存储没有那些与数据传输相关的缺点,它不发送任何数据。这太棒了。