1 | <?xml version="1.0" encoding="utf-8"?> |
---|
2 | <!DOCTYPE rfc [ |
---|
3 | <!ENTITY MAY "<bcp14 xmlns='http://purl.org/net/xml2rfc/ext'>MAY</bcp14>"> |
---|
4 | <!ENTITY MUST "<bcp14 xmlns='http://purl.org/net/xml2rfc/ext'>MUST</bcp14>"> |
---|
5 | <!ENTITY MUST-NOT "<bcp14 xmlns='http://purl.org/net/xml2rfc/ext'>MUST NOT</bcp14>"> |
---|
6 | <!ENTITY OPTIONAL "<bcp14 xmlns='http://purl.org/net/xml2rfc/ext'>OPTIONAL</bcp14>"> |
---|
7 | <!ENTITY RECOMMENDED "<bcp14 xmlns='http://purl.org/net/xml2rfc/ext'>RECOMMENDED</bcp14>"> |
---|
8 | <!ENTITY REQUIRED "<bcp14 xmlns='http://purl.org/net/xml2rfc/ext'>REQUIRED</bcp14>"> |
---|
9 | <!ENTITY SHALL "<bcp14 xmlns='http://purl.org/net/xml2rfc/ext'>SHALL</bcp14>"> |
---|
10 | <!ENTITY SHALL-NOT "<bcp14 xmlns='http://purl.org/net/xml2rfc/ext'>SHALL NOT</bcp14>"> |
---|
11 | <!ENTITY SHOULD "<bcp14 xmlns='http://purl.org/net/xml2rfc/ext'>SHOULD</bcp14>"> |
---|
12 | <!ENTITY SHOULD-NOT "<bcp14 xmlns='http://purl.org/net/xml2rfc/ext'>SHOULD NOT</bcp14>"> |
---|
13 | <!ENTITY shared-and-non-shared-caches "[Part 6]"> |
---|
14 | ]> |
---|
15 | <?rfc toc="yes" ?> |
---|
16 | <?rfc symrefs="yes" ?> |
---|
17 | <?rfc sortrefs="yes" ?> |
---|
18 | <?rfc compact="yes"?> |
---|
19 | <?rfc subcompact="no" ?> |
---|
20 | <?rfc linkmailto="no" ?> |
---|
21 | <?rfc editing="no" ?> |
---|
22 | <?rfc-ext allow-markup-in-artwork="yes" ?> |
---|
23 | <?rfc-ext include-references-in-index="yes" ?> |
---|
24 | <rfc obsoletes="2109, 2965" category="std" |
---|
25 | ipr="full3978" docName="draft-ietf-httpbis-p8-cookies-00" |
---|
26 | xmlns:x='http://purl.org/net/xml2rfc/ext' xmlns:ed="http://greenbytes.de/2002/rfcedit"> |
---|
27 | |
---|
28 | <front> |
---|
29 | <title>HTTP State Management Mechanism</title> |
---|
30 | |
---|
31 | <author initials='D. M.' surname='Kristol' fullname='David M. Kristol'> |
---|
32 | <organization>Bell Laboratories, Lucent Technologies</organization> |
---|
33 | <address> |
---|
34 | <postal> |
---|
35 | <street>600 Mountain Ave. Room 2A-333</street> |
---|
36 | <city>Murray Hill</city> |
---|
37 | <region>NJ</region> |
---|
38 | <code>07974</code> |
---|
39 | </postal> |
---|
40 | <phone>(908) 582-2250</phone> |
---|
41 | <facsimile>(908) 582-1239</facsimile> |
---|
42 | <email>dmk@bell-labs.com</email> |
---|
43 | </address> |
---|
44 | </author> |
---|
45 | |
---|
46 | <author initials='L.' surname='Montulli' fullname='Lou Montulli'> |
---|
47 | <organization>Epinions.com, Inc.</organization> |
---|
48 | <address> |
---|
49 | <postal> |
---|
50 | <street>2037 Landings Dr.</street> |
---|
51 | <city>Mountain View</city> |
---|
52 | <region>CA</region> |
---|
53 | <code>94301</code> |
---|
54 | </postal> |
---|
55 | <email>lou@montulli.org</email> |
---|
56 | </address> |
---|
57 | </author> |
---|
58 | |
---|
59 | <date month='October' year='2000'></date> |
---|
60 | |
---|
61 | <abstract> |
---|
62 | <t> |
---|
63 | This document specifies a way to create a stateful session with |
---|
64 | Hypertext Transfer Protocol (HTTP) requests and responses. It |
---|
65 | describes three new headers, Cookie, Cookie2, and Set-Cookie2, which |
---|
66 | carry state information between participating origin servers and user |
---|
67 | agents. The method described here differs from Netscape's Cookie |
---|
68 | proposal <xref target="Netscape"/>, but it can interoperate with HTTP/1.0 user |
---|
69 | agents that use Netscape's method. (See the HISTORICAL section.) |
---|
70 | </t><t> |
---|
71 | This document reflects implementation experience with RFC 2109 and |
---|
72 | obsoletes it. |
---|
73 | </t> |
---|
74 | </abstract> |
---|
75 | </front> |
---|
76 | <middle> |
---|
77 | <section title="TERMINOLOGY"> |
---|
78 | <t> |
---|
79 | The terms user agent, client, server, proxy, origin server, and |
---|
80 | http_URL have the same meaning as in the HTTP/1.1 specification |
---|
81 | <xref target="RFC2616"/>. The terms abs_path and absoluteURI have the same meaning |
---|
82 | as in the URI Syntax specification <xref target="RFC2396"/>. |
---|
83 | </t> |
---|
84 | <t> |
---|
85 | Host name (HN) means either the host domain name (HDN) or the numeric |
---|
86 | Internet Protocol (IP) address of a host. The fully qualified domain |
---|
87 | name is preferred; use of numeric IP addresses is strongly |
---|
88 | discouraged. |
---|
89 | </t> |
---|
90 | <t> |
---|
91 | The terms request-host and request-URI refer to the values the client |
---|
92 | would send to the server as, respectively, the host (but not port) |
---|
93 | and abs_path portions of the absoluteURI (http_URL) of the HTTP |
---|
94 | request line. Note that request-host is a HN. |
---|
95 | </t> |
---|
96 | <t> |
---|
97 | The term effective host name is related to host name. If a host name |
---|
98 | contains no dots, the effective host name is that name with the |
---|
99 | string .local appended to it. Otherwise the effective host name is |
---|
100 | the same as the host name. Note that all effective host names |
---|
101 | contain at least one dot. |
---|
102 | </t> |
---|
103 | <t> |
---|
104 | The term request-port refers to the port portion of the absoluteURI |
---|
105 | (http_URL) of the HTTP request line. If the absoluteURI has no |
---|
106 | explicit port, the request-port is the HTTP default, 80. The |
---|
107 | request-port of a cookie is the request-port of the request in which |
---|
108 | a Set-Cookie2 response header was returned to the user agent. |
---|
109 | </t> |
---|
110 | <t> |
---|
111 | Host names can be specified either as an IP address or a HDN string. |
---|
112 | Sometimes we compare one host name with another. (Such comparisons |
---|
113 | &SHALL; be case-insensitive.) Host A's name domain-matches host B's if |
---|
114 | <list style="symbols"> |
---|
115 | <t>their host name strings string-compare equal; or</t> |
---|
116 | |
---|
117 | <t>A is a HDN string and has the form NB, where N is a non-empty |
---|
118 | name string, B has the form .B', and B' is a HDN string. (So, |
---|
119 | x.y.com domain-matches .Y.com but not Y.com.)</t> |
---|
120 | </list> |
---|
121 | </t> |
---|
122 | <t> |
---|
123 | Note that domain-match is not a commutative operation: a.b.c.com |
---|
124 | domain-matches .c.com, but not the reverse. |
---|
125 | </t> |
---|
126 | <t> |
---|
127 | The reach R of a host name H is defined as follows: |
---|
128 | <list style="symbols"> |
---|
129 | <t>If |
---|
130 | <list style="symbols"> |
---|
131 | <t>H is the host domain name of a host; and,</t> |
---|
132 | <t>H has the form A.B; and</t> |
---|
133 | <t>A has no embedded (that is, interior) dots; and</t> |
---|
134 | <t>B has at least one embedded dot, or B is the string "local". |
---|
135 | then the reach of H is .B.</t> |
---|
136 | </list> |
---|
137 | </t> |
---|
138 | <t>Otherwise, the reach of H is H.</t> |
---|
139 | </list> |
---|
140 | </t> |
---|
141 | <t> |
---|
142 | For two strings that represent paths, P1 and P2, P1 path-matches P2 |
---|
143 | if P2 is a prefix of P1 (including the case where P1 and P2 string- |
---|
144 | compare equal). Thus, the string /tec/waldo path-matches /tec. |
---|
145 | </t> |
---|
146 | <t> |
---|
147 | Because it was used in Netscape's original implementation of state |
---|
148 | management, we will use the term cookie to refer to the state |
---|
149 | information that passes between an origin server and user agent, and |
---|
150 | that gets stored by the user agent. |
---|
151 | </t> |
---|
152 | |
---|
153 | <section title="Requirements"> |
---|
154 | <t> |
---|
155 | The key words "MAY", "MUST", "MUST NOT", "OPTIONAL", "RECOMMENDED", |
---|
156 | "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT" in this |
---|
157 | document are to be interpreted as described in RFC 2119 <xref target="RFC2119"/>. |
---|
158 | </t> |
---|
159 | </section> |
---|
160 | </section> |
---|
161 | |
---|
162 | <section title="STATE AND SESSIONS"> |
---|
163 | <t> |
---|
164 | This document describes a way to create stateful sessions with HTTP |
---|
165 | requests and responses. Currently, HTTP servers respond to each |
---|
166 | client request without relating that request to previous or |
---|
167 | subsequent requests; the state management mechanism allows clients |
---|
168 | and servers that wish to exchange state information to place HTTP |
---|
169 | requests and responses within a larger context, which we term a |
---|
170 | "session". This context might be used to create, for example, a |
---|
171 | "shopping cart", in which user selections can be aggregated before |
---|
172 | purchase, or a magazine browsing system, in which a user's previous |
---|
173 | reading affects which offerings are presented. |
---|
174 | </t> |
---|
175 | <t> |
---|
176 | Neither clients nor servers are required to support cookies. A |
---|
177 | server &MAY; refuse to provide content to a client that does not return |
---|
178 | the cookies it sends. |
---|
179 | </t> |
---|
180 | </section> |
---|
181 | |
---|
182 | <section title="DESCRIPTION"> |
---|
183 | <t> |
---|
184 | We describe here a way for an origin server to send state information |
---|
185 | to the user agent, and for the user agent to return the state |
---|
186 | information to the origin server. The goal is to have a minimal |
---|
187 | impact on HTTP and user agents. |
---|
188 | </t> |
---|
189 | |
---|
190 | <section title="Syntax: General"> |
---|
191 | <t> |
---|
192 | The two state management headers, Set-Cookie2 and Cookie, have common |
---|
193 | syntactic properties involving attribute-value pairs. The following |
---|
194 | grammar uses the notation, and tokens DIGIT (decimal digits), token |
---|
195 | (informally, a sequence of non-special, non-white space characters), |
---|
196 | and http_URL from the HTTP/1.1 specification <xref target="RFC2616"/> to describe |
---|
197 | their syntax. |
---|
198 | </t> |
---|
199 | <figure><artwork type="abnf2616"> |
---|
200 | av-pairs = av-pair *(";" av-pair) |
---|
201 | av-pair = attr ["=" value] ; optional value |
---|
202 | attr = token |
---|
203 | value = token | quoted-string |
---|
204 | </artwork></figure> |
---|
205 | <t> |
---|
206 | Attributes (names) (attr) are case-insensitive. White space is |
---|
207 | permitted between tokens. Note that while the above syntax |
---|
208 | description shows value as optional, most attrs require them. |
---|
209 | </t> |
---|
210 | <t> |
---|
211 | NOTE: The syntax above allows whitespace between the attribute and |
---|
212 | the = sign. |
---|
213 | </t> |
---|
214 | </section> |
---|
215 | |
---|
216 | <section title="Origin Server Role"> |
---|
217 | <section title="General"> |
---|
218 | <t> |
---|
219 | The origin server initiates a session, if it so |
---|
220 | desires. To do so, it returns an extra response header to the |
---|
221 | client, Set-Cookie2. (The details follow later.) |
---|
222 | </t> |
---|
223 | <t> |
---|
224 | A user agent returns a Cookie request header (see below) to the |
---|
225 | origin server if it chooses to continue a session. The origin server |
---|
226 | &MAY; ignore it or use it to determine the current state of the |
---|
227 | session. It &MAY; send back to the client a Set-Cookie2 response |
---|
228 | header with the same or different information, or it &MAY; send no |
---|
229 | Set-Cookie2 header at all. The origin server effectively ends a |
---|
230 | session by sending the client a Set-Cookie2 header with Max-Age=0. |
---|
231 | </t> |
---|
232 | <t> |
---|
233 | Servers &MAY; return Set-Cookie2 response headers with any response. |
---|
234 | User agents &SHOULD; send Cookie request headers, subject to other |
---|
235 | rules detailed below, with every request. |
---|
236 | </t> |
---|
237 | <t> |
---|
238 | An origin server &MAY; include multiple Set-Cookie2 headers in a |
---|
239 | response. Note that an intervening gateway could fold multiple such |
---|
240 | headers into a single header. |
---|
241 | </t> |
---|
242 | </section> |
---|
243 | |
---|
244 | <section title="Set-Cookie2 Syntax"> |
---|
245 | <iref item="Set-Cookie2 header" primary="true"/> |
---|
246 | <iref item="Headers" subitem="Set-Cookie2" primary="true"/> |
---|
247 | <t> |
---|
248 | The syntax for the Set-Cookie2 response |
---|
249 | header is |
---|
250 | </t> |
---|
251 | <figure><artwork type="abnf2616"> |
---|
252 | set-cookie = "Set-Cookie2:" cookies |
---|
253 | cookies = 1#cookie |
---|
254 | cookie = NAME "=" VALUE *(";" set-cookie-av) |
---|
255 | NAME = attr |
---|
256 | VALUE = value |
---|
257 | set-cookie-av = "Comment" "=" value |
---|
258 | | "CommentURL" "=" <"> http_URL <"> |
---|
259 | | "Discard" |
---|
260 | | "Domain" "=" value |
---|
261 | | "Max-Age" "=" value |
---|
262 | | "Path" "=" value |
---|
263 | | "Port" [ "=" <"> portlist <"> ] |
---|
264 | | "Secure" |
---|
265 | | "Version" "=" 1*DIGIT |
---|
266 | portlist = 1#portnum |
---|
267 | portnum = 1*DIGIT |
---|
268 | </artwork></figure> |
---|
269 | <t> |
---|
270 | Informally, the Set-Cookie2 response header comprises the token Set-Cookie2:, |
---|
271 | followed by a comma-separated list of one or more cookies. |
---|
272 | Each cookie begins with a NAME=VALUE pair, followed by zero or more |
---|
273 | semi-colon-separated attribute-value pairs. The syntax for |
---|
274 | attribute-value pairs was shown earlier. The specific attributes and |
---|
275 | the semantics of their values follows. The NAME=VALUE attribute-value |
---|
276 | pair &MUST; come first in each cookie. The others, if present, |
---|
277 | can occur in any order. If an attribute appears more than once in a |
---|
278 | cookie, the client &SHALL; use only the value associated with the first |
---|
279 | appearance of the attribute; a client &MUST; ignore values after the |
---|
280 | first. |
---|
281 | </t> |
---|
282 | <t> |
---|
283 | The NAME of a cookie &MAY; be the same as one of the attributes in this |
---|
284 | specification. However, because the cookie's NAME must come first in |
---|
285 | a Set-Cookie2 response header, the NAME and its VALUE cannot be |
---|
286 | confused with an attribute-value pair. |
---|
287 | </t> |
---|
288 | <t> |
---|
289 | <list style="hanging"> |
---|
290 | <x:lt hangText="NAME=VALUE"> |
---|
291 | <t> |
---|
292 | &REQUIRED;. The name of the state information ("cookie") is NAME, |
---|
293 | and its value is VALUE. NAMEs that begin with $ are reserved and |
---|
294 | &MUST-NOT; be used by applications. |
---|
295 | </t> |
---|
296 | <t> |
---|
297 | The VALUE is opaque to the user agent and may be anything the |
---|
298 | origin server chooses to send, possibly in a server-selected |
---|
299 | printable ASCII encoding. "Opaque" implies that the content is of |
---|
300 | interest and relevance only to the origin server. The content |
---|
301 | may, in fact, be readable by anyone that examines the Set-Cookie2 |
---|
302 | header. |
---|
303 | </t> |
---|
304 | </x:lt> |
---|
305 | <x:lt hangText="Comment=value"> |
---|
306 | <t> |
---|
307 | &OPTIONAL;. Because cookies can be used to derive or store private |
---|
308 | information about a user, the value of the Comment attribute |
---|
309 | allows an origin server to document how it intends to use the |
---|
310 | cookie. The user can inspect the information to decide whether to |
---|
311 | initiate or continue a session with this cookie. Characters in |
---|
312 | value &MUST; be in UTF-8 encoding. <xref target="RFC2279"/> |
---|
313 | </t> |
---|
314 | </x:lt> |
---|
315 | <x:lt hangText='CommentURL="http_URL"'> |
---|
316 | <t> |
---|
317 | &OPTIONAL;. Because cookies can be used to derive or store private |
---|
318 | information about a user, the CommentURL attribute allows an |
---|
319 | origin server to document how it intends to use the cookie. The |
---|
320 | user can inspect the information identified by the URL to decide |
---|
321 | whether to initiate or continue a session with this cookie. |
---|
322 | </t> |
---|
323 | </x:lt> |
---|
324 | <x:lt hangText="Discard"> |
---|
325 | <t> |
---|
326 | &OPTIONAL;. The Discard attribute instructs the user agent to |
---|
327 | discard the cookie unconditionally when the user agent terminates. |
---|
328 | </t> |
---|
329 | </x:lt> |
---|
330 | <x:lt hangText="Domain=value"> |
---|
331 | <t> |
---|
332 | &OPTIONAL;. The value of the Domain attribute specifies the domain |
---|
333 | for which the cookie is valid. If an explicitly specified value |
---|
334 | does not start with a dot, the user agent supplies a leading dot. |
---|
335 | </t> |
---|
336 | </x:lt> |
---|
337 | <x:lt hangText="Max-Age=value"> |
---|
338 | <t> |
---|
339 | &OPTIONAL;. The value of the Max-Age attribute is delta-seconds, |
---|
340 | the lifetime of the cookie in seconds, a decimal non-negative |
---|
341 | integer. To handle cached cookies correctly, a client &SHOULD; |
---|
342 | calculate the age of the cookie according to the age calculation |
---|
343 | rules in the HTTP/1.1 specification <xref target="RFC2616"/>. When the age is |
---|
344 | greater than delta-seconds seconds, the client &SHOULD; discard the |
---|
345 | cookie. A value of zero means the cookie &SHOULD; be discarded |
---|
346 | immediately. |
---|
347 | </t> |
---|
348 | </x:lt> |
---|
349 | <x:lt hangText="Path=value"> |
---|
350 | <t> |
---|
351 | &OPTIONAL;. The value of the Path attribute specifies the subset of |
---|
352 | URLs on the origin server to which this cookie applies. |
---|
353 | </t> |
---|
354 | </x:lt> |
---|
355 | <x:lt hangText='Port[="portlist"]'> |
---|
356 | <t> |
---|
357 | &OPTIONAL;. The Port attribute restricts the port to which a cookie |
---|
358 | may be returned in a Cookie request header. Note that the syntax |
---|
359 | REQUIREs quotes around the &OPTIONAL; portlist even if there is only |
---|
360 | one portnum in portlist. |
---|
361 | </t> |
---|
362 | </x:lt> |
---|
363 | <x:lt hangText="Secure"> |
---|
364 | <t> |
---|
365 | &OPTIONAL;. The Secure attribute (with no value) directs the user |
---|
366 | agent to use only (unspecified) secure means to contact the origin |
---|
367 | server whenever it sends back this cookie, to protect the |
---|
368 | confidentially and authenticity of the information in the cookie. |
---|
369 | </t> |
---|
370 | <t> |
---|
371 | The user agent (possibly with user interaction) &MAY; determine what |
---|
372 | level of security it considers appropriate for "secure" cookies. |
---|
373 | The Secure attribute should be considered security advice from the |
---|
374 | server to the user agent, indicating that it is in the session's |
---|
375 | interest to protect the cookie contents. When it sends a "secure" |
---|
376 | cookie back to a server, the user agent &SHOULD; use no less than |
---|
377 | the same level of security as was used when it received the cookie |
---|
378 | from the server. |
---|
379 | </t> |
---|
380 | </x:lt> |
---|
381 | <x:lt hangText="Version=value"> |
---|
382 | <t> |
---|
383 | &REQUIRED;. The value of the Version attribute, a decimal integer, |
---|
384 | identifies the version of the state management specification to |
---|
385 | which the cookie conforms. For this specification, Version=1 |
---|
386 | applies. |
---|
387 | </t> |
---|
388 | </x:lt> |
---|
389 | </list> |
---|
390 | </t> |
---|
391 | </section> |
---|
392 | |
---|
393 | <section title="Controlling Caching"> |
---|
394 | <t> |
---|
395 | An origin server must be cognizant of the |
---|
396 | effect of possible caching of both the returned resource and the |
---|
397 | Set-Cookie2 header. Caching "public" documents is desirable. For |
---|
398 | example, if the origin server wants to use a public document such as |
---|
399 | a "front door" page as a sentinel to indicate the beginning of a |
---|
400 | session for which a Set-Cookie2 response header must be generated, |
---|
401 | the page &SHOULD; be stored in caches "pre-expired" so that the origin |
---|
402 | server will see further requests. "Private documents", for example |
---|
403 | those that contain information strictly private to a session, &SHOULD; |
---|
404 | NOT be cached in shared caches. |
---|
405 | </t> |
---|
406 | <t> |
---|
407 | If the cookie is intended for use by a single user, the Set-Cookie2 |
---|
408 | header &SHOULD-NOT; be cached. A Set-Cookie2 header that is intended |
---|
409 | to be shared by multiple users &MAY; be cached. |
---|
410 | </t> |
---|
411 | <t> |
---|
412 | The origin server &SHOULD; send the following additional HTTP/1.1 |
---|
413 | response headers, depending on circumstances: |
---|
414 | <list style="symbols"> |
---|
415 | <t>To suppress caching of the Set-Cookie2 header: |
---|
416 | <figure><artwork type="example"> |
---|
417 | Cache-control: no-cache="set-cookie2" |
---|
418 | </artwork></figure> |
---|
419 | </t> |
---|
420 | </list> |
---|
421 | </t> |
---|
422 | <t> |
---|
423 | and one of the following: |
---|
424 | <list style="symbols"> |
---|
425 | <t>To suppress caching of a private document in shared caches: |
---|
426 | <figure><artwork type="example"> |
---|
427 | Cache-control: private |
---|
428 | </artwork></figure> |
---|
429 | </t> |
---|
430 | <t>To allow caching of a document and require that it be validated |
---|
431 | before returning it to the client: |
---|
432 | <figure><artwork type="example"> |
---|
433 | Cache-Control: must-revalidate, max-age=0 |
---|
434 | </artwork></figure> |
---|
435 | </t> |
---|
436 | <t>To allow caching of a document, but to require that proxy |
---|
437 | caches (not user agent caches) validate it before returning it |
---|
438 | to the client: |
---|
439 | <figure><artwork type="example"> |
---|
440 | Cache-Control: proxy-revalidate, max-age=0 |
---|
441 | </artwork></figure> |
---|
442 | </t> |
---|
443 | <t>To allow caching of a document and request that it be validated |
---|
444 | before returning it to the client (by "pre-expiring" it): |
---|
445 | <figure><artwork type="example"> |
---|
446 | Cache-control: max-age=0 |
---|
447 | </artwork></figure> |
---|
448 | Not all caches will revalidate the document in every case. |
---|
449 | </t> |
---|
450 | </list> |
---|
451 | </t> |
---|
452 | <t> |
---|
453 | HTTP/1.1 servers &MUST; send Expires: old-date (where old-date is a |
---|
454 | date long in the past) on responses containing Set-Cookie2 response |
---|
455 | headers unless they know for certain (by out of band means) that |
---|
456 | there are no HTTP/1.0 proxies in the response chain. HTTP/1.1 |
---|
457 | servers &MAY; send other Cache-Control directives that permit caching |
---|
458 | by HTTP/1.1 proxies in addition to the Expires: old-date directive; |
---|
459 | the Cache-Control directive will override the Expires: old-date for |
---|
460 | HTTP/1.1 proxies. |
---|
461 | </t> |
---|
462 | </section> |
---|
463 | </section> |
---|
464 | |
---|
465 | <section title="User Agent Role"> |
---|
466 | <section title="Interpreting Set-Cookie2"> |
---|
467 | <t> |
---|
468 | The user agent keeps separate track |
---|
469 | of state information that arrives via Set-Cookie2 response headers |
---|
470 | from each origin server (as distinguished by name or IP address and |
---|
471 | port). The user agent &MUST; ignore attribute-value pairs whose |
---|
472 | attribute it does not recognize. The user agent applies these |
---|
473 | defaults for optional attributes that are missing: |
---|
474 | </t> |
---|
475 | <t> |
---|
476 | <list style="hanging"> |
---|
477 | <t hangText="Discard">The default behavior is dictated by the presence or absence |
---|
478 | of a Max-Age attribute.</t> |
---|
479 | <t hangText="Domain">Defaults to the effective request-host. (Note that because |
---|
480 | there is no dot at the beginning of effective request-host, |
---|
481 | the default Domain can only domain-match itself.)</t> |
---|
482 | <t hangText="Max-Age">The default behavior is to discard the cookie when the user |
---|
483 | agent exits.</t> |
---|
484 | <t hangText="Path">Defaults to the path of the request URL that generated the |
---|
485 | Set-Cookie2 response, up to and including the right-most /.</t> |
---|
486 | <t hangText="Port">The default behavior is that a cookie &MAY; be returned to any |
---|
487 | request-port.</t> |
---|
488 | <t hangText="Secure">If absent, the user agent &MAY; send the cookie over an |
---|
489 | insecure channel.</t> |
---|
490 | </list> |
---|
491 | </t> |
---|
492 | </section> |
---|
493 | |
---|
494 | <section title="Rejecting Cookies"> |
---|
495 | <t> |
---|
496 | To prevent possible security or privacy |
---|
497 | violations, a user agent rejects a cookie according to rules below. |
---|
498 | The goal of the rules is to try to limit the set of servers for which |
---|
499 | a cookie is valid, based on the values of the Path, Domain, and Port |
---|
500 | attributes and the request-URI, request-host and request-port. |
---|
501 | </t> |
---|
502 | <t> |
---|
503 | A user agent rejects (&SHALL-NOT; store its information) if the Version |
---|
504 | attribute is missing. Moreover, a user agent rejects (&SHALL-NOT; |
---|
505 | store its information) if any of the following is true of the |
---|
506 | attributes explicitly present in the Set-Cookie2 response header: |
---|
507 | <list style="symbols"> |
---|
508 | <t>The value for the Path attribute is not a prefix of the |
---|
509 | request-URI.</t> |
---|
510 | <t>The value for the Domain attribute contains no embedded dots, |
---|
511 | and the value is not .local.</t> |
---|
512 | <t>The effective host name that derives from the request-host does |
---|
513 | not domain-match the Domain attribute.</t> |
---|
514 | <t>The request-host is a HDN (not IP address) and has the form HD, |
---|
515 | where D is the value of the Domain attribute, and H is a string |
---|
516 | that contains one or more dots.</t> |
---|
517 | <t>The Port attribute has a "port-list", and the request-port was |
---|
518 | not in the list.</t> |
---|
519 | </list> |
---|
520 | </t> |
---|
521 | <t> |
---|
522 | Examples: |
---|
523 | <list style="symbols"> |
---|
524 | <t>A Set-Cookie2 from request-host y.x.foo.com for Domain=.foo.com |
---|
525 | would be rejected, because H is y.x and contains a dot.</t> |
---|
526 | <t>A Set-Cookie2 from request-host x.foo.com for Domain=.foo.com |
---|
527 | would be accepted.</t> |
---|
528 | <t>A Set-Cookie2 with Domain=.com or Domain=.com., will always be |
---|
529 | rejected, because there is no embedded dot.</t> |
---|
530 | <t>A Set-Cookie2 with Domain=ajax.com will be accepted, and the |
---|
531 | value for Domain will be taken to be .ajax.com, because a dot |
---|
532 | gets prepended to the value.</t> |
---|
533 | <t>A Set-Cookie2 with Port="80,8000" will be accepted if the |
---|
534 | request was made to port 80 or 8000 and will be rejected |
---|
535 | otherwise.</t> |
---|
536 | <t>A Set-Cookie2 from request-host example for Domain=.local will |
---|
537 | be accepted, because the effective host name for the request- |
---|
538 | host is example.local, and example.local domain-matches .local.</t> |
---|
539 | </list> |
---|
540 | </t> |
---|
541 | </section> |
---|
542 | |
---|
543 | <section title="Cookie Management"> |
---|
544 | <t> |
---|
545 | If a user agent receives a Set-Cookie2 |
---|
546 | response header whose NAME is the same as that of a cookie it has |
---|
547 | previously stored, the new cookie supersedes the old when: the old |
---|
548 | and new Domain attribute values compare equal, using a case-insensitive string-compare; |
---|
549 | and, the old and new Path attribute |
---|
550 | values string-compare equal (case-sensitive). However, if the Set-Cookie2 |
---|
551 | has a value for Max-Age of zero, the (old and new) cookie is |
---|
552 | discarded. Otherwise a cookie persists (resources permitting) until |
---|
553 | whichever happens first, then gets discarded: its Max-Age lifetime is |
---|
554 | exceeded; or, if the Discard attribute is set, the user agent |
---|
555 | terminates the session. |
---|
556 | </t> |
---|
557 | <t> |
---|
558 | Because user agents have finite space in which to store cookies, they |
---|
559 | &MAY; also discard older cookies to make space for newer ones, using, |
---|
560 | for example, a least-recently-used algorithm, along with constraints |
---|
561 | on the maximum number of cookies that each origin server may set. |
---|
562 | </t> |
---|
563 | <t> |
---|
564 | If a Set-Cookie2 response header includes a Comment attribute, the |
---|
565 | user agent &SHOULD; store that information in a human-readable form |
---|
566 | with the cookie and &SHOULD; display the comment text as part of a |
---|
567 | cookie inspection user interface. |
---|
568 | </t> |
---|
569 | <t> |
---|
570 | If a Set-Cookie2 response header includes a CommentURL attribute, the |
---|
571 | user agent &SHOULD; store that information in a human-readable form |
---|
572 | with the cookie, or, preferably, &SHOULD; allow the user to follow the |
---|
573 | http_URL link as part of a cookie inspection user interface. |
---|
574 | </t> |
---|
575 | <t> |
---|
576 | The cookie inspection user interface may include a facility whereby a |
---|
577 | user can decide, at the time the user agent receives the Set-Cookie2 |
---|
578 | response header, whether or not to accept the cookie. A potentially |
---|
579 | confusing situation could arise if the following sequence occurs: |
---|
580 | <list style="symbols"> |
---|
581 | <t>the user agent receives a cookie that contains a CommentURL |
---|
582 | attribute;</t> |
---|
583 | <t>the user agent's cookie inspection interface is configured so |
---|
584 | that it presents a dialog to the user before the user agent |
---|
585 | accepts the cookie;</t> |
---|
586 | <t>the dialog allows the user to follow the CommentURL link when |
---|
587 | the user agent receives the cookie; and,</t> |
---|
588 | <t>when the user follows the CommentURL link, the origin server |
---|
589 | (or another server, via other links in the returned content) |
---|
590 | returns another cookie.</t> |
---|
591 | </list> |
---|
592 | </t> |
---|
593 | <t> |
---|
594 | The user agent &SHOULD-NOT; send any cookies in this context. The user |
---|
595 | agent &MAY; discard any cookie it receives in this context that the |
---|
596 | user has not, through some user agent mechanism, deemed acceptable. |
---|
597 | </t> |
---|
598 | <t> |
---|
599 | User agents &SHOULD; allow the user to control cookie destruction, but |
---|
600 | they &MUST-NOT; extend the cookie's lifetime beyond that controlled by |
---|
601 | the Discard and Max-Age attributes. An infrequently-used cookie may |
---|
602 | function as a "preferences file" for network applications, and a user |
---|
603 | may wish to keep it even if it is the least-recently-used cookie. One |
---|
604 | possible implementation would be an interface that allows the |
---|
605 | permanent storage of a cookie through a checkbox (or, conversely, its |
---|
606 | immediate destruction). |
---|
607 | </t> |
---|
608 | <t> |
---|
609 | Privacy considerations dictate that the user have considerable |
---|
610 | control over cookie management. The PRIVACY section contains more |
---|
611 | information. |
---|
612 | </t> |
---|
613 | </section> |
---|
614 | |
---|
615 | <section title="Sending Cookies to the Origin Server"> |
---|
616 | <iref item="Cookie header" primary="true"/> |
---|
617 | <iref item="Headers" subitem="Cookie" primary="true"/> |
---|
618 | <t> |
---|
619 | When it sends a request |
---|
620 | to an origin server, the user agent includes a Cookie request header |
---|
621 | if it has stored cookies that are applicable to the request, based on |
---|
622 | <list style="symbols"> |
---|
623 | <t>the request-host and request-port;</t> |
---|
624 | <t>the request-URI;</t> |
---|
625 | <t>the cookie's age.</t> |
---|
626 | </list> |
---|
627 | </t> |
---|
628 | <figure><preamble> |
---|
629 | The syntax for the header is: |
---|
630 | </preamble><artwork type="abnf2616"> |
---|
631 | cookie = "Cookie:" cookie-version 1*((";" | ",") cookie-value) |
---|
632 | cookie-value = NAME "=" VALUE [";" path] [";" domain] [";" port] |
---|
633 | cookie-version = "$Version" "=" value |
---|
634 | NAME = attr |
---|
635 | VALUE = value |
---|
636 | path = "$Path" "=" value |
---|
637 | domain = "$Domain" "=" value |
---|
638 | port = "$Port" [ "=" <"> value <"> ] |
---|
639 | </artwork></figure> |
---|
640 | <t> |
---|
641 | The value of the cookie-version attribute &MUST; be the value from the |
---|
642 | Version attribute of the corresponding Set-Cookie2 response header. |
---|
643 | Otherwise the value for cookie-version is 0. The value for the path |
---|
644 | attribute &MUST; be the value from the Path attribute, if one was |
---|
645 | present, of the corresponding Set-Cookie2 response header. Otherwise |
---|
646 | the attribute &SHOULD; be omitted from the Cookie request header. The |
---|
647 | value for the domain attribute &MUST; be the value from the Domain |
---|
648 | attribute, if one was present, of the corresponding Set-Cookie2 |
---|
649 | response header. Otherwise the attribute &SHOULD; be omitted from the |
---|
650 | Cookie request header. |
---|
651 | </t> |
---|
652 | <t> |
---|
653 | The port attribute of the Cookie request header &MUST; mirror the Port |
---|
654 | attribute, if one was present, in the corresponding Set-Cookie2 |
---|
655 | response header. That is, the port attribute &MUST; be present if the |
---|
656 | Port attribute was present in the Set-Cookie2 header, and it &MUST; |
---|
657 | have the same value, if any. Otherwise, if the Port attribute was |
---|
658 | absent from the Set-Cookie2 header, the attribute likewise &MUST; be |
---|
659 | omitted from the Cookie request header. |
---|
660 | </t> |
---|
661 | <t> |
---|
662 | Note that there is neither a Comment nor a CommentURL attribute in |
---|
663 | the Cookie request header corresponding to the ones in the Set-Cookie2 |
---|
664 | response header. The user agent does not return the comment |
---|
665 | information to the origin server. |
---|
666 | </t> |
---|
667 | <t> |
---|
668 | The user agent applies the following rules to choose applicable |
---|
669 | cookie-values to send in Cookie request headers from among all the |
---|
670 | cookies it has received. |
---|
671 | <list style="hanging"> |
---|
672 | <t hangText="Domain Selection"> |
---|
673 | The origin server's effective host name &MUST; domain-match the |
---|
674 | Domain attribute of the cookie. |
---|
675 | </t> |
---|
676 | <t hangText="Port Selection"> |
---|
677 | There are three possible behaviors, depending on the Port |
---|
678 | attribute in the Set-Cookie2 response header: |
---|
679 | <list style="numbers"> |
---|
680 | <t>By default (no Port attribute), the cookie &MAY; be sent to any |
---|
681 | port.</t> |
---|
682 | <t>If the attribute is present but has no value (e.g., Port), the |
---|
683 | cookie &MUST; only be sent to the request-port it was received |
---|
684 | from.</t> |
---|
685 | <t>If the attribute has a port-list, the cookie &MUST; only be |
---|
686 | returned if the new request-port is one of those listed in |
---|
687 | port-list.</t> |
---|
688 | </list> |
---|
689 | </t> |
---|
690 | <t hangText="Path Selection"> |
---|
691 | The request-URI &MUST; path-match the Path attribute of the cookie. |
---|
692 | </t> |
---|
693 | <t hangText="Max-Age Selection"> |
---|
694 | Cookies that have expired should have been discarded and thus are |
---|
695 | not forwarded to an origin server. |
---|
696 | </t> |
---|
697 | </list> |
---|
698 | </t> |
---|
699 | <t> |
---|
700 | If multiple cookies satisfy the criteria above, they are ordered in |
---|
701 | the Cookie header such that those with more specific Path attributes |
---|
702 | precede those with less specific. Ordering with respect to other |
---|
703 | attributes (e.g., Domain) is unspecified. |
---|
704 | </t> |
---|
705 | <t> |
---|
706 | Note: For backward compatibility, the separator in the Cookie header |
---|
707 | is semi-colon (;) everywhere. A server &SHOULD; also accept comma (,) |
---|
708 | as the separator between cookie-values for future compatibility. |
---|
709 | </t> |
---|
710 | </section> |
---|
711 | |
---|
712 | <section title="Identifying What Version is Understood: Cookie2"> |
---|
713 | <iref item="Cookie2 header" primary="true"/> |
---|
714 | <iref item="Headers" subitem="Cookie2" primary="true"/> |
---|
715 | <t> |
---|
716 | The Cookie2 |
---|
717 | request header facilitates interoperation between clients and servers |
---|
718 | that understand different versions of the cookie specification. When |
---|
719 | the client sends one or more cookies to an origin server, if at least |
---|
720 | one of those cookies contains a $Version attribute whose value is |
---|
721 | different from the version that the client understands, then the |
---|
722 | client &MUST; also send a Cookie2 request header, the syntax for which |
---|
723 | is |
---|
724 | </t> |
---|
725 | <figure><artwork type="abnf2616"> |
---|
726 | cookie2 = "Cookie2:" cookie-version |
---|
727 | </artwork></figure> |
---|
728 | <t> |
---|
729 | Here the value for cookie-version is the highest version of cookie |
---|
730 | specification (currently 1) that the client understands. The client |
---|
731 | needs to send at most one such request header per request. |
---|
732 | </t> |
---|
733 | </section> |
---|
734 | |
---|
735 | <section title="Sending Cookies in Unverifiable Transactions"> |
---|
736 | <t> |
---|
737 | Users &MUST; have |
---|
738 | control over sessions in order to ensure privacy. (See PRIVACY |
---|
739 | section below.) To simplify implementation and to prevent an |
---|
740 | additional layer of complexity where adequate safeguards exist, |
---|
741 | however, this document distinguishes between transactions that are |
---|
742 | verifiable and those that are unverifiable. A transaction is |
---|
743 | verifiable if the user, or a user-designated agent, has the option to |
---|
744 | review the request-URI prior to its use in the transaction. A |
---|
745 | transaction is unverifiable if the user does not have that option. |
---|
746 | Unverifiable transactions typically arise when a user agent |
---|
747 | automatically requests inlined or embedded entities or when it |
---|
748 | resolves redirection (3xx) responses from an origin server. |
---|
749 | Typically the origin transaction, the transaction that the user |
---|
750 | initiates, is verifiable, and that transaction may directly or |
---|
751 | indirectly induce the user agent to make unverifiable transactions. |
---|
752 | </t> |
---|
753 | <t> |
---|
754 | An unverifiable transaction is to a third-party host if its request-host |
---|
755 | U does not domain-match the reach R of the request-host O in the |
---|
756 | origin transaction. |
---|
757 | </t> |
---|
758 | <t> |
---|
759 | When it makes an unverifiable transaction, a user agent &MUST; disable |
---|
760 | all cookie processing (i.e., &MUST-NOT; send cookies, and &MUST-NOT; |
---|
761 | accept any received cookies) if the transaction is to a third-party |
---|
762 | host. |
---|
763 | </t> |
---|
764 | <t> |
---|
765 | This restriction prevents a malicious service author from using |
---|
766 | unverifiable transactions to induce a user agent to start or continue |
---|
767 | a session with a server in a different domain. The starting or |
---|
768 | continuation of such sessions could be contrary to the privacy |
---|
769 | expectations of the user, and could also be a security problem. |
---|
770 | </t> |
---|
771 | <t> |
---|
772 | User agents &MAY; offer configurable options that allow the user agent, |
---|
773 | or any autonomous programs that the user agent executes, to ignore |
---|
774 | the above rule, so long as these override options default to "off". |
---|
775 | </t> |
---|
776 | <t> |
---|
777 | (N.B. Mechanisms may be proposed that will automate overriding the |
---|
778 | third-party restrictions under controlled conditions.) |
---|
779 | </t> |
---|
780 | <t> |
---|
781 | Many current user agents already provide a review option that would |
---|
782 | render many links verifiable. For instance, some user agents display |
---|
783 | the URL that would be referenced for a particular link when the mouse |
---|
784 | pointer is placed over that link. The user can therefore determine |
---|
785 | whether to visit that site before causing the browser to do so. |
---|
786 | (Though not implemented on current user agents, a similar technique |
---|
787 | could be used for a button used to submit a form -- the user agent |
---|
788 | could display the action to be taken if the user were to select that |
---|
789 | button.) However, even this would not make all links verifiable; for |
---|
790 | example, links to automatically loaded images would not normally be |
---|
791 | subject to "mouse pointer" verification. |
---|
792 | </t> |
---|
793 | <t> |
---|
794 | Many user agents also provide the option for a user to view the HTML |
---|
795 | source of a document, or to save the source to an external file where |
---|
796 | it can be viewed by another application. While such an option does |
---|
797 | provide a crude review mechanism, some users might not consider it |
---|
798 | acceptable for this purpose. |
---|
799 | </t> |
---|
800 | </section> |
---|
801 | </section> |
---|
802 | |
---|
803 | <section title="How an Origin Server Interprets the Cookie Header"> |
---|
804 | <t> |
---|
805 | A user agent returns much of the information in the Set-Cookie2 |
---|
806 | header to the origin server when the request-URI path-matches the |
---|
807 | Path attribute of the cookie. When it receives a Cookie header, the |
---|
808 | origin server &SHOULD; treat cookies with NAMEs whose prefix is $ |
---|
809 | specially, as an attribute for the cookie. |
---|
810 | </t> |
---|
811 | </section> |
---|
812 | |
---|
813 | <section title="Caching Proxy Role"> |
---|
814 | <t> |
---|
815 | One reason for separating state information from both a URL and |
---|
816 | document content is to facilitate the scaling that caching permits. |
---|
817 | To support cookies, a caching proxy &MUST; obey these rules already in |
---|
818 | the HTTP specification: |
---|
819 | <list style="symbols"> |
---|
820 | <t>Honor requests from the cache, if possible, based on cache |
---|
821 | validity rules.</t> |
---|
822 | <t>Pass along a Cookie request header in any request that the |
---|
823 | proxy must make of another server.</t> |
---|
824 | <t>Return the response to the client. Include any Set-Cookie2 |
---|
825 | response header.</t> |
---|
826 | <t>Cache the received response subject to the control of the usual |
---|
827 | headers, such as Expires, |
---|
828 | <figure><artwork type="example"> |
---|
829 | Cache-control: no-cache |
---|
830 | </artwork></figure> |
---|
831 | and |
---|
832 | <figure><artwork type="example"> |
---|
833 | Cache-control: private |
---|
834 | </artwork></figure> |
---|
835 | </t> |
---|
836 | <t>Cache the Set-Cookie2 subject to the control of the usual |
---|
837 | header, |
---|
838 | <figure><artwork type="example"> |
---|
839 | Cache-control: no-cache="set-cookie2" |
---|
840 | </artwork></figure> |
---|
841 | (The Set-Cookie2 header should usually not be cached.)</t> |
---|
842 | </list> |
---|
843 | </t> |
---|
844 | <t> |
---|
845 | Proxies &MUST-NOT; introduce Set-Cookie2 (Cookie) headers of their own |
---|
846 | in proxy responses (requests). |
---|
847 | </t> |
---|
848 | </section> |
---|
849 | </section> |
---|
850 | |
---|
851 | <section title="EXAMPLES"> |
---|
852 | |
---|
853 | <section title="Example 1"> |
---|
854 | <t> |
---|
855 | Most detail of request and response headers has been omitted. Assume |
---|
856 | the user agent has no stored cookies. |
---|
857 | </t> |
---|
858 | <t> |
---|
859 | 1. User Agent -> Server |
---|
860 | </t> |
---|
861 | <figure><artwork type='message/http; msgtype="request"'> |
---|
862 | POST /acme/login HTTP/1.1 |
---|
863 | [form data] |
---|
864 | </artwork></figure> |
---|
865 | <t> |
---|
866 | User identifies self via a form. |
---|
867 | </t> |
---|
868 | <t> |
---|
869 | 2. Server -> User Agent |
---|
870 | </t> |
---|
871 | <figure><artwork type='message/http; msgtype="response"'> |
---|
872 | HTTP/1.1 200 OK |
---|
873 | Set-Cookie2: Customer="WILE_E_COYOTE"; Version="1"; Path="/acme" |
---|
874 | </artwork></figure> |
---|
875 | <t> |
---|
876 | Cookie reflects user's identity. |
---|
877 | </t> |
---|
878 | <t> |
---|
879 | 3. User Agent -> Server |
---|
880 | </t> |
---|
881 | <figure><artwork type='message/http; msgtype="request"'> |
---|
882 | POST /acme/pickitem HTTP/1.1 |
---|
883 | Cookie: $Version="1"; Customer="WILE_E_COYOTE"; $Path="/acme" |
---|
884 | [form data] |
---|
885 | </artwork></figure> |
---|
886 | <t> |
---|
887 | User selects an item for "shopping basket". |
---|
888 | </t> |
---|
889 | <t> |
---|
890 | 4. Server -> User Agent |
---|
891 | </t> |
---|
892 | <figure><artwork type='message/http; msgtype="response"'> |
---|
893 | HTTP/1.1 200 OK |
---|
894 | Set-Cookie2: Part_Number="Rocket_Launcher_0001"; Version="1"; |
---|
895 | Path="/acme" |
---|
896 | </artwork></figure> |
---|
897 | <t> |
---|
898 | Shopping basket contains an item. |
---|
899 | </t> |
---|
900 | <t> |
---|
901 | 5. User Agent -> Server |
---|
902 | </t> |
---|
903 | <figure><artwork type='message/http; msgtype="request"'> |
---|
904 | POST /acme/shipping HTTP/1.1 |
---|
905 | Cookie: $Version="1"; |
---|
906 | Customer="WILE_E_COYOTE"; $Path="/acme"; |
---|
907 | Part_Number="Rocket_Launcher_0001"; $Path="/acme" |
---|
908 | [form data] |
---|
909 | </artwork></figure> |
---|
910 | <t> |
---|
911 | User selects shipping method from form. |
---|
912 | </t> |
---|
913 | <t> |
---|
914 | 6. Server -> User Agent |
---|
915 | </t> |
---|
916 | <figure><artwork type='message/http; msgtype="response"'> |
---|
917 | HTTP/1.1 200 OK |
---|
918 | Set-Cookie2: Shipping="FedEx"; Version="1"; Path="/acme" |
---|
919 | </artwork></figure> |
---|
920 | <t> |
---|
921 | New cookie reflects shipping method. |
---|
922 | </t> |
---|
923 | <t> |
---|
924 | 7. User Agent -> Server |
---|
925 | </t> |
---|
926 | <figure><artwork type='message/http; msgtype="request"'> |
---|
927 | POST /acme/process HTTP/1.1 |
---|
928 | Cookie: $Version="1"; |
---|
929 | Customer="WILE_E_COYOTE"; $Path="/acme"; |
---|
930 | Part_Number="Rocket_Launcher_0001"; $Path="/acme"; |
---|
931 | Shipping="FedEx"; $Path="/acme" |
---|
932 | [form data] |
---|
933 | </artwork></figure> |
---|
934 | <t> |
---|
935 | User chooses to process order. |
---|
936 | </t> |
---|
937 | <t> |
---|
938 | 8. Server -> User Agent |
---|
939 | </t> |
---|
940 | <figure><artwork type='message/http; msgtype="response"'> |
---|
941 | HTTP/1.1 200 OK |
---|
942 | </artwork></figure> |
---|
943 | <t> |
---|
944 | Transaction is complete. |
---|
945 | </t> |
---|
946 | <t> |
---|
947 | The user agent makes a series of requests on the origin server, after |
---|
948 | each of which it receives a new cookie. All the cookies have the |
---|
949 | same Path attribute and (default) domain. Because the request-URIs |
---|
950 | all path-match /acme, the Path attribute of each cookie, each request |
---|
951 | contains all the cookies received so far. |
---|
952 | </t> |
---|
953 | </section> |
---|
954 | |
---|
955 | <section title="Example 2"> |
---|
956 | <t> |
---|
957 | This example illustrates the effect of the Path attribute. All |
---|
958 | detail of request and response headers has been omitted. Assume the |
---|
959 | user agent has no stored cookies. |
---|
960 | </t> |
---|
961 | <t> |
---|
962 | Imagine the user agent has received, in response to earlier requests, |
---|
963 | the response headers |
---|
964 | </t> |
---|
965 | <figure><artwork type="example"> |
---|
966 | Set-Cookie2: Part_Number="Rocket_Launcher_0001"; Version="1"; |
---|
967 | Path="/acme" |
---|
968 | </artwork></figure> |
---|
969 | <t> |
---|
970 | and |
---|
971 | </t> |
---|
972 | <figure><artwork type="example"> |
---|
973 | Set-Cookie2: Part_Number="Riding_Rocket_0023"; Version="1"; |
---|
974 | Path="/acme/ammo" |
---|
975 | </artwork></figure> |
---|
976 | <t> |
---|
977 | A subsequent request by the user agent to the (same) server for URLs |
---|
978 | of the form /acme/ammo/... would include the following request |
---|
979 | header: |
---|
980 | </t> |
---|
981 | <figure><artwork type="example"> |
---|
982 | Cookie: $Version="1"; |
---|
983 | Part_Number="Riding_Rocket_0023"; $Path="/acme/ammo"; |
---|
984 | Part_Number="Rocket_Launcher_0001"; $Path="/acme" |
---|
985 | </artwork></figure> |
---|
986 | <t> |
---|
987 | Note that the NAME=VALUE pair for the cookie with the more specific |
---|
988 | Path attribute, /acme/ammo, comes before the one with the less |
---|
989 | specific Path attribute, /acme. Further note that the same cookie |
---|
990 | name appears more than once. |
---|
991 | </t> |
---|
992 | <t> |
---|
993 | A subsequent request by the user agent to the (same) server for a URL |
---|
994 | of the form /acme/parts/ would include the following request header: |
---|
995 | </t> |
---|
996 | <figure><artwork type="example"> |
---|
997 | Cookie: $Version="1"; Part_Number="Rocket_Launcher_0001"; |
---|
998 | $Path="/acme" |
---|
999 | </artwork></figure> |
---|
1000 | <t> |
---|
1001 | Here, the second cookie's Path attribute /acme/ammo is not a prefix |
---|
1002 | of the request URL, /acme/parts/, so the cookie does not get |
---|
1003 | forwarded to the server. |
---|
1004 | </t> |
---|
1005 | </section> |
---|
1006 | </section> |
---|
1007 | |
---|
1008 | <section title="IMPLEMENTATION CONSIDERATIONS"> |
---|
1009 | <t> |
---|
1010 | Here we provide guidance on likely or desirable details for an origin |
---|
1011 | server that implements state management. |
---|
1012 | </t> |
---|
1013 | |
---|
1014 | <section title="Set-Cookie2 Content"> |
---|
1015 | <t> |
---|
1016 | An origin server's content should probably be divided into disjoint |
---|
1017 | application areas, some of which require the use of state |
---|
1018 | information. The application areas can be distinguished by their |
---|
1019 | request URLs. The Set-Cookie2 header can incorporate information |
---|
1020 | about the application areas by setting the Path attribute for each |
---|
1021 | one. |
---|
1022 | </t> |
---|
1023 | <t> |
---|
1024 | The session information can obviously be clear or encoded text that |
---|
1025 | describes state. However, if it grows too large, it can become |
---|
1026 | unwieldy. Therefore, an implementor might choose for the session |
---|
1027 | information to be a key to a server-side resource. Of course, using |
---|
1028 | a database creates some problems that this state management |
---|
1029 | specification was meant to avoid, namely: |
---|
1030 | <list style="numbers"> |
---|
1031 | <t>keeping real state on the server side;</t> |
---|
1032 | <t>how and when to garbage-collect the database entry, in case the |
---|
1033 | user agent terminates the session by, for example, exiting.</t> |
---|
1034 | </list> |
---|
1035 | </t> |
---|
1036 | </section> |
---|
1037 | |
---|
1038 | <section title="Stateless Pages"> |
---|
1039 | <t> |
---|
1040 | Caching benefits the scalability of WWW. Therefore it is important |
---|
1041 | to reduce the number of documents that have state embedded in them |
---|
1042 | inherently. For example, if a shopping-basket-style application |
---|
1043 | always displays a user's current basket contents on each page, those |
---|
1044 | pages cannot be cached, because each user's basket's contents would |
---|
1045 | be different. On the other hand, if each page contains just a link |
---|
1046 | that allows the user to "Look at My Shopping Basket", the page can be |
---|
1047 | cached. |
---|
1048 | </t> |
---|
1049 | </section> |
---|
1050 | |
---|
1051 | <section title="Implementation Limits"> |
---|
1052 | <t> |
---|
1053 | Practical user agent implementations have limits on the number and |
---|
1054 | size of cookies that they can store. In general, user agents' cookie |
---|
1055 | support should have no fixed limits. They should strive to store as |
---|
1056 | many frequently-used cookies as possible. Furthermore, general-use |
---|
1057 | user agents &SHOULD; provide each of the following minimum capabilities |
---|
1058 | individually, although not necessarily simultaneously: |
---|
1059 | <list style="symbols"> |
---|
1060 | <t>at least 300 cookies</t> |
---|
1061 | <t>at least 4096 bytes per cookie (as measured by the characters |
---|
1062 | that comprise the cookie non-terminal in the syntax description |
---|
1063 | of the Set-Cookie2 header, and as received in the Set-Cookie2 |
---|
1064 | header)</t> |
---|
1065 | <t>at least 20 cookies per unique host or domain name</t> |
---|
1066 | </list> |
---|
1067 | </t> |
---|
1068 | <t> |
---|
1069 | User agents created for specific purposes or for limited-capacity |
---|
1070 | devices &SHOULD; provide at least 20 cookies of 4096 bytes, to ensure |
---|
1071 | that the user can interact with a session-based origin server. |
---|
1072 | </t> |
---|
1073 | <t> |
---|
1074 | The information in a Set-Cookie2 response header &MUST; be retained in |
---|
1075 | its entirety. If for some reason there is inadequate space to store |
---|
1076 | the cookie, it &MUST; be discarded, not truncated. |
---|
1077 | </t> |
---|
1078 | <t> |
---|
1079 | Applications should use as few and as small cookies as possible, and |
---|
1080 | they should cope gracefully with the loss of a cookie. |
---|
1081 | </t> |
---|
1082 | |
---|
1083 | <section title="Denial of Service Attacks"> |
---|
1084 | <t> |
---|
1085 | User agents &MAY; choose to set an |
---|
1086 | upper bound on the number of cookies to be stored from a given host |
---|
1087 | or domain name or on the size of the cookie information. Otherwise a |
---|
1088 | malicious server could attempt to flood a user agent with many |
---|
1089 | cookies, or large cookies, on successive responses, which would force |
---|
1090 | out cookies the user agent had received from other servers. However, |
---|
1091 | the minima specified above &SHOULD; still be supported. |
---|
1092 | </t> |
---|
1093 | </section> |
---|
1094 | </section> |
---|
1095 | </section> |
---|
1096 | |
---|
1097 | <section title="PRIVACY"> |
---|
1098 | <t> |
---|
1099 | Informed consent should guide the design of systems that use cookies. |
---|
1100 | A user should be able to find out how a web site plans to use |
---|
1101 | information in a cookie and should be able to choose whether or not |
---|
1102 | those policies are acceptable. Both the user agent and the origin |
---|
1103 | server must assist informed consent. |
---|
1104 | </t> |
---|
1105 | |
---|
1106 | <section title="User Agent Control"> |
---|
1107 | <t> |
---|
1108 | An origin server could create a Set-Cookie2 header to track the path |
---|
1109 | of a user through the server. Users may object to this behavior as |
---|
1110 | an intrusive accumulation of information, even if their identity is |
---|
1111 | not evident. (Identity might become evident, for example, if a user |
---|
1112 | subsequently fills out a form that contains identifying information.) |
---|
1113 | This state management specification therefore requires that a user |
---|
1114 | agent give the user control over such a possible intrusion, although |
---|
1115 | the interface through which the user is given this control is left |
---|
1116 | unspecified. However, the control mechanisms provided &SHALL; at least |
---|
1117 | allow the user |
---|
1118 | <list style="symbols"> |
---|
1119 | <t>to completely disable the sending and saving of cookies.</t> |
---|
1120 | <t>to determine whether a stateful session is in progress.</t> |
---|
1121 | <t>to control the saving of a cookie on the basis of the cookie's |
---|
1122 | Domain attribute.</t> |
---|
1123 | </list> |
---|
1124 | </t> |
---|
1125 | <t> |
---|
1126 | Such control could be provided, for example, by mechanisms |
---|
1127 | <list style="symbols"> |
---|
1128 | <t>to notify the user when the user agent is about to send a |
---|
1129 | cookie to the origin server, to offer the option not to begin a |
---|
1130 | session.</t> |
---|
1131 | <t>to display a visual indication that a stateful session is in |
---|
1132 | progress.</t> |
---|
1133 | <t>to let the user decide which cookies, if any, should be saved |
---|
1134 | when the user concludes a window or user agent session.</t> |
---|
1135 | <t>to let the user examine and delete the contents of a cookie at |
---|
1136 | any time.</t> |
---|
1137 | </list> |
---|
1138 | </t> |
---|
1139 | <t> |
---|
1140 | A user agent usually begins execution with no remembered state |
---|
1141 | information. It &SHOULD; be possible to configure a user agent never |
---|
1142 | to send Cookie headers, in which case it can never sustain state with |
---|
1143 | an origin server. (The user agent would then behave like one that is |
---|
1144 | unaware of how to handle Set-Cookie2 response headers.) |
---|
1145 | </t> |
---|
1146 | <t> |
---|
1147 | When the user agent terminates execution, it &SHOULD; let the user |
---|
1148 | discard all state information. Alternatively, the user agent &MAY; ask |
---|
1149 | the user whether state information should be retained; the default |
---|
1150 | should be "no". If the user chooses to retain state information, it |
---|
1151 | would be restored the next time the user agent runs. |
---|
1152 | </t> |
---|
1153 | <t> |
---|
1154 | NOTE: User agents should probably be cautious about using files to |
---|
1155 | store cookies long-term. If a user runs more than one instance of |
---|
1156 | the user agent, the cookies could be commingled or otherwise |
---|
1157 | corrupted. |
---|
1158 | </t> |
---|
1159 | </section> |
---|
1160 | |
---|
1161 | <section title="Origin Server Role"> |
---|
1162 | <t> |
---|
1163 | An origin server &SHOULD; promote informed consent by adding CommentURL |
---|
1164 | or Comment information to the cookies it sends. CommentURL is |
---|
1165 | preferred because of the opportunity to provide richer information in |
---|
1166 | a multiplicity of languages. |
---|
1167 | </t> |
---|
1168 | </section> |
---|
1169 | |
---|
1170 | <section title="Clear Text"> |
---|
1171 | <t> |
---|
1172 | The information in the Set-Cookie2 and Cookie headers is unprotected. |
---|
1173 | As a consequence: |
---|
1174 | <list style="numbers"> |
---|
1175 | <t>Any sensitive information that is conveyed in them is exposed |
---|
1176 | to intruders.</t> |
---|
1177 | <t>A malicious intermediary could alter the headers as they travel |
---|
1178 | in either direction, with unpredictable results.</t> |
---|
1179 | </list> |
---|
1180 | </t> |
---|
1181 | <t> |
---|
1182 | These facts imply that information of a personal and/or financial |
---|
1183 | nature should only be sent over a secure channel. For less sensitive |
---|
1184 | information, or when the content of the header is a database key, an |
---|
1185 | origin server should be vigilant to prevent a bad Cookie value from |
---|
1186 | causing failures. |
---|
1187 | </t> |
---|
1188 | <t> |
---|
1189 | A user agent in a shared user environment poses a further risk. |
---|
1190 | Using a cookie inspection interface, User B could examine the |
---|
1191 | contents of cookies that were saved when User A used the machine. |
---|
1192 | </t> |
---|
1193 | </section> |
---|
1194 | </section> |
---|
1195 | |
---|
1196 | <section title="IANA Considerations" anchor="IANA.considerations"> |
---|
1197 | <t> |
---|
1198 | TBD. |
---|
1199 | </t> |
---|
1200 | </section> |
---|
1201 | |
---|
1202 | <section title="SECURITY CONSIDERATIONS"> |
---|
1203 | |
---|
1204 | <section title="Protocol Design"> |
---|
1205 | <t> |
---|
1206 | The restrictions on the value of the Domain attribute, and the rules |
---|
1207 | concerning unverifiable transactions, are meant to reduce the ways |
---|
1208 | that cookies can "leak" to the "wrong" site. The intent is to |
---|
1209 | restrict cookies to one host, or a closely related set of hosts. |
---|
1210 | Therefore a request-host is limited as to what values it can set for |
---|
1211 | Domain. We consider it acceptable for hosts host1.foo.com and |
---|
1212 | host2.foo.com to share cookies, but not a.com and b.com. |
---|
1213 | </t> |
---|
1214 | <t> |
---|
1215 | Similarly, a server can set a Path only for cookies that are related |
---|
1216 | to the request-URI. |
---|
1217 | </t> |
---|
1218 | </section> |
---|
1219 | |
---|
1220 | <section title="Cookie Spoofing"> |
---|
1221 | <t> |
---|
1222 | Proper application design can avoid spoofing attacks from related |
---|
1223 | domains. Consider: |
---|
1224 | <list style="numbers"> |
---|
1225 | <t>User agent makes request to victim.cracker.edu, gets back |
---|
1226 | cookie session_id="1234" and sets the default domain |
---|
1227 | victim.cracker.edu.</t> |
---|
1228 | |
---|
1229 | <t>User agent makes request to spoof.cracker.edu, gets back cookie |
---|
1230 | session-id="1111", with Domain=".cracker.edu".</t> |
---|
1231 | |
---|
1232 | <t>User agent makes request to victim.cracker.edu again, and |
---|
1233 | passes |
---|
1234 | <figure><artwork type="example"> |
---|
1235 | Cookie: $Version="1"; session_id="1234", |
---|
1236 | $Version="1"; session_id="1111"; $Domain=".cracker.edu" |
---|
1237 | </artwork></figure> |
---|
1238 | The server at victim.cracker.edu should detect that the second |
---|
1239 | cookie was not one it originated by noticing that the Domain |
---|
1240 | attribute is not for itself and ignore it.</t> |
---|
1241 | </list> |
---|
1242 | </t> |
---|
1243 | </section> |
---|
1244 | |
---|
1245 | <section title="Unexpected Cookie Sharing"> |
---|
1246 | <t> |
---|
1247 | A user agent &SHOULD; make every attempt to prevent the sharing of |
---|
1248 | session information between hosts that are in different domains. |
---|
1249 | Embedded or inlined objects may cause particularly severe privacy |
---|
1250 | problems if they can be used to share cookies between disparate |
---|
1251 | hosts. For example, a malicious server could embed cookie |
---|
1252 | information for host a.com in a URI for a CGI on host b.com. User |
---|
1253 | agent implementors are strongly encouraged to prevent this sort of |
---|
1254 | exchange whenever possible. |
---|
1255 | </t> |
---|
1256 | </section> |
---|
1257 | |
---|
1258 | <section title="Cookies For Account Information"> |
---|
1259 | <t> |
---|
1260 | While it is common practice to use them this way, cookies are not |
---|
1261 | designed or intended to be used to hold authentication information, |
---|
1262 | such as account names and passwords. Unless such cookies are |
---|
1263 | exchanged over an encrypted path, the account information they |
---|
1264 | contain is highly vulnerable to perusal and theft. |
---|
1265 | </t> |
---|
1266 | </section> |
---|
1267 | </section> |
---|
1268 | |
---|
1269 | <section title="OTHER, SIMILAR, PROPOSALS"> |
---|
1270 | <t> |
---|
1271 | Apart from RFC 2109, three other proposals have been made to |
---|
1272 | accomplish similar goals. This specification began as an amalgam of |
---|
1273 | Kristol's State-Info proposal <xref target="DMK95"/> and Netscape's Cookie proposal |
---|
1274 | <xref target="Netscape"/>. |
---|
1275 | </t> |
---|
1276 | <t> |
---|
1277 | Brian Behlendorf proposed a Session-ID header that would be user-agent-initiated |
---|
1278 | and could be used by an origin server to track |
---|
1279 | "clicktrails". It would not carry any origin-server-defined state, |
---|
1280 | however. Phillip Hallam-Baker has proposed another client-defined |
---|
1281 | session ID mechanism for similar purposes. |
---|
1282 | </t> |
---|
1283 | <t> |
---|
1284 | While both session IDs and cookies can provide a way to sustain |
---|
1285 | stateful sessions, their intended purpose is different, and, |
---|
1286 | consequently, the privacy requirements for them are different. A |
---|
1287 | user initiates session IDs to allow servers to track progress through |
---|
1288 | them, or to distinguish multiple users on a shared machine. Cookies |
---|
1289 | are server-initiated, so the cookie mechanism described here gives |
---|
1290 | users control over something that would otherwise take place without |
---|
1291 | the users' awareness. Furthermore, cookies convey rich, server-selected |
---|
1292 | information, whereas session IDs comprise user-selected, |
---|
1293 | simple information. |
---|
1294 | </t> |
---|
1295 | </section> |
---|
1296 | |
---|
1297 | <section title="HISTORICAL"> |
---|
1298 | |
---|
1299 | <section title="Compatibility with Existing Implementations"> |
---|
1300 | <t> |
---|
1301 | Existing cookie implementations, based on the Netscape specification, |
---|
1302 | use the Set-Cookie (not Set-Cookie2) header. User agents that |
---|
1303 | receive in the same response both a Set-Cookie and Set-Cookie2 |
---|
1304 | response header for the same cookie &MUST; discard the Set-Cookie |
---|
1305 | information and use only the Set-Cookie2 information. Furthermore, a |
---|
1306 | user agent &MUST; assume, if it received a Set-Cookie2 response header, |
---|
1307 | that the sending server complies with this document and will |
---|
1308 | understand Cookie request headers that also follow this |
---|
1309 | specification. |
---|
1310 | </t> |
---|
1311 | <t> |
---|
1312 | New cookies &MUST; replace both equivalent old- and new-style cookies. |
---|
1313 | That is, if a user agent that follows both this specification and |
---|
1314 | Netscape's original specification receives a Set-Cookie2 response |
---|
1315 | header, and the NAME and the Domain and Path attributes match (per |
---|
1316 | the Cookie Management section) a Netscape-style cookie, the |
---|
1317 | Netscape-style cookie &MUST; be discarded, and the user agent &MUST; |
---|
1318 | retain only the cookie adhering to this specification. |
---|
1319 | </t> |
---|
1320 | <t> |
---|
1321 | Older user agents that do not understand this specification, but that |
---|
1322 | do understand Netscape's original specification, will not recognize |
---|
1323 | the Set-Cookie2 response header and will receive and send cookies |
---|
1324 | according to the older specification. |
---|
1325 | </t> |
---|
1326 | <t> |
---|
1327 | A user agent that supports both this specification and Netscape-style |
---|
1328 | cookies &SHOULD; send a Cookie request header that follows the older |
---|
1329 | Netscape specification if it received the cookie in a Set-Cookie |
---|
1330 | response header and not in a Set-Cookie2 response header. However, |
---|
1331 | it &SHOULD; send the following request header as well: |
---|
1332 | </t> |
---|
1333 | <figure><artwork type="example"> |
---|
1334 | Cookie2: $Version="1" |
---|
1335 | </artwork></figure> |
---|
1336 | <t> |
---|
1337 | The Cookie2 header advises the server that the user agent understands |
---|
1338 | new-style cookies. If the server understands new-style cookies, as |
---|
1339 | well, it &SHOULD; continue the stateful session by sending a Set-Cookie2 |
---|
1340 | response header, rather than Set-Cookie. A server that does |
---|
1341 | not understand new-style cookies will simply ignore the Cookie2 |
---|
1342 | request header. |
---|
1343 | </t> |
---|
1344 | </section> |
---|
1345 | |
---|
1346 | <section title="Caching and HTTP/1.0"> |
---|
1347 | <t> |
---|
1348 | Some caches, such as those conforming to HTTP/1.0, will inevitably |
---|
1349 | cache the Set-Cookie2 and Set-Cookie headers, because there was no |
---|
1350 | mechanism to suppress caching of headers prior to HTTP/1.1. This |
---|
1351 | caching can lead to security problems. Documents transmitted by an |
---|
1352 | origin server along with Set-Cookie2 and Set-Cookie headers usually |
---|
1353 | either will be uncachable, or will be "pre-expired". As long as |
---|
1354 | caches obey instructions not to cache documents (following Expires: |
---|
1355 | <a date in the past> or Pragma: no-cache (HTTP/1.0), or Cache-control: no-cache |
---|
1356 | (HTTP/1.1)) uncachable documents present no |
---|
1357 | problem. However, pre-expired documents may be stored in caches. |
---|
1358 | They require validation (a conditional GET) on each new request, but |
---|
1359 | some cache operators loosen the rules for their caches, and sometimes |
---|
1360 | serve expired documents without first validating them. This |
---|
1361 | combination of factors can lead to cookies meant for one user later |
---|
1362 | being sent to another user. The Set-Cookie2 and Set-Cookie headers |
---|
1363 | are stored in the cache, and, although the document is stale |
---|
1364 | (expired), the cache returns the document in response to later |
---|
1365 | requests, including cached headers. |
---|
1366 | </t> |
---|
1367 | </section> |
---|
1368 | </section> |
---|
1369 | |
---|
1370 | <section title="ACKNOWLEDGEMENTS"> |
---|
1371 | <t> |
---|
1372 | This document really represents the collective efforts of the HTTP |
---|
1373 | Working Group of the IETF and, particularly, the following people, in |
---|
1374 | addition to the authors: Roy Fielding, Yaron Goland, Marc Hedlund, |
---|
1375 | Ted Hardie, Koen Holtman, Shel Kaphan, Rohit Khare, Foteos Macrides, |
---|
1376 | David W. Morris. |
---|
1377 | </t> |
---|
1378 | </section> |
---|
1379 | |
---|
1380 | </middle> |
---|
1381 | <back> |
---|
1382 | |
---|
1383 | <references> |
---|
1384 | |
---|
1385 | <reference anchor="DMK95" target="http://portal.research.bell-labs.com/~dmk/state-info.html"> |
---|
1386 | <front> |
---|
1387 | <title>Proposed HTTP State-Info Mechanism</title> |
---|
1388 | <author initials='D. M.' surname='Kristol' fullname='David M. Kristol'> |
---|
1389 | <organization/> |
---|
1390 | </author> |
---|
1391 | <date year="1995" month="September"/> |
---|
1392 | </front> |
---|
1393 | <annotation>available at <http://portal.research.bell-labs.com/~dmk/state-info.html></annotation> |
---|
1394 | </reference> |
---|
1395 | |
---|
1396 | <reference anchor="Netscape" target="http://www.netscape.com/newsref/std/cookie_spec.html"> |
---|
1397 | <front> |
---|
1398 | <title>Persistent Client State -- HTTP Cookies</title> |
---|
1399 | <author> |
---|
1400 | <organization/> |
---|
1401 | </author> |
---|
1402 | <date/> |
---|
1403 | </front> |
---|
1404 | <annotation>available at <http://www.netscape.com/newsref/std/cookie_spec.html></annotation> |
---|
1405 | </reference> |
---|
1406 | |
---|
1407 | <reference anchor='RFC2109'> |
---|
1408 | <front> |
---|
1409 | <title>HTTP State Management Mechanism</title> |
---|
1410 | <author initials='D.M.' surname='Kristol' fullname='David M. Kristol'> |
---|
1411 | <organization>Bell Laboratories, Lucent Technologies</organization> |
---|
1412 | <address> |
---|
1413 | <postal> |
---|
1414 | <street>600 Mountain Ave. Room 2A-227</street> |
---|
1415 | <street>Murray Hill</street> |
---|
1416 | <street>NJ 07974</street></postal> |
---|
1417 | |
---|
1418 | <phone>(908) 582-2250</phone> |
---|
1419 | <facsimile>(908) 582-5809</facsimile> |
---|
1420 | <email>dmk@bell-labs.com</email></address></author> |
---|
1421 | <author initials='L.' surname='Montulli' fullname='Lou Montulli'> |
---|
1422 | <organization>Netscape Communications Corp.</organization> |
---|
1423 | <address> |
---|
1424 | <postal> |
---|
1425 | <street>501 E. Middlefield Rd.</street> |
---|
1426 | <street>Mountain View</street> |
---|
1427 | <street>CA 94043</street></postal> |
---|
1428 | |
---|
1429 | <phone>(415) 528-2600</phone> |
---|
1430 | <email>montulli@netscape.com</email></address> |
---|
1431 | </author> |
---|
1432 | <date year='1997' month='February' /> |
---|
1433 | </front> |
---|
1434 | <seriesInfo name='RFC' value='2109' /> |
---|
1435 | </reference> |
---|
1436 | |
---|
1437 | <reference anchor="RFC2119"> |
---|
1438 | <front> |
---|
1439 | <title abbrev="RFC Key Words">Key words for use in RFCs to Indicate Requirement Levels</title> |
---|
1440 | <author initials="S." surname="Bradner" fullname="Scott Bradner"> |
---|
1441 | <organization>Harvard University</organization> |
---|
1442 | <address> |
---|
1443 | <email>sob@harvard.edu</email> |
---|
1444 | </address></author> |
---|
1445 | <date month="March" year="1997"/> |
---|
1446 | </front> |
---|
1447 | <seriesInfo name="BCP" value="14"/> |
---|
1448 | <seriesInfo name="RFC" value="2119"/> |
---|
1449 | </reference> |
---|
1450 | |
---|
1451 | <reference anchor="RFC2279"> |
---|
1452 | <front> |
---|
1453 | <title>UTF-8, a transformation format of ISO 10646</title> |
---|
1454 | <author initials="F." surname="Yergeau" fullname="F. Yergeau"> |
---|
1455 | <organization>Alis Technologies</organization> |
---|
1456 | <address><email>fyergeau@alis.com</email></address> |
---|
1457 | </author> |
---|
1458 | <date month="January" year="1998"/> |
---|
1459 | </front> |
---|
1460 | <seriesInfo name="RFC" value="2279"/> |
---|
1461 | </reference> |
---|
1462 | |
---|
1463 | <reference anchor="RFC2396"> |
---|
1464 | <front> |
---|
1465 | <title abbrev="URI Generic Syntax">Uniform Resource Identifiers (URI): Generic Syntax</title> |
---|
1466 | <author initials="T." surname="Berners-Lee" fullname="Tim Berners-Lee"> |
---|
1467 | <organization>World Wide Web Consortium</organization> |
---|
1468 | <address> |
---|
1469 | <email>timbl@w3.org</email> |
---|
1470 | </address> |
---|
1471 | </author> |
---|
1472 | <author initials="R.T." surname="Fielding" fullname="Roy T. Fielding"> |
---|
1473 | <organization>Department of Information and Computer Science</organization> |
---|
1474 | <address> |
---|
1475 | <email>fielding@ics.uci.edu</email> |
---|
1476 | </address> |
---|
1477 | </author> |
---|
1478 | <author initials="L." surname="Masinter" fullname="Larry Masinter"> |
---|
1479 | <organization>Xerox PARC</organization> |
---|
1480 | <address> |
---|
1481 | <email>masinter@parc.xerox.com</email> |
---|
1482 | </address> |
---|
1483 | </author> |
---|
1484 | <date month="August" year="1998"/> |
---|
1485 | </front> |
---|
1486 | <seriesInfo name="RFC" value="2396"/> |
---|
1487 | </reference> |
---|
1488 | |
---|
1489 | <reference anchor="RFC2616"> |
---|
1490 | <front> |
---|
1491 | <title>Hypertext Transfer Protocol -- HTTP/1.1</title> |
---|
1492 | <author initials="R." surname="Fielding" fullname="R. Fielding"> |
---|
1493 | <organization>University of California, Irvine</organization> |
---|
1494 | <address><email>fielding@ics.uci.edu</email></address> |
---|
1495 | </author> |
---|
1496 | <author initials="J." surname="Gettys" fullname="J. Gettys"> |
---|
1497 | <organization>W3C</organization> |
---|
1498 | <address><email>jg@w3.org</email></address> |
---|
1499 | </author> |
---|
1500 | <author initials="J." surname="Mogul" fullname="J. Mogul"> |
---|
1501 | <organization>Compaq Computer Corporation</organization> |
---|
1502 | <address><email>mogul@wrl.dec.com</email></address> |
---|
1503 | </author> |
---|
1504 | <author initials="H." surname="Frystyk" fullname="H. Frystyk"> |
---|
1505 | <organization>MIT Laboratory for Computer Science</organization> |
---|
1506 | <address><email>frystyk@w3.org</email></address> |
---|
1507 | </author> |
---|
1508 | <author initials="L." surname="Masinter" fullname="L. Masinter"> |
---|
1509 | <organization>Xerox Corporation</organization> |
---|
1510 | <address><email>masinter@parc.xerox.com</email></address> |
---|
1511 | </author> |
---|
1512 | <author initials="P." surname="Leach" fullname="P. Leach"> |
---|
1513 | <organization>Microsoft Corporation</organization> |
---|
1514 | <address><email>paulle@microsoft.com</email></address> |
---|
1515 | </author> |
---|
1516 | <author initials="T." surname="Berners-Lee" fullname="T. Berners-Lee"> |
---|
1517 | <organization>W3C</organization> |
---|
1518 | <address><email>timbl@w3.org</email></address> |
---|
1519 | </author> |
---|
1520 | <date month="June" year="1999"/> |
---|
1521 | </front> |
---|
1522 | <seriesInfo name="RFC" value="2616"/> |
---|
1523 | </reference> |
---|
1524 | </references> |
---|
1525 | |
---|
1526 | </back> |
---|
1527 | </rfc> |
---|