RFC 8887: A JSON Meta Application Protocol (JMAP) Subprotocol for WebSocket
- K. Murchison
Abstract
This document defines a binding for the JSON Meta Application Protocol (JMAP) over a WebSocket transport layer. The WebSocket binding for JMAP provides higher performance than the current HTTP binding for JMAP.¶
Status of This Memo
This is an Internet Standards Track document.¶
This document is a product of the Internet Engineering Task Force (IETF). It represents the consensus of the IETF community. It has received public review and has been approved for publication by the Internet Engineering Steering Group (IESG). Further information on Internet Standards is available in Section 2 of RFC 7841.¶
Information about the current status of this document, any
errata, and how to provide feedback on it may be obtained at
https://
Copyright Notice
Copyright (c) 2020 IETF Trust and the persons identified as the document authors. All rights reserved.¶
This document is subject to BCP 78 and the IETF Trust's Legal
Provisions Relating to IETF Documents
(https://
1. Introduction
JMAP [RFC8620]
over HTTP [RFC7235] requires that
every JMAP API request be authenticated.
Depending on the type of authentication used by
the JMAP client and the configuration of the JMAP server,
authentication could be an expensive operation both in time and
resources. In such circumstances, reauthenticatin
The WebSocket [RFC6455] binding for JMAP eliminates this performance hit by authenticating just the WebSocket handshake request and having those credentials remain in effect for the duration of the WebSocket connection. This binding supports JMAP API requests and responses, with optional support for push notifications.¶
Furthermore, the WebSocket binding for JMAP can optionally compress [RFC7692] both JMAP API requests and responses. Although compression of HTTP responses is ubiquitous, compression of HTTP requests has very low, if any, deployment and therefore isn't a viable option for JMAP API requests over HTTP.¶
2. Conventions Used in This Document
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all capitals, as shown here.¶
This document uses the terminology defined in the core JMAP specification [RFC8620].¶
3. Discovering Support for JMAP over WebSocket
The JMAP capabilities object is returned as part of the
standard JMAP Session object (see
Section 2 of [RFC8620]).
Servers supporting this specification MUST add a property named
"urn
Example:¶
4. JMAP Subprotocol
The term WebSocket subprotocol refers to an application
4.1. Authentication
A JMAP WebSocket connection is authenticated by presenting a user's credentials in the HTTP request [RFC7235] that initiates the WebSocket handshake. See Section 8.2 of [RFC8620] for recommendations regarding the selection of HTTP authentication schemes.¶
4.2. Handshake
The JMAP WebSocket client and JMAP WebSocket server negotiate the use of the WebSocket JMAP subprotocol during the WebSocket handshake, either via an HTTP/1.1 Upgrade request (see Section 4 of [RFC6455]) or an HTTP/2 Extended CONNECT request (see Section 5 of [RFC8441]). The WebSocket JMAP subprotocol is also intended to run over future bindings of HTTP (e.g., HTTP/3) provided that there is a defined mechanism for performing a WebSocket handshake over that binding.¶
Regardless of the method used for the WebSocket handshake,
the client MUST first perform a TLS handshake on a
JMAP WebSocket URL endpoint (Section 3)
having the "wss://" scheme (WebSocket over TLS) in
accordance with the requirements of running the particular
binding of HTTP over TLS (see [RFC2818]
and Section 4.1 of [RFC6455] for HTTP/1.1
and Section 9.2 of [RFC7540] for HTTP/2).
If the TLS handshake fails, the client MUST close the
connection. Otherwise, the client MUST make an
authenticated HTTP request [RFC7235]
on the encrypted connection and MUST include the value "jmap"
in the list of protocols for the "Sec
The reply from the server MUST also contain a
corresponding "Sec
Once the handshake has successfully completed, the WebSocket connection is established and can be used for JMAP API requests, responses, and optional push notifications. Other message types MUST NOT be transmitted over this connection.¶
The credentials used for authenticating the HTTP request to initiate the handshake remain in effect for the duration of the WebSocket connection. If the authentication credentials for the user expire, the server can either treat subsequent requests as if they are unauthenticated or close the WebSocket connection. In the latter case, the server MAY send a Close frame with a status code of 1008 (Policy Violation), as defined in Section 7.4.1 of [RFC6455].¶
4.3. WebSocket Messages
Data frame messages in the JMAP subprotocol MUST be
text frames and contain UTF-8 encoded data. The messages MUST
be in the form of a single JMAP Request object (see
Section 3.3 of [RFC8620]),
JMAP Web
Note that fragmented WebSocket messages (split over multiple text frames) MUST be coalesced prior to parsing them as JSON objects.¶
4.3.1. Handling Invalid Data
If a client or server receives a binary frame, the endpoint can either ignore the frame or close the WebSocket connection. In the latter case, the endpoint MAY send a Close frame with a status code of 1003 (Unsupported Data), as defined in Section 7.4.1 of [RFC6455].¶
If a client receives a message that is not in the form of a JSON Problem Details object, a JMAP Response object, or a JMAP StateChange object, the client can either ignore the message or close the WebSocket connection. In the latter case, the endpoint MAY send a Close frame with a status code of 1007 (Invalid frame payload data), as defined in Section 7.4.1 of [RFC6455].¶
A server MUST return an appropriate JSON Problem Details object (Section 4.3.4) for any request-level errors (e.g., an invalid JMAP object, an unsupported capability or method call, or exceeding a server request limit).¶
4.3.2. JMAP Requests
The specification extends the Request object with two additional arguments when used over a WebSocket:¶
JMAP over WebSocket allows the server to process requests
out of order. The client
Additionally, the "max
4.3.3. JMAP Responses
The specification extends the Response object with two additional arguments when used over a WebSocket:¶
4.3.4. JMAP Request-Level Errors
The specification extends the Problem Details object for request-level errors (see Section 3.6.1 of [RFC8620]) with two additional arguments when used over a WebSocket:¶
4.3.5. JMAP Push Notifications
JMAP
4.3.5.1. Notification Format
All push notifications take the form of a standard StateChange object (see Section 7.1 of [RFC8620]).¶
The specification extends the StateChange object with one additional argument when used over a WebSocket:¶
4.3.5.2. Enabling Notifications
A client enables push notifications from the server for
the current connection by
sending a Web
4.3.5.3. Disabling Notifications
A client disables push notifications from the server
for the current connection by
sending a Web
4.4. Examples
The following examples show WebSocket JMAP opening handshakes, a JMAP Core/echo request and response, and a subsequent closing handshake. The examples assume that the JMAP WebSocket URL endpoint has been advertised in the JMAP Session object as having a path of "/jmap/ws/" and that TLS negotiation has already succeeded. Note that folding of header fields is for editorial purposes only.¶
WebSocket JMAP connection via HTTP/1.1 with push notifications for mail [RFC8621] is enabled. This example assumes that the client has cached pushState "aaa" from a previous connection.¶
WebSocket JMAP connection on an HTTP/2 stream that also negotiates compression [RFC7692]:¶
5. Security Considerations
The security considerations for both WebSocket (see Section 10 of [RFC6455]) and JMAP (see Section 8 of [RFC8620]) apply to the WebSocket JMAP subprotocol. Specific security considerations are described below.¶
5.1. Connection Confidentiality and Integrity
To ensure the confidentiality and integrity of data sent and received via JMAP over WebSocket, the WebSocket connection MUST use TLS 1.2 [RFC5246] or later, following the recommendations in BCP 195 [RFC7525]. Servers SHOULD support TLS 1.3 [RFC8446] or later.¶
5.2. Non-browser Clients
JMAP over WebSocket can be used by clients both running inside and outside of a web browser. As such, the security considerations in Sections 10.2 and 10.1 of [RFC6455] apply to those respective environments.¶
6. IANA Considerations
6.1. Registration of the WebSocket JMAP Subprotocol
Per this specification, IANA has registered the following in the "WebSocket Subprotocol Name Registry" within the "WebSocket Protocol Registries".¶
7. References
7.1. Normative References
- [RFC2119]
-
Bradner, S., "Key words for use in RFCs to Indicate Requirement Levels", BCP 14, RFC 2119, DOI 10
.17487 , , <https:///RFC2119 www >..rfc -editor .org /info /rfc2119 - [RFC2818]
-
Rescorla, E., "HTTP Over TLS", RFC 2818, DOI 10
.17487 , , <https:///RFC2818 www >..rfc -editor .org /info /rfc2818 - [RFC5246]
-
Dierks, T. and E. Rescorla, "The Transport Layer Security (TLS) Protocol Version 1.2", RFC 5246, DOI 10
.17487 , , <https:///RFC5246 www >..rfc -editor .org /info /rfc5246 - [RFC6455]
-
Fette, I. and A. Melnikov, "The WebSocket Protocol", RFC 6455, DOI 10
.17487 , , <https:///RFC6455 www >..rfc -editor .org /info /rfc6455 - [RFC7235]
-
Fielding, R., Ed. and J. Reschke, Ed., "Hypertext Transfer Protocol (HTTP/1.1): Authentication", RFC 7235, DOI 10
.17487 , , <https:///RFC7235 www >..rfc -editor .org /info /rfc7235 - [RFC7525]
-
Sheffer, Y., Holz, R., and P. Saint-Andre, "Recommendations for Secure Use of Transport Layer Security (TLS) and Datagram Transport Layer Security (DTLS)", BCP 195, RFC 7525, DOI 10
.17487 , , <https:///RFC7525 www >..rfc -editor .org /info /rfc7525 - [RFC7540]
-
Belshe, M., Peon, R., and M. Thomson, Ed., "Hypertext Transfer Protocol Version 2 (HTTP/2)", RFC 7540, DOI 10
.17487 , , <https:///RFC7540 www >..rfc -editor .org /info /rfc7540 - [RFC7692]
-
Yoshino, T., "Compression Extensions for WebSocket", RFC 7692, DOI 10
.17487 , , <https:///RFC7692 www >..rfc -editor .org /info /rfc7692 - [RFC8174]
-
Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words", BCP 14, RFC 8174, DOI 10
.17487 , , <https:///RFC8174 www >..rfc -editor .org /info /rfc8174 - [RFC8441]
-
McManus, P., "Bootstrapping WebSockets with HTTP/2", RFC 8441, DOI 10
.17487 , , <https:///RFC8441 www >..rfc -editor .org /info /rfc8441 - [RFC8446]
-
Rescorla, E., "The Transport Layer Security (TLS) Protocol Version 1.3", RFC 8446, DOI 10
.17487 , , <https:///RFC8446 www >..rfc -editor .org /info /rfc8446 - [RFC8620]
-
Jenkins, N. and C. Newman, "The JSON Meta Application Protocol (JMAP)", RFC 8620, DOI 10
.17487 , , <https:///RFC8620 www >..rfc -editor .org /info /rfc8620
7.2. Informative References
- [RFC8621]
-
Jenkins, N. and C. Newman, "The JSON Meta Application Protocol (JMAP) for Mail", RFC 8621, DOI 10
.17487 , , <https:///RFC8621 www >..rfc -editor .org /info /rfc8621
Acknowledgments
The author would like to thank the following individuals for contributing their ideas and support for writing this specification: Neil Jenkins, Robert Mueller, and Chris Newman.¶