| < draft-ietf-httpbis-bcp56bis-00.txt | draft-ietf-httpbis-bcp56bis-01.txt > | |||
|---|---|---|---|---|
| HTTP M. Nottingham | HTTP M. Nottingham | |||
| Internet-Draft December 12, 2017 | Internet-Draft February 12, 2018 | |||
| Obsoletes: 3205 (if approved) | Obsoletes: 3205 (if approved) | |||
| Intended status: Best Current Practice | Intended status: Best Current Practice | |||
| Expires: June 15, 2018 | Expires: August 16, 2018 | |||
| On the use of HTTP as a Substrate | On the use of HTTP as a Substrate | |||
| draft-ietf-httpbis-bcp56bis-00 | draft-ietf-httpbis-bcp56bis-01 | |||
| Abstract | Abstract | |||
| HTTP is often used as a substrate for other application protocols. | HTTP is often used as a substrate for other application protocols. | |||
| This document specifies best practices for these protocols' use of | This document specifies best practices for these protocols' use of | |||
| HTTP. | HTTP. | |||
| Note to Readers | Note to Readers | |||
| Discussion of this draft takes place on the HTTP working group | Discussion of this draft takes place on the HTTP working group | |||
| skipping to change at page 1, line 43 ¶ | skipping to change at page 1, line 43 ¶ | |||
| Internet-Drafts are working documents of the Internet Engineering | Internet-Drafts are working documents of the Internet Engineering | |||
| Task Force (IETF). Note that other groups may also distribute | Task Force (IETF). Note that other groups may also distribute | |||
| working documents as Internet-Drafts. The list of current Internet- | working documents as Internet-Drafts. The list of current Internet- | |||
| Drafts is at https://datatracker.ietf.org/drafts/current/. | Drafts is at https://datatracker.ietf.org/drafts/current/. | |||
| Internet-Drafts are draft documents valid for a maximum of six months | Internet-Drafts are draft documents valid for a maximum of six months | |||
| and may be updated, replaced, or obsoleted by other documents at any | and may be updated, replaced, or obsoleted by other documents at any | |||
| time. It is inappropriate to use Internet-Drafts as reference | time. It is inappropriate to use Internet-Drafts as reference | |||
| material or to cite them other than as "work in progress." | material or to cite them other than as "work in progress." | |||
| This Internet-Draft will expire on June 15, 2018. | This Internet-Draft will expire on August 16, 2018. | |||
| Copyright Notice | Copyright Notice | |||
| Copyright (c) 2017 IETF Trust and the persons identified as the | Copyright (c) 2018 IETF Trust and the persons identified as the | |||
| document authors. All rights reserved. | document authors. All rights reserved. | |||
| This document is subject to BCP 78 and the IETF Trust's Legal | This document is subject to BCP 78 and the IETF Trust's Legal | |||
| Provisions Relating to IETF Documents | Provisions Relating to IETF Documents | |||
| (https://trustee.ietf.org/license-info) in effect on the date of | (https://trustee.ietf.org/license-info) in effect on the date of | |||
| publication of this document. Please review these documents | publication of this document. Please review these documents | |||
| carefully, as they describe your rights and restrictions with respect | carefully, as they describe your rights and restrictions with respect | |||
| to this document. Code Components extracted from this document must | to this document. Code Components extracted from this document must | |||
| include Simplified BSD License text as described in Section 4.e of | include Simplified BSD License text as described in Section 4.e of | |||
| the Trust Legal Provisions and are provided without warranty as | the Trust Legal Provisions and are provided without warranty as | |||
| skipping to change at page 2, line 29 ¶ | skipping to change at page 2, line 29 ¶ | |||
| 2. Is HTTP Being Used? . . . . . . . . . . . . . . . . . . . . . 4 | 2. Is HTTP Being Used? . . . . . . . . . . . . . . . . . . . . . 4 | |||
| 3. What's Important About HTTP . . . . . . . . . . . . . . . . . 5 | 3. What's Important About HTTP . . . . . . . . . . . . . . . . . 5 | |||
| 3.1. Generic Semantics . . . . . . . . . . . . . . . . . . . . 5 | 3.1. Generic Semantics . . . . . . . . . . . . . . . . . . . . 5 | |||
| 3.2. Links . . . . . . . . . . . . . . . . . . . . . . . . . . 6 | 3.2. Links . . . . . . . . . . . . . . . . . . . . . . . . . . 6 | |||
| 3.3. Getting Value from HTTP . . . . . . . . . . . . . . . . . 6 | 3.3. Getting Value from HTTP . . . . . . . . . . . . . . . . . 6 | |||
| 4. Best Practices for Using HTTP . . . . . . . . . . . . . . . . 7 | 4. Best Practices for Using HTTP . . . . . . . . . . . . . . . . 7 | |||
| 4.1. Specifying the Use of HTTP . . . . . . . . . . . . . . . 7 | 4.1. Specifying the Use of HTTP . . . . . . . . . . . . . . . 7 | |||
| 4.2. Defining HTTP Resources . . . . . . . . . . . . . . . . . 8 | 4.2. Defining HTTP Resources . . . . . . . . . . . . . . . . . 8 | |||
| 4.3. HTTP URLs . . . . . . . . . . . . . . . . . . . . . . . . 9 | 4.3. HTTP URLs . . . . . . . . . . . . . . . . . . . . . . . . 9 | |||
| 4.3.1. Initial URL Discovery . . . . . . . . . . . . . . . . 9 | 4.3.1. Initial URL Discovery . . . . . . . . . . . . . . . . 9 | |||
| 4.3.2. URL Schemes . . . . . . . . . . . . . . . . . . . . . 9 | 4.3.2. URL Schemes . . . . . . . . . . . . . . . . . . . . . 10 | |||
| 4.3.3. Transport Ports . . . . . . . . . . . . . . . . . . . 10 | 4.3.3. Transport Ports . . . . . . . . . . . . . . . . . . . 11 | |||
| 4.4. HTTP Methods . . . . . . . . . . . . . . . . . . . . . . 11 | 4.4. HTTP Methods . . . . . . . . . . . . . . . . . . . . . . 11 | |||
| 4.5. HTTP Status Codes . . . . . . . . . . . . . . . . . . . . 11 | 4.5. HTTP Status Codes . . . . . . . . . . . . . . . . . . . . 12 | |||
| 4.6. HTTP Header Fields . . . . . . . . . . . . . . . . . . . 12 | 4.6. HTTP Header Fields . . . . . . . . . . . . . . . . . . . 13 | |||
| 4.7. Defining Message Payloads . . . . . . . . . . . . . . . . 13 | 4.7. Defining Message Payloads . . . . . . . . . . . . . . . . 14 | |||
| 4.8. Ensuring Browser Interoperability . . . . . . . . . . . . 13 | 4.8. Authentication and Application State . . . . . . . . . . 14 | |||
| 4.9. Access Control . . . . . . . . . . . . . . . . . . . . . 13 | 4.9. Co-Existing with Web Browsing . . . . . . . . . . . . . . 14 | |||
| 4.9.1. Authentication and Application State . . . . . . . . 13 | 4.10. Co-Existing with Other Applications . . . . . . . . . . . 15 | |||
| 5. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 13 | 5. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 15 | |||
| 6. Security Considerations . . . . . . . . . . . . . . . . . . . 14 | 6. Security Considerations . . . . . . . . . . . . . . . . . . . 15 | |||
| 7. References . . . . . . . . . . . . . . . . . . . . . . . . . 14 | 7. References . . . . . . . . . . . . . . . . . . . . . . . . . 16 | |||
| 7.1. Normative References . . . . . . . . . . . . . . . . . . 14 | 7.1. Normative References . . . . . . . . . . . . . . . . . . 16 | |||
| 7.2. Informative References . . . . . . . . . . . . . . . . . 15 | 7.2. Informative References . . . . . . . . . . . . . . . . . 18 | |||
| 7.3. URIs . . . . . . . . . . . . . . . . . . . . . . . . . . 17 | 7.3. URIs . . . . . . . . . . . . . . . . . . . . . . . . . . 20 | |||
| Appendix A. Changes from RFC3205 . . . . . . . . . . . . . . . . 17 | Appendix A. Changes from RFC3205 . . . . . . . . . . . . . . . . 20 | |||
| Author's Address . . . . . . . . . . . . . . . . . . . . . . . . 17 | Author's Address . . . . . . . . . . . . . . . . . . . . . . . . 20 | |||
| 1. Introduction | 1. Introduction | |||
| HTTP [RFC7230] is often used as a substrate for other application | HTTP [RFC7230] is often used as a substrate for other application | |||
| protocols. This is done for a variety of reasons, including: | protocols. This is done for a variety of reasons, including: | |||
| o familiarity by implementers, specifiers, administrators, | o familiarity by implementers, specifiers, administrators, | |||
| developers and users, | developers and users, | |||
| o availability of a variety of client, server and proxy | o availability of a variety of client, server and proxy | |||
| skipping to change at page 4, line 23 ¶ | skipping to change at page 4, line 23 ¶ | |||
| 2. Is HTTP Being Used? | 2. Is HTTP Being Used? | |||
| Different applications have different goals when using HTTP. In this | Different applications have different goals when using HTTP. In this | |||
| document, we say an application is _using HTTP_ when any of the | document, we say an application is _using HTTP_ when any of the | |||
| following conditions are true: | following conditions are true: | |||
| o The transport port in use is 80 or 443, | o The transport port in use is 80 or 443, | |||
| o The URL scheme "http" or "https" is used, | o The URL scheme "http" or "https" is used, | |||
| o The ALPN protocol ID [RFC7301] "http/1.1", "h2" or "h2c" is used, | o The ALPN protocol ID [RFC7301] generically identifies HTTP (e.g., | |||
| or | "http/1.1", "h2", "h2c"), or | |||
| o The message formats described in [RFC7230] and/or [RFC7540] are | o The message formats described in [RFC7230] and/or [RFC7540] are | |||
| used in conjunction with the IANA registries defined for HTTP. | used in conjunction with the IANA registries defined for HTTP. | |||
| When an application is using HTTP, all of the requirements of the | When an application is using HTTP, all of the requirements of the | |||
| HTTP protocol suite (including but not limited to [RFC7230], | HTTP protocol suite (including but not limited to [RFC7230], | |||
| [RFC7231], [RFC7232], [RFC7233], [RFC7234], [RFC7235] and [RFC7540]) | [RFC7231], [RFC7232], [RFC7233], [RFC7234], [RFC7235] and [RFC7540]) | |||
| are in force. | are in force. | |||
| An application might not be _using HTTP_ according to this | An application might not be _using HTTP_ according to this | |||
| skipping to change at page 5, line 7 ¶ | skipping to change at page 5, line 7 ¶ | |||
| outlined above, as most HTTP implementations won't be easily | outlined above, as most HTTP implementations won't be easily | |||
| adaptable to these changes, and as the protocol diverges from HTTP, | adaptable to these changes, and as the protocol diverges from HTTP, | |||
| the benefit of mindshare will be lost. | the benefit of mindshare will be lost. | |||
| Protocols that are based upon HTTP MUST NOT reuse HTTP's URL schemes, | Protocols that are based upon HTTP MUST NOT reuse HTTP's URL schemes, | |||
| transport ports, ALPN protocol IDs or IANA registries; rather, they | transport ports, ALPN protocol IDs or IANA registries; rather, they | |||
| are encouraged to establish their own. | are encouraged to establish their own. | |||
| 3. What's Important About HTTP | 3. What's Important About HTTP | |||
| There are many ways that HTTP applications are defined and deployed, | There are many ways that applications using HTTP are defined and | |||
| and sometimes they are brought to the IETF for standardisation. In | deployed, and sometimes they are brought to the IETF for | |||
| that process, what might be workable for deployment in a limited | standardisation. In that process, what might be workable for | |||
| fashion isn't appropriate for standardisation and the corresponding | deployment in a limited fashion isn't appropriate for standardisation | |||
| broader deployment. | and the corresponding broader deployment. | |||
| This section examines the facets of the protocol that are important | This section examines the facets of the protocol that are important | |||
| to preserve in these situations. | to preserve in these situations. | |||
| 3.1. Generic Semantics | 3.1. Generic Semantics | |||
| When writing an application's specification, it's often tempting to | When writing an application's specification, it's often tempting to | |||
| specify exactly how HTTP is to be implemented, supported and used. | specify exactly how HTTP is to be implemented, supported and used. | |||
| However, this can easily lead to an unintended profile of HTTP's | However, this can easily lead to an unintended profile of HTTP's | |||
| skipping to change at page 5, line 49 ¶ | skipping to change at page 5, line 49 ¶ | |||
| status code might differ in a real deployment. If the client does | status code might differ in a real deployment. If the client does | |||
| not anticipate this, the application's deployment is brittle. | not anticipate this, the application's deployment is brittle. | |||
| Much of the value of HTTP is in its _generic semantics_ - that is, | Much of the value of HTTP is in its _generic semantics_ - that is, | |||
| the protocol elements defined by HTTP are potentially applicable to | the protocol elements defined by HTTP are potentially applicable to | |||
| every resource, not specific to a particular context. Application- | every resource, not specific to a particular context. Application- | |||
| specific semantics are expressed in the payload; mostly, in the body, | specific semantics are expressed in the payload; mostly, in the body, | |||
| but also in header fields. | but also in header fields. | |||
| This allows a HTTP message to be examined by generic HTTP software | This allows a HTTP message to be examined by generic HTTP software | |||
| (e.g., HTTP servers, intermediaries, client implementatiions), and | (e.g., HTTP servers, intermediaries, client implementations), and its | |||
| its handling to be correctly determined. It also allows people to | handling to be correctly determined. It also allows people to | |||
| leverage their knowledge of HTTP semantics without special-casing | leverage their knowledge of HTTP semantics without special-casing | |||
| them for a particular application. | them for a particular application. | |||
| Therefore, applications that use HTTP MUST NOT re-define, refine or | Therefore, applications that use HTTP MUST NOT re-define, refine or | |||
| overlay the semantics of defined protocol elements. Instead, they | overlay the semantics of defined protocol elements. Instead, they | |||
| SHOULD focus their specifications on protocol elements that are | SHOULD focus their specifications on protocol elements that are | |||
| specific to them; namely their HTTP resources. | specific to that application; namely their HTTP resources. | |||
| See Section 4.2 for details. | See Section 4.2 for details. | |||
| 3.2. Links | 3.2. Links | |||
| Another common practice is assuming that the HTTP server's name space | Another common practice is assuming that the HTTP server's name space | |||
| (or a portion thereof) is exclusively for the use of a single | (or a portion thereof) is exclusively for the use of a single | |||
| application. This effectively overlays special, application-specific | application. This effectively overlays special, application-specific | |||
| semantics onto that space, precludes other applications from using | semantics onto that space, precludes other applications from using | |||
| it. | it. | |||
| As explained in [RFC7320], such "squatting" on a part of the URL | As explained in [RFC7320], such "squatting" on a part of the URL | |||
| space by a standard usurps the server's authority over its own | space by a standard usurps the server's authority over its own | |||
| resources, can cause deployment issues, and is therefore bad practice | resources, can cause deployment issues, and is therefore bad practice | |||
| in standards. | in standards. | |||
| Instead of statically defining URL paths, it is RECOMMENDED that | Instead of statically defining URL components like paths, it is | |||
| applications using HTTP define links in payloads, to allow | RECOMMENDED that applications using HTTP define links in payloads, to | |||
| flexibility in deployment. | allow flexibility in deployment. | |||
| Using runtime links in this fashion has a number of other benefits. | Using runtime links in this fashion has a number of other benefits. | |||
| For example, navigating with a link allows a request to be routed to | For example, navigating with a link allows a request to be routed to | |||
| a different server without the overhead of a redirection, thereby | a different server without the overhead of a redirection, thereby | |||
| supporting deployment across machines well. It becomes possible to | supporting deployment across machines well. It becomes possible to | |||
| "mix" different applications on the same server, and offers a natural | "mix" different applications on the same server, and offers a natural | |||
| path for extensibility, versioning and capability management. | path for extensibility, versioning and capability management. | |||
| 3.3. Getting Value from HTTP | 3.3. Getting Value from HTTP | |||
| skipping to change at page 8, line 9 ¶ | skipping to change at page 8, line 9 ¶ | |||
| function SHOULD degrade gracefully if they are not (although this | function SHOULD degrade gracefully if they are not (although this | |||
| might be achieved by informing the user that their task cannot be | might be achieved by informing the user that their task cannot be | |||
| completed). | completed). | |||
| For example, an application can specify that it uses HTTP like this: | For example, an application can specify that it uses HTTP like this: | |||
| Foo Application uses HTTP {{RFC7230}}. Implementations MUST support | Foo Application uses HTTP {{RFC7230}}. Implementations MUST support | |||
| HTTP/1.1, and MAY support later versions. Support for common HTTP | HTTP/1.1, and MAY support later versions. Support for common HTTP | |||
| mechanisms such as redirection and caching are assumed. | mechanisms such as redirection and caching are assumed. | |||
| When specifying examples of protocol interactions, applications | ||||
| SHOULD document both the request and response messages, with full | ||||
| headers, preferably in HTTP/1.1 format. For example: | ||||
| GET /thing HTTP/1.1 | ||||
| Host: example.com | ||||
| Accept: application/things+json | ||||
| User-Agent: Foo/1.0 | ||||
| HTTP/1.1 200 OK | ||||
| Content-Type: application/things+json | ||||
| Content-Length: 500 | ||||
| Server: Bar/2.2 | ||||
| [payload here] | ||||
| 4.2. Defining HTTP Resources | 4.2. Defining HTTP Resources | |||
| HTTP Applications SHOULD focus on defining the following application- | HTTP Applications SHOULD focus on defining the following application- | |||
| specific protocol elements: | specific protocol elements: | |||
| o Media types [RFC6838], often based upon a format convention such | o Media types [RFC6838], often based upon a format convention such | |||
| as JSON [RFC7159], | as JSON [RFC7159], | |||
| o HTTP header fields, as per Section 4.6, and | o HTTP header fields, as per Section 4.6, and | |||
| skipping to change at page 9, line 42 ¶ | skipping to change at page 10, line 8 ¶ | |||
| server by requesting an initial document that contains information | server by requesting an initial document that contains information | |||
| about that particular deployment, potentially including links to | about that particular deployment, potentially including links to | |||
| other relevant resources. | other relevant resources. | |||
| Applications that use HTTP SHOULD allow an arbitrary URL to be used | Applications that use HTTP SHOULD allow an arbitrary URL to be used | |||
| as that entry point. For example, rather than specifying "the | as that entry point. For example, rather than specifying "the | |||
| initial document is at "/foo/v1", they should allow a deployment to | initial document is at "/foo/v1", they should allow a deployment to | |||
| use any URL as the entry point for the application. | use any URL as the entry point for the application. | |||
| In cases where doing so is impractical (e.g., it is not possible to | In cases where doing so is impractical (e.g., it is not possible to | |||
| convey a whole URL, but only a hostname) applications that use HTTP | convey a whole URL, but only a hostname) standard applications that | |||
| MAY define a well-known URL [RFC5785] as an entry point. | use HTTP can request a well-known URL [RFC5785] as an entry point. | |||
| 4.3.2. URL Schemes | 4.3.2. URL Schemes | |||
| Applications that use HTTP will typically use the "http" and/or | Applications that use HTTP will typically use the "http" and/or | |||
| "https" URL schemes. "https" is preferred to mitigate pervasive | "https" URL schemes. "https" is preferred to provide authentication, | |||
| integrity and confidentiality, as well as mitigate pervasive | ||||
| monitoring attacks [RFC7258]. | monitoring attacks [RFC7258]. | |||
| However, application-specific schemes can be defined as well. | However, application-specific schemes can be defined as well. | |||
| When defining an URL scheme for an application using HTTP, there are | When defining an URL scheme for an application using HTTP, there are | |||
| a number of tradeoffs and caveats to keep in mind: | a number of tradeoffs and caveats to keep in mind: | |||
| o Unmodified Web browsers will not support the new scheme. While it | o Unmodified Web browsers will not support the new scheme. While it | |||
| is possible to register new URL schemes with Web browsers (e.g. | is possible to register new URL schemes with Web browsers (e.g. | |||
| registerProtocolHandler() in [HTML5] Section 8.7.1.3, as well as | registerProtocolHandler() in [HTML5] Section 8.7.1.3, as well as | |||
| several proprietary approaches), support for these mechanisms is | several proprietary approaches), support for these mechanisms is | |||
| not shared by all browsers, and their capabilities can vary. | not shared by all browsers, and their capabilities vary. | |||
| o Likewise, existing non-browser clients, intermediaries, servers | o Existing non-browser clients, intermediaries, servers and | |||
| and associated software will not recognise the new scheme, and | associated software will not recognise the new scheme. For | |||
| might fail to operate. For example, a client library might fail | example, a client library might fail to dispatch the request; a | |||
| to dispatch the request; a cache might refuse to store the | cache might refuse to store the response, and a proxy might fail | |||
| response, and a proxy might fail to forward the request. | to forward the request. | |||
| o Because URLs occur in and are generated in HTTP artefacts | o Because URLs occur in and are generated in HTTP artefacts | |||
| commonly, often without human intervention (e.g., in the | commonly, often without human intervention (e.g., in the | |||
| "Location" header), it can be difficult to assure that the new | "Location" response header), it can be difficult to assure that | |||
| scheme is used consistently. | the new scheme is used consistently. | |||
| o The resources identified by the new scheme will still be available | o The resources identified by the new scheme will still be available | |||
| with "http" and/or "https" URLs to clients. While it is possible | using "http" and/or "https" URLs. Those URLs can "leak" into use, | |||
| to define the relationship between these resources in the new | which can present security and operability issues. For example, | |||
| scheme's specification, existing HTTP software (such as clients, | using a new scheme to assure that requests don't get sent to a | |||
| caches, intermediaries and servers) will not be available, so | "normal" Web site is likely to fail. | |||
| there is a danger of confusion when the "wrong" URL is used. | ||||
| o Features that rely upon the URL's origin [RFC6454], such as the | o Features that rely upon the URL's origin [RFC6454], such as the | |||
| Web's same-origin policy, will be impacted by a change of scheme. | Web's same-origin policy, will be impacted by a change of scheme. | |||
| o HTTP-specific features such as cookies [RFC6265], authentication | o HTTP-specific features such as cookies [RFC6265], authentication | |||
| [RFC7235], caching [RFC7234], and CORS [FETCH] might or might not | [RFC7235], caching [RFC7234], and CORS [FETCH] might or might not | |||
| work correctly, depending on how they are defined and implemented. | work correctly, depending on how they are defined and implemented. | |||
| Generally, they are designed and implemented with an assumption | Generally, they are designed and implemented with an assumption | |||
| that the URL will always be "http" or "https". | that the URL will always be "http" or "https". | |||
| o Web features that require a secure context | o Web features that require a secure context | |||
| [W3C.CR-secure-contexts-20160915] will likely treat a new scheme | [W3C.CR-secure-contexts-20160915] will likely treat a new scheme | |||
| as insecure. | as insecure. | |||
| See [RFC7595] for more information about minting new URL schemes. | See [RFC7595] for more information about minting new URL schemes. | |||
| 4.3.3. Transport Ports | 4.3.3. Transport Ports | |||
| Applications that use HTTP SHOULD use the default port for the URL | Applications that use HTTP can use the applicable default port (80 | |||
| scheme in use. If it is felt that networks might need to distinguish | for HTTP, 443 for HTTPS), or they can be deployed upon other ports. | |||
| the application's traffic for operational reasons, it MAY register a | This decision can be made at deployment time, or might be encouraged | |||
| separate port, but be aware that this has privacy implications for | by the application's specification (e.g., by registering a port for | |||
| that protocol's users. The impact of doing so MUST be documented in | that application). | |||
| In either case, non-default ports will need to be reflected in the | ||||
| authority of all URLs for that resource; the only mechanism for | ||||
| changing a default port is changing the scheme (see Section 4.3.2). | ||||
| Using a port other than the default has privacy implications (i.e., | ||||
| the protocol can now be distinguished from other traffic), as well as | ||||
| operability concerns (as some networks might block or otherwise | ||||
| interfere with it). Privacy implications SHOULD be documented in | ||||
| Security Considerations. | Security Considerations. | |||
| See [RFC7605] for further guidance. | See [RFC7605] for further guidance. | |||
| 4.4. HTTP Methods | 4.4. HTTP Methods | |||
| Applications that use HTTP MUST confine themselves to using | Applications that use HTTP MUST confine themselves to using | |||
| registered HTTP methods such as GET, POST, PUT, DELETE, and PATCH. | registered HTTP methods such as GET, POST, PUT, DELETE, and PATCH. | |||
| New HTTP methods are rare; they are required to be registered with | New HTTP methods are rare; they are required to be registered with | |||
| skipping to change at page 12, line 7 ¶ | skipping to change at page 12, line 32 ¶ | |||
| Therefore, applications MUST NOT specify additional semantics or | Therefore, applications MUST NOT specify additional semantics or | |||
| refine existing semantics for status codes. | refine existing semantics for status codes. | |||
| In particular, specifying that a particular status code has a | In particular, specifying that a particular status code has a | |||
| specific meaning in the context of an application is harmful, as | specific meaning in the context of an application is harmful, as | |||
| these are not generic semantics, since the consumer needs to be in | these are not generic semantics, since the consumer needs to be in | |||
| the context of the application to understand them. | the context of the application to understand them. | |||
| Furthermore, applications using HTTP MUST NOT re-specify the | Furthermore, applications using HTTP MUST NOT re-specify the | |||
| semantics of HTTP status codes, even if it is only by copying their | semantics of HTTP status codes, even if it is only by copying their | |||
| definition. They MUST NOT require specific status phrases to be | definition. They MUST NOT require specific reason phrases to be | |||
| used; the status phrase has no function in HTTP, and is not | used; the reason phrase has no function in HTTP, and is not | |||
| guaranteed to be preserved by implementations. | guaranteed to be preserved by implementations. The reason phrase is | |||
| not carried in the [RFC7540] message format. | ||||
| Typically, applications using HTTP will convey application-specific | Typically, applications using HTTP will convey application-specific | |||
| information in the message body and/or HTTP header fields, not the | information in the message body and/or HTTP header fields, not the | |||
| status code. | status code. | |||
| Specifications sometimes also create a "laundry list" of potential | Specifications sometimes also create a "laundry list" of potential | |||
| status codes, in an effort to be helpful. The problem with doing so | status codes, in an effort to be helpful. The problem with doing so | |||
| is that such a list is never complete; for example, if a network | is that such a list is never complete; for example, if a network | |||
| proxy is interposed, the client might encounter a "407 Proxy | proxy is interposed, the client might encounter a "407 Proxy | |||
| Authentication Required" response; or, if the server is rate limiting | Authentication Required" response; or, if the server is rate limiting | |||
| skipping to change at page 13, line 8 ¶ | skipping to change at page 13, line 35 ¶ | |||
| RECOMMENDED. | RECOMMENDED. | |||
| New header fields MUST be registered, as per [RFC7231] and [RFC3864]. | New header fields MUST be registered, as per [RFC7231] and [RFC3864]. | |||
| It is RECOMMENDED that header field names be short (even when HTTP/2 | It is RECOMMENDED that header field names be short (even when HTTP/2 | |||
| header compression is in effect, there is an overhead) but | header compression is in effect, there is an overhead) but | |||
| appropriately specific. In particular, if a header field is specific | appropriately specific. In particular, if a header field is specific | |||
| to an application, an identifier for that application SHOULD form a | to an application, an identifier for that application SHOULD form a | |||
| prefix to the header field name, separated by a "-". | prefix to the header field name, separated by a "-". | |||
| For example, if the "example" application needs to create three | ||||
| headers, they might be called "example-foo", "example-bar" and | ||||
| "example-baz". Note that the primary motivation here is to avoid | ||||
| consuming more generic header names, not to reserve a portion of the | ||||
| namespace for the application; see [RFC6648] for related | ||||
| considerations. | ||||
| The semantics of existing HTTP header fields MUST NOT be re-defined | The semantics of existing HTTP header fields MUST NOT be re-defined | |||
| without updating their registration or defining an extension to them | without updating their registration or defining an extension to them | |||
| (if allowed). For example, an application using HTTP cannot specify | (if allowed). For example, an application using HTTP cannot specify | |||
| that the "Location" header has a special meaning in a certain | that the "Location" header has a special meaning in a certain | |||
| context. | context. | |||
| See Section 4.9.1 for requirements regarding header fields that carry | See Section 4.8 for requirements regarding header fields that carry | |||
| application state (e.g,. Cookie). | application state (e.g,. Cookie). | |||
| 4.7. Defining Message Payloads | 4.7. Defining Message Payloads | |||
| 4.8. Ensuring Browser Interoperability | There are many potential formats for payloads; for example, JSON | |||
| [RFC8259] and XML [W3C.REC-xml-20081126]. Best practices for their | ||||
| 4.9. Access Control | use are out of scope for this document. | |||
| Modern Web browsers constrain the ability of content from one origin | Applications SHOULD register distinct media types for each format | |||
| (as defined by [RFC6454]) to access resources from another, to avoid | they define; this makes it possible to identify them unambiguously | |||
| the "confused deputy" problem. As a result, applications that wish | and negotiate for their use. See [RFC6838] for more information. | |||
| to expose cross-origin data to browsers will need to implement | ||||
| [W3C.REC-cors-20140116]. | ||||
| 4.9.1. Authentication and Application State | 4.8. Authentication and Application State | |||
| Applications that use HTTP MAY use stateful cookies [RFC6265] to | Applications that use HTTP MAY use stateful cookies [RFC6265] to | |||
| identify a client and/or store client-specific data to contextualise | identify a client and/or store client-specific data to contextualise | |||
| requests. | requests. | |||
| If it is only necessary to identify clients, applications that use | If it is only necessary to identify clients, applications that use | |||
| HTTP MAY use HTTP authentication [RFC7235]; if the Basic | HTTP MAY use HTTP authentication [RFC7235]; if either of the Basic | |||
| authentication scheme [RFC7617] is used, it MUST NOT be used with the | [RFC7617] or Digest [RFC7616] authentication schemes is used, it MUST | |||
| 'http' URL scheme. | NOT be used with the 'http' URL scheme. | |||
| In either case, it is important to carefully specify the scoping and | In either case, it is important to carefully specify the scoping and | |||
| use of these mechanisms; if they expose sensitive data or | use of these mechanisms; if they expose sensitive data or | |||
| capabilities (e.g., by acting as an ambient authority), exploits are | capabilities (e.g., by acting as an ambient authority), exploits are | |||
| possible. Mitigations include using a request-specific token to | possible. Mitigations include using a request-specific token to | |||
| assure the intent of the client. | assure the intent of the client. | |||
| Applications MUST NOT make assumptions about the relationship between | ||||
| separate requests on a single transport connection; doing so breaks | ||||
| many of the assumptions of HTTP as a stateless protocol, and will | ||||
| cause problems in interoperability, security, operability and | ||||
| evolution. | ||||
| 4.9. Co-Existing with Web Browsing | ||||
| Even if there is not an intent for an application that uses HTTP to | ||||
| be used with a Web browser, its resources will remain available to | ||||
| browsers and other HTTP clients. | ||||
| This means that all such applications need to consider how browsers | ||||
| will interact with them, particularly regarding security. | ||||
| For example, if an application's state can be changed using a POST | ||||
| request, a Web browser can easily be coaxed into making that request | ||||
| by a HTML form on an arbitrary Web site. | ||||
| Or, if a resource reflects data from the request into a response, | ||||
| that can be used to perform a Cross-Site Scripting attack on Web | ||||
| browsers directed to it. | ||||
| This is only a small sample of the kinds of issues that applications | ||||
| using HTTP must consider. Generally, the best approach is to | ||||
| consider the application _as_ a Web application, and to follow best | ||||
| practices for their secure development. | ||||
| A complete enumeration of such practices is out of scope for this | ||||
| document. External resources are numerous; e.g., | ||||
| https://www.owasp.org/index.php/OWASP_Guide_Project [4]. | ||||
| 4.10. Co-Existing with Other Applications | ||||
| Because the origin [RFC6454] is how many HTTP capabilities are | ||||
| scoped, applications also need to consider how deployments might | ||||
| interact with other applications (including Web browsing) on the same | ||||
| origin. | ||||
| For example, if Cookies [RFC6265] are used to carry application | ||||
| state, they will be sent with all requests to the origin by default, | ||||
| unless scoped by path, and the application might receive cookies from | ||||
| other applications on the origin. This can lead to security issues, | ||||
| as well as collisions in cookie name. | ||||
| As a result, when specifying the use of Cookies, HTTP authentication | ||||
| [RFC7235], or other origin-wide HTTP mechanisms, applications using | ||||
| HTTP SHOULD NOT mandate the use of a particular identifier, but | ||||
| instead let deployments configure them. | ||||
| Note that dedicating a hostname to a single application is not a | ||||
| solution to the issues above; see [RFC7320]. | ||||
| Modern Web browsers constrain the ability of content from one origin | ||||
| to access resources from another, to avoid the "confused deputy" | ||||
| problem. As a result, applications that wish to expose cross-origin | ||||
| data to browsers will need to implement [W3C.REC-cors-20140116]. | ||||
| 5. IANA Considerations | 5. IANA Considerations | |||
| This document has no requirements for IANA. | This document has no requirements for IANA. | |||
| 6. Security Considerations | 6. Security Considerations | |||
| Section 4.9.1 discusses the impact of using stateful mechanisms in | Section 4.8 discusses the impact of using stateful mechanisms in the | |||
| the protocol as ambient authority, and suggests a mitigation. | protocol as ambient authority, and suggests a mitigation. | |||
| Section 4.3.2 requires support for 'https' URLs, and discourages the | Section 4.3.2 requires support for 'https' URLs, and discourages the | |||
| use of 'http' URLs, to mitigate pervasive monitoring attacks. | use of 'http' URLs, to provide authentication, integrity and | |||
| confidentiality, as well as mitigate pervasive monitoring attacks. | ||||
| Section 4.9 highlights the implications of Web browsers' capabilities | ||||
| on applications that use HTTP. | ||||
| Applications that use HTTP in a manner that involves modification of | Applications that use HTTP in a manner that involves modification of | |||
| implementations - for example, requiring support for a new URL | implementations - for example, requiring support for a new URL | |||
| scheme, or a non-standard method - risk having those implementations | scheme, or a non-standard method - risk having those implementations | |||
| "fork" from their parent HTTP implementations, with the possible | "fork" from their parent HTTP implementations, with the possible | |||
| result that they do not benefit from patches and other security | result that they do not benefit from patches and other security | |||
| improvements incorporated upstream. | improvements incorporated upstream. | |||
| 7. References | 7. References | |||
| skipping to change at page 14, line 38 ¶ | skipping to change at page 16, line 37 ¶ | |||
| [RFC3864] Klyne, G., Nottingham, M., and J. Mogul, "Registration | [RFC3864] Klyne, G., Nottingham, M., and J. Mogul, "Registration | |||
| Procedures for Message Header Fields", BCP 90, RFC 3864, | Procedures for Message Header Fields", BCP 90, RFC 3864, | |||
| DOI 10.17487/RFC3864, September 2004, | DOI 10.17487/RFC3864, September 2004, | |||
| <https://www.rfc-editor.org/info/rfc3864>. | <https://www.rfc-editor.org/info/rfc3864>. | |||
| [RFC5988] Nottingham, M., "Web Linking", RFC 5988, | [RFC5988] Nottingham, M., "Web Linking", RFC 5988, | |||
| DOI 10.17487/RFC5988, October 2010, | DOI 10.17487/RFC5988, October 2010, | |||
| <https://www.rfc-editor.org/info/rfc5988>. | <https://www.rfc-editor.org/info/rfc5988>. | |||
| [RFC6454] Barth, A., "The Web Origin Concept", RFC 6454, | ||||
| DOI 10.17487/RFC6454, December 2011, | ||||
| <https://www.rfc-editor.org/info/rfc6454>. | ||||
| [RFC6648] Saint-Andre, P., Crocker, D., and M. Nottingham, | ||||
| "Deprecating the "X-" Prefix and Similar Constructs in | ||||
| Application Protocols", BCP 178, RFC 6648, | ||||
| DOI 10.17487/RFC6648, June 2012, | ||||
| <https://www.rfc-editor.org/info/rfc6648>. | ||||
| [RFC6838] Freed, N., Klensin, J., and T. Hansen, "Media Type | [RFC6838] Freed, N., Klensin, J., and T. Hansen, "Media Type | |||
| Specifications and Registration Procedures", BCP 13, | Specifications and Registration Procedures", BCP 13, | |||
| RFC 6838, DOI 10.17487/RFC6838, January 2013, | RFC 6838, DOI 10.17487/RFC6838, January 2013, | |||
| <https://www.rfc-editor.org/info/rfc6838>. | <https://www.rfc-editor.org/info/rfc6838>. | |||
| [RFC7230] Fielding, R., Ed. and J. Reschke, Ed., "Hypertext Transfer | [RFC7230] Fielding, R., Ed. and J. Reschke, Ed., "Hypertext Transfer | |||
| Protocol (HTTP/1.1): Message Syntax and Routing", | Protocol (HTTP/1.1): Message Syntax and Routing", | |||
| RFC 7230, DOI 10.17487/RFC7230, June 2014, | RFC 7230, DOI 10.17487/RFC7230, June 2014, | |||
| <https://www.rfc-editor.org/info/rfc7230>. | <https://www.rfc-editor.org/info/rfc7230>. | |||
| skipping to change at page 15, line 50 ¶ | skipping to change at page 18, line 12 ¶ | |||
| 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, | 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, | |||
| May 2017, <https://www.rfc-editor.org/info/rfc8174>. | May 2017, <https://www.rfc-editor.org/info/rfc8174>. | |||
| [W3C.REC-cors-20140116] | [W3C.REC-cors-20140116] | |||
| Kesteren, A., "Cross-Origin Resource Sharing", World Wide | Kesteren, A., "Cross-Origin Resource Sharing", World Wide | |||
| Web Consortium Recommendation REC-cors-20140116, January | Web Consortium Recommendation REC-cors-20140116, January | |||
| 2014, <http://www.w3.org/TR/2014/REC-cors-20140116>. | 2014, <http://www.w3.org/TR/2014/REC-cors-20140116>. | |||
| 7.2. Informative References | 7.2. Informative References | |||
| [FETCH] various, ., "Fetch - Living Standard", September 2017, | [FETCH] WHATWG, "Fetch - Living Standard", n.d., | |||
| <https://fetch.spec.whatwg.org>. | <https://fetch.spec.whatwg.org>. | |||
| [HTML5] various, ., "HTML - Living Standard", September 2017, | [HTML5] WHATWG, "HTML - Living Standard", n.d., | |||
| <https://html.spec.whatwg.org>. | <https://html.spec.whatwg.org>. | |||
| [RFC0793] Postel, J., "Transmission Control Protocol", STD 7, | [RFC0793] Postel, J., "Transmission Control Protocol", STD 7, | |||
| RFC 793, DOI 10.17487/RFC0793, September 1981, | RFC 793, DOI 10.17487/RFC0793, September 1981, | |||
| <https://www.rfc-editor.org/info/rfc793>. | <https://www.rfc-editor.org/info/rfc793>. | |||
| [RFC0854] Postel, J. and J. Reynolds, "Telnet Protocol | [RFC0854] Postel, J. and J. Reynolds, "Telnet Protocol | |||
| Specification", STD 8, RFC 854, DOI 10.17487/RFC0854, May | Specification", STD 8, RFC 854, DOI 10.17487/RFC0854, May | |||
| 1983, <https://www.rfc-editor.org/info/rfc854>. | 1983, <https://www.rfc-editor.org/info/rfc854>. | |||
| skipping to change at page 16, line 43 ¶ | skipping to change at page 19, line 5 ¶ | |||
| [RFC5785] Nottingham, M. and E. Hammer-Lahav, "Defining Well-Known | [RFC5785] Nottingham, M. and E. Hammer-Lahav, "Defining Well-Known | |||
| Uniform Resource Identifiers (URIs)", RFC 5785, | Uniform Resource Identifiers (URIs)", RFC 5785, | |||
| DOI 10.17487/RFC5785, April 2010, | DOI 10.17487/RFC5785, April 2010, | |||
| <https://www.rfc-editor.org/info/rfc5785>. | <https://www.rfc-editor.org/info/rfc5785>. | |||
| [RFC6265] Barth, A., "HTTP State Management Mechanism", RFC 6265, | [RFC6265] Barth, A., "HTTP State Management Mechanism", RFC 6265, | |||
| DOI 10.17487/RFC6265, April 2011, | DOI 10.17487/RFC6265, April 2011, | |||
| <https://www.rfc-editor.org/info/rfc6265>. | <https://www.rfc-editor.org/info/rfc6265>. | |||
| [RFC6454] Barth, A., "The Web Origin Concept", RFC 6454, | ||||
| DOI 10.17487/RFC6454, December 2011, | ||||
| <https://www.rfc-editor.org/info/rfc6454>. | ||||
| [RFC6455] Fette, I. and A. Melnikov, "The WebSocket Protocol", | [RFC6455] Fette, I. and A. Melnikov, "The WebSocket Protocol", | |||
| RFC 6455, DOI 10.17487/RFC6455, December 2011, | RFC 6455, DOI 10.17487/RFC6455, December 2011, | |||
| <https://www.rfc-editor.org/info/rfc6455>. | <https://www.rfc-editor.org/info/rfc6455>. | |||
| [RFC7159] Bray, T., Ed., "The JavaScript Object Notation (JSON) Data | [RFC7159] Bray, T., Ed., "The JavaScript Object Notation (JSON) Data | |||
| Interchange Format", RFC 7159, DOI 10.17487/RFC7159, March | Interchange Format", RFC 7159, DOI 10.17487/RFC7159, March | |||
| 2014, <https://www.rfc-editor.org/info/rfc7159>. | 2014, <https://www.rfc-editor.org/info/rfc7159>. | |||
| [RFC7258] Farrell, S. and H. Tschofenig, "Pervasive Monitoring Is an | [RFC7258] Farrell, S. and H. Tschofenig, "Pervasive Monitoring Is an | |||
| Attack", BCP 188, RFC 7258, DOI 10.17487/RFC7258, May | Attack", BCP 188, RFC 7258, DOI 10.17487/RFC7258, May | |||
| skipping to change at page 17, line 22 ¶ | skipping to change at page 19, line 26 ¶ | |||
| [RFC7595] Thaler, D., Ed., Hansen, T., and T. Hardie, "Guidelines | [RFC7595] Thaler, D., Ed., Hansen, T., and T. Hardie, "Guidelines | |||
| and Registration Procedures for URI Schemes", BCP 35, | and Registration Procedures for URI Schemes", BCP 35, | |||
| RFC 7595, DOI 10.17487/RFC7595, June 2015, | RFC 7595, DOI 10.17487/RFC7595, June 2015, | |||
| <https://www.rfc-editor.org/info/rfc7595>. | <https://www.rfc-editor.org/info/rfc7595>. | |||
| [RFC7605] Touch, J., "Recommendations on Using Assigned Transport | [RFC7605] Touch, J., "Recommendations on Using Assigned Transport | |||
| Port Numbers", BCP 165, RFC 7605, DOI 10.17487/RFC7605, | Port Numbers", BCP 165, RFC 7605, DOI 10.17487/RFC7605, | |||
| August 2015, <https://www.rfc-editor.org/info/rfc7605>. | August 2015, <https://www.rfc-editor.org/info/rfc7605>. | |||
| [RFC7616] Shekh-Yusef, R., Ed., Ahrens, D., and S. Bremer, "HTTP | ||||
| Digest Access Authentication", RFC 7616, | ||||
| DOI 10.17487/RFC7616, September 2015, | ||||
| <https://www.rfc-editor.org/info/rfc7616>. | ||||
| [RFC7617] Reschke, J., "The 'Basic' HTTP Authentication Scheme", | [RFC7617] Reschke, J., "The 'Basic' HTTP Authentication Scheme", | |||
| RFC 7617, DOI 10.17487/RFC7617, September 2015, | RFC 7617, DOI 10.17487/RFC7617, September 2015, | |||
| <https://www.rfc-editor.org/info/rfc7617>. | <https://www.rfc-editor.org/info/rfc7617>. | |||
| [RFC8259] Bray, T., Ed., "The JavaScript Object Notation (JSON) Data | ||||
| Interchange Format", STD 90, RFC 8259, | ||||
| DOI 10.17487/RFC8259, December 2017, | ||||
| <https://www.rfc-editor.org/info/rfc8259>. | ||||
| [W3C.CR-secure-contexts-20160915] | [W3C.CR-secure-contexts-20160915] | |||
| West, M., "Secure Contexts", World Wide Web Consortium CR | West, M., "Secure Contexts", World Wide Web Consortium CR | |||
| CR-secure-contexts-20160915, September 2016, | CR-secure-contexts-20160915, September 2016, | |||
| <https://www.w3.org/TR/2016/CR-secure-contexts-20160915>. | <https://www.w3.org/TR/2016/CR-secure-contexts-20160915>. | |||
| [W3C.REC-xml-20081126] | ||||
| Bray, T., Paoli, J., Sperberg-McQueen, M., Maler, E., and | ||||
| F. Yergeau, "Extensible Markup Language (XML) 1.0 (Fifth | ||||
| Edition)", World Wide Web Consortium Recommendation REC- | ||||
| xml-20081126, November 2008, | ||||
| <http://www.w3.org/TR/2008/REC-xml-20081126>. | ||||
| 7.3. URIs | 7.3. URIs | |||
| [1] https://lists.w3.org/Archives/Public/ietf-http-wg/ | [1] https://lists.w3.org/Archives/Public/ietf-http-wg/ | |||
| [2] http://httpwg.github.io/ | [2] http://httpwg.github.io/ | |||
| [3] https://github.com/httpwg/http-extensions/labels/bcp56bis | [3] https://github.com/httpwg/http-extensions/labels/bcp56bis | |||
| [4] https://www.owasp.org/index.php/OWASP_Guide_Project | ||||
| Appendix A. Changes from RFC3205 | Appendix A. Changes from RFC3205 | |||
| RFC3205 captured the Best Current Practice in the early 2000's, based | RFC3205 captured the Best Current Practice in the early 2000's, based | |||
| on the concerns facing protocol designers at the time. Use of HTTP | on the concerns facing protocol designers at the time. Use of HTTP | |||
| has changed considerably since then, and as a result this document is | has changed considerably since then, and as a result this document is | |||
| substantially different. As a result, the changes are too numerous | substantially different. As a result, the changes are too numerous | |||
| to list individually. | to list individually. | |||
| Author's Address | Author's Address | |||
| End of changes. 39 change blocks. | ||||
| 80 lines changed or deleted | 199 lines changed or added | |||
This html diff was produced by rfcdiff 1.48. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ | ||||