如何在HTTP协议中传递cookie?


Answers:


295

服务器在其响应标头中发送以下内容以设置cookie字段。

Set-Cookie:名称=

如果设置了cookie,则浏览器在其请求标头中发送以下内容。

Cookie:名称=

有关更多信息,请参见Wikipedia上的HTTP Cookie文章。


Cookie是否仅适用于GET / POST动词,而不适用于CONNECT吗?
PerlDev 2012年

5
@PerlDev在rfc2109中我什么都看不到,它说它不应该与GET / POST以外的请求一起使用,但是我怀疑浏览器和服务器的实现在这种情况下可能无法实现。
deinst 2012年

5
请注意,根据RFC 2109,如果用户代理或浏览器发送了多个cookie,它将把它们放在由分号分隔的单个字段中:Cookie: name1=value1; name2=value2; ...
jotrocken


32

除了在其他答案中写的内容外,还与Cookie的路径,cookie的最长使用期限(无论它是否受保护)有关的其他详细信息也都传递给Set-Cookie响应标头。例如:

Set-Cookie:名称= [ ; expires=日期 ] [ ; domain= ] [ ; path=路径 ] [ ; secure]


但是,在发出下一个HTTP请求时,客户端不会将所有这些详细信息传递回服务器。

您还可以HttpOnly在Cookie的末尾设置标志,以指示您的Cookie是仅使用http的,并且不允许使用JavaScript代码在脚本中进行访问。这有助于防止诸如会话劫持的攻击。

有关更多信息,请参见RFC 2109。另请参阅Nicholas C. Zakas的文章HTTP Cookies解释


2
这是Zakas文章的直接链接,而不是回溯
Joseph Dykstra

13

创建示例脚本作为resp:

#!/bin/bash

http_code=200
mime=text/html

echo -e "HTTP/1.1 $http_code OK\r"
echo "Content-type: $mime"
echo
echo "Set-Cookie: name=F"

然后使可执行文件并像这样执行。

./resp | nc -l -p 12346

打开浏览器并浏览URL:http:// localhost:1236, 您将看到浏览器发送的Cookie值

    [aaa @ bbbbbbbb] $ ./resp | nc -l -p 12346
    GET / HTTP / 1.1
    主持人:xxx.xxx.xxx.xxx:12346
    连接:保持活动状态
    快取控制:max-age = 0
    接受:text / html,application / xhtml + xml,application / xml; q = 0.9,image / webp,* / *; q = 0.8
    不安全升级请求:1
    用户代理:Mozilla / 5.0(Windows NT 6.1)AppleWebKit / 537.36(KHTML,例如Gecko)Chrome / 49.0.2623.112 Safari / 537.36
    接受编码:gzip,deflate,sdch
    接受语言:en-US,en; q = 0.8,ru; q = 0.6
    Cookie:名称= F

3
如果有多个Cookie,该怎么办?它们之间用逗号分隔吗?
Mark Buikema '17

认为它们被设置为新的cookie。Cookie:名称= F Coo​​kie:名称= A
EAzevedo

2
@MarkBuikema,请参阅docs.microsoft.com/zh-cn/windows/desktop/wininet/http-cookies。它们的发送方式如下:Cookie:<名称> = <值> [; <名称> = <值>] ...
Ben Wheeler
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.