| draft-ietf-httpbis-replay-04.txt | draft-ietf-httpbis-replay-latest.txt | |||
|---|---|---|---|---|
| HTTP Working Group M. Thomson | HTTP Working Group M. Thomson | |||
| Internet-Draft Mozilla | Internet-Draft Mozilla | |||
| Intended status: Standards Track M. Nottingham | Intended status: Standards Track M. Nottingham | |||
| Expires: December 29, 2018 Fastly | Expires: April 29, 2023 Fastly | |||
| W. Tarreau | W. Tarreau | |||
| HAProxy Technologies | HAProxy Technologies | |||
| June 27, 2018 | October 26, 2022 | |||
| Using Early Data in HTTP | Using Early Data in HTTP | |||
| draft-ietf-httpbis-replay-04 | draft-ietf-httpbis-replay-latest | |||
| Abstract | Abstract | |||
| Using TLS early data creates an exposure to the possibility of a | Using TLS early data creates an exposure to the possibility of a | |||
| replay attack. This document defines mechanisms that allow clients | replay attack. This document defines mechanisms that allow clients | |||
| to communicate with servers about HTTP requests that are sent in | to communicate with servers about HTTP requests that are sent in | |||
| early data. Techniques are described that use these mechanisms to | early data. Techniques are described that use these mechanisms to | |||
| mitigate the risk of replay. | mitigate the risk of replay. | |||
| Note to Readers | Note to Readers | |||
| skipping to change at page 1, line 49 ¶ | skipping to change at page 1, line 49 ¶ | |||
| 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 December 29, 2018. | This Internet-Draft will expire on April 29, 2023. | |||
| Copyright Notice | Copyright Notice | |||
| Copyright (c) 2018 IETF Trust and the persons identified as the | Copyright (c) 2022 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 34 ¶ | skipping to change at page 2, line 34 ¶ | |||
| 2. Early Data in HTTP . . . . . . . . . . . . . . . . . . . . . 3 | 2. Early Data in HTTP . . . . . . . . . . . . . . . . . . . . . 3 | |||
| 3. Supporting Early Data in HTTP Servers . . . . . . . . . . . . 3 | 3. Supporting Early Data in HTTP Servers . . . . . . . . . . . . 3 | |||
| 4. Using Early Data in HTTP Clients . . . . . . . . . . . . . . 5 | 4. Using Early Data in HTTP Clients . . . . . . . . . . . . . . 5 | |||
| 5. Extensions for Early Data in HTTP . . . . . . . . . . . . . . 6 | 5. Extensions for Early Data in HTTP . . . . . . . . . . . . . . 6 | |||
| 5.1. The Early-Data Header Field . . . . . . . . . . . . . . . 7 | 5.1. The Early-Data Header Field . . . . . . . . . . . . . . . 7 | |||
| 5.2. The 425 (Too Early) Status Code . . . . . . . . . . . . . 8 | 5.2. The 425 (Too Early) Status Code . . . . . . . . . . . . . 8 | |||
| 6. Security Considerations . . . . . . . . . . . . . . . . . . . 8 | 6. Security Considerations . . . . . . . . . . . . . . . . . . . 8 | |||
| 6.1. Gateways and Early Data . . . . . . . . . . . . . . . . . 9 | 6.1. Gateways and Early Data . . . . . . . . . . . . . . . . . 9 | |||
| 6.2. Consistent Handling of Early Data . . . . . . . . . . . . 9 | 6.2. Consistent Handling of Early Data . . . . . . . . . . . . 9 | |||
| 6.3. Denial of Service . . . . . . . . . . . . . . . . . . . . 9 | 6.3. Denial of Service . . . . . . . . . . . . . . . . . . . . 9 | |||
| 6.4. Out of Order Delivery . . . . . . . . . . . . . . . . . . 10 | 6.4. Out-of-Order Delivery . . . . . . . . . . . . . . . . . . 10 | |||
| 7. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 10 | 7. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 10 | |||
| 8. References . . . . . . . . . . . . . . . . . . . . . . . . . 10 | 8. References . . . . . . . . . . . . . . . . . . . . . . . . . 10 | |||
| 8.1. Normative References . . . . . . . . . . . . . . . . . . 10 | 8.1. Normative References . . . . . . . . . . . . . . . . . . 10 | |||
| 8.2. Informative References . . . . . . . . . . . . . . . . . 11 | 8.2. Informative References . . . . . . . . . . . . . . . . . 11 | |||
| 8.3. URIs . . . . . . . . . . . . . . . . . . . . . . . . . . 11 | 8.3. URIs . . . . . . . . . . . . . . . . . . . . . . . . . . 11 | |||
| Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . 12 | Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . 12 | |||
| Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 12 | Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 12 | |||
| 1. Introduction | 1. Introduction | |||
| TLS 1.3 [TLS13] introduces the concept of early data (also known as | TLS 1.3 [TLS13] introduces the concept of early data (also known as | |||
| zero round trip data or 0-RTT data). Early data allows a client to | zero round-trip time (0-RTT) data). If the client has spoken to the | |||
| send data to a server in the first round trip of a connection, | same server recently, early data allows a client to send data to a | |||
| without waiting for the TLS handshake to complete, if the client has | server in the first round trip of a connection, without waiting for | |||
| spoken to the same server recently. | the TLS handshake to complete. | |||
| When used with HTTP [HTTP], early data allows clients to send | When used with HTTP [HTTP], early data allows clients to send | |||
| requests immediately, avoiding the one or two round trip delay needed | requests immediately, thus avoiding the one or two round-trip delays | |||
| for the TLS handshake. This is a significant performance | needed for the TLS handshake. This is a significant performance | |||
| enhancement; however, it has significant limitations. | enhancement; however, it has significant limitations. | |||
| The primary risk of using early data is that an attacker might | The primary risk of using early data is that an attacker might | |||
| capture and replay the request(s) it contains. TLS [TLS13] describes | capture and replay the request(s) it contains. TLS [TLS13] describes | |||
| techniques that can be used to reduce the likelihood that an attacker | techniques that can be used to reduce the likelihood that an attacker | |||
| can successfully replay a request, but these techniques can be | can successfully replay a request, but these techniques can be | |||
| difficult to deploy, and still leave some possibility of a successful | difficult to deploy and still leave some possibility of a successful | |||
| attack. | attack. | |||
| Note that this is different from automated or user-initiated retries; | Note that this is different from automated or user-initiated retries; | |||
| replays are initiated by an attacker without the awareness of the | replays are initiated by an attacker without the awareness of the | |||
| client. | client. | |||
| To help mitigate the risk of replays in HTTP, this document gives an | To help mitigate the risk of replays in HTTP, this document gives an | |||
| overview of techniques for controlling these risks in servers, and | overview of techniques for controlling these risks in servers and | |||
| defines requirements for clients when sending requests in early data. | defines requirements for clients when sending requests in early data. | |||
| The advice in this document also applies to use of 0-RTT in HTTP over | The advice in this document also applies to use of 0-RTT in HTTP over | |||
| QUIC [HQ]. | QUIC [HQ]. | |||
| 1.1. Conventions and Definitions | 1.1. Conventions and Definitions | |||
| The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | |||
| "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | |||
| "OPTIONAL" in this document are to be interpreted as described in BCP | "OPTIONAL" in this document are to be interpreted as described in BCP | |||
| 14 [RFC2119] [RFC8174] when, and only when, they appear in all | 14 [RFC2119] [RFC8174] when, and only when, they appear in all | |||
| capitals, as shown here. | capitals, as shown here. | |||
| 2. Early Data in HTTP | 2. Early Data in HTTP | |||
| Conceptually, early data is concatenated with other application data | Conceptually, early data is concatenated with other application data | |||
| to form a single stream. This can mean that requests are entirely | to form a single stream. This can mean that requests are entirely | |||
| contained within early data, or only part of a request is early. In | contained within early data or that only part of a request is early. | |||
| a multiplexed protocol, like HTTP/2 [RFC7540] or HTTP/QUIC [HQ], | In a multiplexed protocol, like HTTP/2 [RFC7540] or HTTP/QUIC [HQ], | |||
| multiple requests might be partially delivered in early data. | multiple requests might be partially delivered in early data. | |||
| The model that this document assumes is that once the TLS handshake | The model that this document assumes is that once the TLS handshake | |||
| completes, the early data received on that TLS connection is known to | completes, the early data received on that TLS connection is known to | |||
| not be a replayed copy of that data. However, it is important to | not be a replayed copy of that data. However, it is important to | |||
| note that this does not mean that early data will not be or has not | note that this does not mean that early data will not be or has not | |||
| been replayed on another connection. | been replayed on another connection. | |||
| 3. Supporting Early Data in HTTP Servers | 3. Supporting Early Data in HTTP Servers | |||
| skipping to change at page 4, line 28 ¶ | skipping to change at page 4, line 28 ¶ | |||
| 2. The server can choose to delay processing of early data until | 2. The server can choose to delay processing of early data until | |||
| after the TLS handshake completes. By deferring processing, it | after the TLS handshake completes. By deferring processing, it | |||
| can ensure that only a successfully completed connection is used | can ensure that only a successfully completed connection is used | |||
| for the request(s) therein. This provides the server with some | for the request(s) therein. This provides the server with some | |||
| assurance that the early data was not replayed. If the server | assurance that the early data was not replayed. If the server | |||
| receives multiple requests in early data, it can determine | receives multiple requests in early data, it can determine | |||
| whether to defer HTTP processing on a per-request basis. | whether to defer HTTP processing on a per-request basis. | |||
| 3. The server can cause a client to retry individual requests and | 3. The server can cause a client to retry individual requests and | |||
| not use early data by responding with the 425 (Too Early) status | not use early data by responding with the 425 (Too Early) status | |||
| code (Section 5.2), in cases where the risk of replay is judged | code (Section 5.2) in cases where the risk of replay is judged | |||
| too great. | too great. | |||
| Any of these techniques is equally effective and a server can use the | All of these techniques are equally effective; a server can use the | |||
| method that best suits it. | method that best suits it. | |||
| For a given request, the level of tolerance to replay risk is | For a given request, the level of tolerance to replay risk is | |||
| specific to the resource it operates upon (and therefore only known | specific to the resource it operates upon (and therefore only known | |||
| to the origin server). The primary risk associated with using early | to the origin server). The primary risk associated with using early | |||
| data is in the actions a server takes when processing a request; | data is in the actions a server takes when processing a request; | |||
| processing a duplicated request might result in duplicated effects | processing a duplicated request might result in duplicated effects | |||
| and side effects. Appendix E.5 of [TLS13] also describes other | and side effects. Appendix E.5 of [TLS13] also describes other | |||
| effects produced by processing duplicated requests. | effects produced by processing duplicated requests. | |||
| The request method's safety ([RFC7231], Section 4.2.1) is one way to | The request method's safety ([RFC7231], Section 4.2.1) is one way to | |||
| determine this. However, some resources do produce side effects with | determine this. However, some resources produce side effects with | |||
| safe methods, so this cannot be universally relied upon. | safe methods, so this cannot be universally relied upon. | |||
| It is RECOMMENDED that origin servers allow resources to explicitly | It is RECOMMENDED that origin servers allow resources to explicitly | |||
| configure whether early data is appropriate in requests. Absent such | configure whether early data is appropriate in requests. Absent such | |||
| explicit information, origin servers MUST either reject early data or | explicit information, origin servers MUST either reject early data or | |||
| implement the techniques described in this document for ensuring that | implement the techniques described in this document for ensuring that | |||
| requests are not processed prior to TLS handshake completion. | requests are not processed prior to TLS handshake completion. | |||
| A request might be sent partially in early data with the remainder of | A request might be sent partially in early data with the remainder of | |||
| the request being sent after the handshake completes. This does not | the request being sent after the handshake completes. This does not | |||
| necessarily affect handling of that request; what matters is when the | necessarily affect handling of that request; what matters is when the | |||
| server starts acting upon the contents of a request. Any time any | server starts acting upon the contents of a request. Any time any | |||
| server instance might initiate processing prior to completion of the | server instance might initiate processing prior to completion of the | |||
| handshake, all server instances need to account for the possibility | handshake, all server instances need to account for the possibility | |||
| of replay of early data and how that could affect that processing | of replay of early data and how that could affect that processing | |||
| (see also Section 6.2). | (see also Section 6.2). | |||
| A server can partially process requests that are incomplete. Parsing | A server can partially process requests that are incomplete. Parsing | |||
| header fields - without acting on the values - and determining | header fields -- without acting on the values -- and determining | |||
| request routing is likely to be safe from side-effects, but other | request routing is likely to be safe from side effects but other | |||
| actions might not be. | actions might not be. | |||
| Intermediary servers do not have sufficient information to decide | Intermediary servers do not have sufficient information to decide | |||
| whether early data can be processed, so Section 5.2 describes a way | whether early data can be processed, so Section 5.2 describes a way | |||
| for the origin to signal to them that a particular request isn't | for the origin to signal to them that a particular request isn't | |||
| appropriate for early data. Intermediaries that accept early data | appropriate for early data. Intermediaries that accept early data | |||
| MUST implement that mechanism. | MUST implement that mechanism. | |||
| Note that a server cannot choose to selectively reject early data at | Note that a server cannot choose to selectively reject early data at | |||
| the TLS layer. TLS only permits a server to accept all early data, | the TLS layer. TLS only permits a server to either accept all early | |||
| or none of it. Once a server has decided to accept early data, it | data or none of it. Once a server has decided to accept early data, | |||
| MUST process all requests in early data, even if the server rejects | it MUST process all requests in early data, even if the server | |||
| the request by sending a 425 (Too Early) response. | rejects the request by sending a 425 (Too Early) response. | |||
| A server can limit the amount of early data with the | A server can limit the amount of early data with the | |||
| "max_early_data_size" field of the "early_data" TLS extension. This | "max_early_data_size" field of the "early_data" TLS extension. This | |||
| can be used to avoid committing an arbitrary amount of memory for | can be used to avoid committing an arbitrary amount of memory for | |||
| requests that it might defer until the handshake completes. | requests that it might defer until the handshake completes. | |||
| 4. Using Early Data in HTTP Clients | 4. Using Early Data in HTTP Clients | |||
| A client that wishes to use early data commences sending HTTP | A client that wishes to use early data commences by sending HTTP | |||
| requests immediately after sending the TLS ClientHello. | requests immediately after sending the TLS ClientHello. | |||
| By their nature, clients have control over whether a given request is | By their nature, clients have control over whether a given request is | |||
| sent in early data - thereby giving the client control over risk of | sent in early data, thereby giving the client control over risk of | |||
| replay. Absent other information, clients MAY send requests with | replay. Absent other information, clients MAY send requests with | |||
| safe HTTP methods (see [RFC7231], Section 4.2.1) in early data when | safe HTTP methods ([RFC7231], Section 4.2.1) in early data when it is | |||
| it is available, and MUST NOT send unsafe methods (or methods whose | available and MUST NOT send unsafe methods (or methods whose safety | |||
| safety is not known) in early data. | is not known) in early data. | |||
| If the server rejects early data at the TLS layer, a client MUST | If the server rejects early data at the TLS layer, a client MUST | |||
| start sending again as though the connection were new. This could | start sending again as though the connection were new. This could | |||
| entail using a different negotiated protocol [ALPN] than the one | entail using a different negotiated protocol [ALPN] than the one | |||
| optimistically used for the early data. Any requests sent in early | optimistically used for the early data. Any requests sent in early | |||
| data will need to be sent again, unless the client decides to abandon | data will need to be sent again, unless the client decides to abandon | |||
| those requests. | those requests. | |||
| Automatic retry creates the potential for a replay attack. An | Automatic retry creates the potential for a replay attack. An | |||
| attacker intercepts a connection that uses early data and copies the | attacker intercepts a connection that uses early data and copies the | |||
| early data to another server instance. The second server instance | early data to another server instance. The second server instance | |||
| accepts and processes the early data, even though it will not | accepts and processes the early data, even though it will not | |||
| complete the TLS handshake. The attacker then allows the original | complete the TLS handshake. The attacker then allows the original | |||
| connection to complete. Even if the early data is detected as a | connection to complete. Even if the early data is detected as a | |||
| duplicate and rejected, the first server instance might allow the | duplicate and rejected, the first server instance might allow the | |||
| connection to complete. If the client then retries requests that | connection to complete. If the client then retries requests that | |||
| were sent in early data, the request will be processed twice. | were sent in early data, the request will be processed twice. | |||
| Replays are also possible if there are multiple server instances that | Replays are also possible if there are multiple server instances that | |||
| will accept early data, or if the same server accepts early data | will accept early data or if the same server accepts early data | |||
| multiple times (though the latter would be in violation of | multiple times (though the latter would be in violation of | |||
| requirements in Section 8 of [TLS13]). | requirements in Section 8 of [TLS13]). | |||
| Clients that use early data MUST retry requests upon receipt of a 425 | Clients that use early data MUST retry requests upon receipt of a 425 | |||
| (Too Early) status code; see Section 5.2. | (Too Early) status code; see Section 5.2. | |||
| An intermediary MUST NOT use early data when forwarding a request | An intermediary MUST NOT use early data when forwarding a request | |||
| unless early data was used on a previous hop, or it knows that the | unless early data was used on a previous hop, or it knows that the | |||
| request can be retried safely without consequences (typically, using | request can be retried safely without consequences (typically, using | |||
| out-of-band configuration). Absent better information, that means | out-of-band configuration). Absent better information, that means | |||
| that an intermediary can only use early data if the request either | that an intermediary can only use early data if the request either | |||
| arrived in early data or arrived with the "Early-Data" header field | arrived in early data or arrived with the Early-Data header field set | |||
| set to "1" (see Section 5.1). | to "1" (see Section 5.1). | |||
| 5. Extensions for Early Data in HTTP | 5. Extensions for Early Data in HTTP | |||
| Because HTTP requests can span multiple "hops", it is necessary to | Because HTTP requests can span multiple "hops", it is necessary to | |||
| explicitly communicate whether a request has been sent in early data | explicitly communicate whether a request has been sent in early data | |||
| on a previous hop. Likewise, some means of explicitly triggering a | on a previous hop. Likewise, it is necessary to have some means of | |||
| retry when early data is not desirable is necessary. Finally, it is | explicitly triggering a retry when early data is not desired. | |||
| necessary to know whether the client will actually perform such a | Finally, it is necessary to know whether the client will actually | |||
| retry. | perform such a retry. | |||
| To meet these needs, two signalling mechanisms are defined: | To meet these needs, two signaling mechanisms are defined: | |||
| o The "Early-Data" header field is included in requests that might | o The Early-Data header field is included in requests that might | |||
| have been forwarded by an intermediary prior to the TLS handshake | have been forwarded by an intermediary prior to the completion of | |||
| with its client completing. | the TLS handshake with its client. | |||
| o The 425 (Too Early) status code is defined for a server to | o The 425 (Too Early) status code is defined for a server to | |||
| indicate that a request could not be processed due to the | indicate that a request could not be processed due to the | |||
| consequences of a possible replay attack. | consequences of a possible replay attack. | |||
| They are designed to enable better coordination of the use of early | They are designed to enable better coordination of the use of early | |||
| data between the user agent and origin server, and also when a | data between the user agent and origin server, and also when a | |||
| gateway (also "reverse proxy", "Content Delivery Network", or | gateway (also "reverse proxy", "Content Delivery Network", or | |||
| "surrogate") is present. | "surrogate") is present. | |||
| Gateways typically don't have specific information about whether a | Gateways typically don't have specific information about whether a | |||
| given request can be processed safely when it is sent in early data. | given request can be processed safely when it is sent in early data. | |||
| In many cases, only the origin server has the necessary information | In many cases, only the origin server has the necessary information | |||
| to decide whether the risk of replay is acceptable. These extensions | to decide whether the risk of replay is acceptable. These extensions | |||
| allow coordination between a gateway and its origin server. | allow coordination between a gateway and its origin server. | |||
| 5.1. The Early-Data Header Field | 5.1. The Early-Data Header Field | |||
| The "Early-Data" request header field indicates that the request has | The Early-Data request header field indicates that the request has | |||
| been conveyed in early data, and additionally indicates that a client | been conveyed in early data and that a client understands the 425 | |||
| understands the 425 (Too Early) status code. | (Too Early) status code. | |||
| It has just one valid value: "1". Its syntax is defined by the | It has just one valid value: "1". Its syntax is defined by the | |||
| following ABNF [ABNF]: | following ABNF [ABNF]: | |||
| Early-Data = "1" | Early-Data = "1" | |||
| For example: | For example: | |||
| GET /resource HTTP/1.0 | GET /resource HTTP/1.0 | |||
| Host: example.com | Host: example.com | |||
| Early-Data: 1 | Early-Data: 1 | |||
| An intermediary that forwards a request prior to the completion of | An intermediary that forwards a request prior to the completion of | |||
| the TLS handshake with its client MUST send it with the "Early-Data" | the TLS handshake with its client MUST send it with the Early-Data | |||
| header field set to "1" (i.e., it adds it if not present in the | header field set to "1" (i.e., it adds it if not present in the | |||
| request). An intermediary MUST use the "Early-Data" header field if | request). An intermediary MUST use the Early-Data header field if | |||
| it - or another instance (see Section 6.2) - could have forwarded the | the request might have been subject to a replay and might already | |||
| request prior to handshake completion if circumstances were | have been forwarded by it or another instance (see Section 6.2). | |||
| different. | ||||
| An intermediary MUST NOT remove this header field if it is present in | An intermediary MUST NOT remove this header field if it is present in | |||
| a request. "Early-Data" MUST NOT appear in a "Connection" header | a request. Early-Data MUST NOT appear in a Connection header field. | |||
| field. | ||||
| The "Early-Data" header field is not intended for use by user agents | The Early-Data header field is not intended for use by user agents | |||
| (that is, the original initiator of a request). Sending a request in | (that is, the original initiator of a request). Sending a request in | |||
| early data implies that the client understands this specification and | early data implies that the client understands this specification and | |||
| is willing to retry a request in response to a 425 (Too Early) status | is willing to retry a request in response to a 425 (Too Early) status | |||
| code. A user agent that sends a request in early data does not need | code. A user agent that sends a request in early data does not need | |||
| to include the "Early-Data" header field. | to include the Early-Data header field. | |||
| A server cannot make a request that contains the Early-Data header | A server cannot make a request that contains the Early-Data header | |||
| field safe for processing by waiting for the handshake to complete. | field safe for processing by waiting for the handshake to complete. | |||
| A request that is marked with Early-Data was sent in early data on a | A request that is marked with Early-Data was sent in early data on a | |||
| previous hop. Requests that contain the Early-Data field and cannot | previous hop. Requests that contain the Early-Data header field and | |||
| be safely processed MUST be rejected using the 425 (Too Early) status | cannot be safely processed MUST be rejected using the 425 (Too Early) | |||
| code. | status code. | |||
| The "Early-Data" header field carries a single bit of information and | The Early-Data header field carries a single bit of information, and | |||
| clients MUST include at most one instance. Multiple or invalid | clients MUST include at most one instance. Multiple or invalid | |||
| instances of the header field MUST be treated as equivalent to a | instances of the header field MUST be treated as equivalent to a | |||
| single instance with a value of 1 by a server. | single instance with a value of 1 by a server. | |||
| A "Early-Data" header field MUST NOT be included in responses or | An Early-Data header field MUST NOT be included in responses or | |||
| request trailers. | request trailers. | |||
| 5.2. The 425 (Too Early) Status Code | 5.2. The 425 (Too Early) Status Code | |||
| A 425 (Too Early) status code indicates that the server is unwilling | A 425 (Too Early) status code indicates that the server is unwilling | |||
| to risk processing a request that might be replayed. | to risk processing a request that might be replayed. | |||
| User agents that send a request in early data are expected to retry | User agents that send a request in early data are expected to retry | |||
| the request when receiving a 425 (Too Early) response status code. A | the request when receiving a 425 (Too Early) response status code. A | |||
| user agent MAY do so automatically, but any retries MUST NOT be sent | user agent SHOULD retry automatically, but any retries MUST NOT be | |||
| in early data. | sent in early data. | |||
| In all cases, an intermediary can forward a 425 (Too Early) status | In all cases, an intermediary can forward a 425 (Too Early) status | |||
| code. Intermediaries MUST forward a 425 (Too Early) status code if | code. Intermediaries MUST forward a 425 (Too Early) status code if | |||
| the request that it received and forwarded contained an "Early-Data" | the request that it received and forwarded contained an Early-Data | |||
| header field. Otherwise, an intermediary that receives a request in | header field. Otherwise, an intermediary that receives a request in | |||
| early data MAY automatically retry that request in response to a 425 | early data MAY automatically retry that request in response to a 425 | |||
| (Too Early) status code, but it MUST wait for the TLS handshake to | (Too Early) status code, but it MUST wait for the TLS handshake to | |||
| complete on the connection where it received the request. | complete on the connection where it received the request. | |||
| The server cannot assume that a client is able to retry a request | The server cannot assume that a client is able to retry a request | |||
| unless the request is received in early data or the "Early-Data" | unless the request is received in early data or the Early-Data header | |||
| header field is set to "1". A server SHOULD NOT emit the 425 status | field is set to "1". A server SHOULD NOT emit the 425 status code | |||
| code unless one of these conditions is met. | unless one of these conditions is met. | |||
| The 425 (Too Early) status code is not cacheable by default. Its | The 425 (Too Early) status code is not cacheable by default. Its | |||
| payload is not the representation of any identified resource. | payload is not the representation of any identified resource. | |||
| 6. Security Considerations | 6. Security Considerations | |||
| Using early data exposes a client to the risk that their request is | Using early data exposes a client to the risk that their request is | |||
| replayed. A retried or replayed request can produce different side | replayed. A retried or replayed request can produce different side | |||
| effects on the server. In addition to those side effects, replays | effects on the server. In addition to those side effects, replays | |||
| and retries might be used for traffic analysis to recover information | and retries might be used for traffic analysis to recover information | |||
| about requests or the resources those requests target. In | about requests or the resources those requests target. In | |||
| particular, a request that is replayed might result in a different | particular, a request that is replayed might result in a different | |||
| response, which might be observable from the length of protected data | response, which might be observable from the length of protected data | |||
| even if the content remains confidential. | even if the content remains confidential. | |||
| 6.1. Gateways and Early Data | 6.1. Gateways and Early Data | |||
| A gateway MUST NOT forward requests that were received in early data | A gateway MUST NOT forward requests that were received in early data | |||
| unless it knows that the origin server it will forward to understands | unless it knows that the origin server it will forward to understands | |||
| the "Early-Data" header field and will correctly generate a 425 (Too | the Early-Data header field and will correctly generate a 425 (Too | |||
| Early) status code. A gateway that is uncertain about origin server | Early) status code. A gateway that is uncertain about origin server | |||
| support for a given request SHOULD either delay forwarding the | support for a given request SHOULD either delay forwarding the | |||
| request until the TLS handshake with its client completes, or send a | request until the TLS handshake with its client completes or send a | |||
| 425 (Too Early) status code in response. | 425 (Too Early) status code in response. | |||
| A gateway without at least one potential origin server that supports | A gateway without at least one potential origin server that supports | |||
| "Early-Data" header field expends significant effort for what can at | the Early-Data header field expends significant effort for what can | |||
| best be a modest performance benefit from enabling early data. If no | at best be a modest performance benefit from enabling early data. If | |||
| origin server supports early data, disabling early data entirely is | no origin server supports early data, it is more efficient to disable | |||
| more efficient. | early data entirely. | |||
| 6.2. Consistent Handling of Early Data | 6.2. Consistent Handling of Early Data | |||
| Consistent treatment of a request that arrives in - or partially in - | Consistent treatment of a request that arrives in, or partially in, | |||
| early data is critical to avoiding inappropriate processing of | early data is critical to avoiding inappropriate processing of | |||
| replayed requests. If a request is not safe to process before the | replayed requests. If a request is not safe to process before the | |||
| TLS handshake completes, then all instances of the server (including | TLS handshake completes, then all instances of the server (including | |||
| gateways) need to agree and either reject the request or delay | gateways) need to agree and either reject the request or delay | |||
| processing. | processing. | |||
| Disabling early data, delaying requests, or rejecting requests with | Disabling early data, delaying requests, or rejecting requests with | |||
| the 425 (Too Early) status code are all equally good measures for | the 425 (Too Early) status code are all equally good measures for | |||
| mitigating replay attacks on requests that might be vulnerable to | mitigating replay attacks on requests that might be vulnerable to | |||
| replay. Server instances can implement any of these measures and be | replay. Server instances can implement any of these measures and be | |||
| considered to be consistent, even if different instances use | considered consistent, even if different instances use different | |||
| different methods. Critically, this means that it is possible to | methods. Critically, this means that it is possible to employ | |||
| employ different mitigations in reaction to other conditions, such as | different mitigations in reaction to other conditions, such as server | |||
| server load. | load. | |||
| A server MUST NOT act on early data before the handshake completes if | A server MUST NOT act on early data before the handshake completes if | |||
| it and any other server instance could make a different decision | it and any other server instance could make a different decision | |||
| about how to handle the same data. | about how to handle the same data. | |||
| 6.3. Denial of Service | 6.3. Denial of Service | |||
| Accepting early data exposes a server to potential denial of service | Accepting early data exposes a server to potential denial of service | |||
| through the replay of requests that are expensive to handle. A | through the replay of requests that are expensive to handle. A | |||
| server that is under load SHOULD prefer rejecting TLS early data as a | server that is under load SHOULD prefer rejecting TLS early data as a | |||
| whole rather than accepting early data and selectively processing | whole rather than accepting early data and selectively processing | |||
| requests. Generating a 503 (Service Unavailable) or 425 (Too Early) | requests. Generating a 503 (Service Unavailable) or 425 (Too Early) | |||
| status code often leads to clients retrying requests, which could | status code often leads to clients retrying requests, which could | |||
| result in increased load. | result in increased load. | |||
| 6.4. Out of Order Delivery | 6.4. Out-of-Order Delivery | |||
| In protocols that deliver data out of order (such as QUIC [HQ]) early | In protocols that deliver data out of order (such as QUIC [HQ]), | |||
| data can arrive after the handshake completes. A server MAY process | early data can arrive after the handshake completes. A server MAY | |||
| requests received in early data after handshake completion only if it | process requests received in early data after handshake completion | |||
| can rely on other instances correctly handling replays of the same | only if it can rely on other instances correctly handling replays of | |||
| requests. | the same requests. | |||
| 7. IANA Considerations | 7. IANA Considerations | |||
| This document registers the "Early-Data" header field in the "Message | This document registers the Early-Data header field in the "Permanent | |||
| Headers" registry located at https://www.iana.org/assignments/ | Message Header Field Names" registry located at | |||
| message-headers [4]. | <https://www.iana.org/assignments/message-headers>. | |||
| Header field name: Early-Data | Header field name: Early-Data | |||
| Applicable protocol: http | Applicable protocol: http | |||
| Status: standard | Status: standard | |||
| Author/Change controller: IETF | Author/Change controller: IETF | |||
| Specification document(s): This document | Specification document(s): This document | |||
| Related information: (empty) | Related information: (empty) | |||
| This document registers the 425 (Too Early) status code in the | This document registers the 425 (Too Early) status code in the "HTTP | |||
| "Hypertext Transfer Protocol (HTTP) Status Code" registry located at | Status Codes" registry located at <https://www.iana.org/assignments/ | |||
| https://www.iana.org/assignments/http-status-codes [5]. | http-status-codes>. | |||
| Value: 425 | Value: 425 | |||
| Description: Too Early | Description: Too Early | |||
| Reference: This document | Reference: This document | |||
| 8. References | 8. References | |||
| 8.1. Normative References | 8.1. Normative References | |||
| skipping to change at page 11, line 25 ¶ | skipping to change at page 11, line 25 ¶ | |||
| [RFC7231] Fielding, R., Ed. and J. Reschke, Ed., "Hypertext Transfer | [RFC7231] Fielding, R., Ed. and J. Reschke, Ed., "Hypertext Transfer | |||
| Protocol (HTTP/1.1): Semantics and Content", RFC 7231, | Protocol (HTTP/1.1): Semantics and Content", RFC 7231, | |||
| DOI 10.17487/RFC7231, June 2014, | DOI 10.17487/RFC7231, June 2014, | |||
| <https://www.rfc-editor.org/info/rfc7231>. | <https://www.rfc-editor.org/info/rfc7231>. | |||
| [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC | [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC | |||
| 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>. | |||
| [TLS13] Rescorla, E., "The Transport Layer Security (TLS) Protocol | [TLS13] Rescorla, E., "The Transport Layer Security (TLS) Protocol | |||
| Version 1.3", draft-ietf-tls-tls13-28 (work in progress), | Version 1.3", RFC 8446, DOI 10.17487/RFC8446, August 2018, | |||
| March 2018. | <https://www.rfc-editor.org/info/rfc8446>. | |||
| 8.2. Informative References | 8.2. Informative References | |||
| [ALPN] Friedl, S., Popov, A., Langley, A., and E. Stephan, | [ALPN] Friedl, S., Popov, A., Langley, A., and E. Stephan, | |||
| "Transport Layer Security (TLS) Application-Layer Protocol | "Transport Layer Security (TLS) Application-Layer Protocol | |||
| Negotiation Extension", RFC 7301, DOI 10.17487/RFC7301, | Negotiation Extension", RFC 7301, DOI 10.17487/RFC7301, | |||
| July 2014, <https://www.rfc-editor.org/info/rfc7301>. | July 2014, <https://www.rfc-editor.org/info/rfc7301>. | |||
| [HQ] Bishop, M., "Hypertext Transfer Protocol (HTTP) over | [HQ] Bishop, M., "HTTP/3", draft-ietf-quic-http-34 (work in | |||
| QUIC", draft-ietf-quic-http-13 (work in progress), June | progress), February 2021. | |||
| 2018. | ||||
| [RFC7540] Belshe, M., Peon, R., and M. Thomson, Ed., "Hypertext | [RFC7540] Belshe, M., Peon, R., and M. Thomson, Ed., "Hypertext | |||
| Transfer Protocol Version 2 (HTTP/2)", RFC 7540, | Transfer Protocol Version 2 (HTTP/2)", RFC 7540, | |||
| DOI 10.17487/RFC7540, May 2015, | DOI 10.17487/RFC7540, May 2015, | |||
| <https://www.rfc-editor.org/info/rfc7540>. | <https://www.rfc-editor.org/info/rfc7540>. | |||
| 8.3. URIs | 8.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/replay | [3] https://github.com/httpwg/http-extensions/labels/replay | |||
| [4] https://www.iana.org/assignments/message-headers | ||||
| [5] https://www.iana.org/assignments/http-status-codes | ||||
| Acknowledgments | Acknowledgments | |||
| This document was not easy to produce. The following people made | This document was not easy to produce. The following people made | |||
| substantial contributions to the quality and completeness of the | substantial contributions to the quality and completeness of the | |||
| document: David Benjamin, Subodh Iyengar, Benjamin Kaduk, Ilari | document: David Benjamin, Subodh Iyengar, Benjamin Kaduk, Ilari | |||
| Liusavaara, Kazuho Oku, Eric Rescorla, Kyle Rose, and Victor | Liusavaara, Kazuho Oku, Eric Rescorla, Kyle Rose, and Victor | |||
| Vasiliev. | Vasiliev. | |||
| Authors' Addresses | Authors' Addresses | |||
| End of changes. 49 change blocks. | ||||
| 96 lines changed or deleted | 90 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/ | ||||