| < draft-jones-json-web-token-00.txt | draft-jones-json-web-token-01.txt > | |||
|---|---|---|---|---|
| Network Working Group M. Jones | Network Working Group M. Jones | |||
| Internet-Draft Microsoft | Internet-Draft Microsoft | |||
| Intended status: Standards Track D. Balfanz | Intended status: Standards Track D. Balfanz | |||
| Expires: July 1, 2011 Google | Expires: July 8, 2011 Google | |||
| J. Bradley | J. Bradley | |||
| independent | independent | |||
| Y. Goland | Y. Goland | |||
| Microsoft | Microsoft | |||
| J. Panzer | J. Panzer | |||
| N. Sakimura | N. Sakimura | |||
| Nomura Research Institute | Nomura Research Institute | |||
| December 28, 2010 | P. Tarjan | |||
| January 04, 2011 | ||||
| JSON Web Token (JWT) | JSON Web Token (JWT) - Claims and Signing | |||
| draft-jones-json-web-token-00 | draft-jones-json-web-token-01 | |||
| Abstract | Abstract | |||
| JSON Web Token (JWT) defines a token format that can encode claims | JSON Web Token (JWT) is a means of representing signed content using | |||
| transferred between two parties. The claims in a JWT are encoded as | JSON data structures, including claims to be transferred between two | |||
| a JSON object that is digitally signed. | parties. The claims in a JWT are encoded as a JSON object that is | |||
| digitally signed and optionally encrypted. Encryption for JWTs is | ||||
| described in a separate companion specification. | ||||
| The suggested pronunciation of JWT is the same as the English word | ||||
| "jot". | ||||
| Requirements Language | Requirements Language | |||
| The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | |||
| "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this | "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this | |||
| document are to be interpreted as described in RFC 2119 [RFC2119]. | document are to be interpreted as described in RFC 2119 [RFC2119]. | |||
| Status of this Memo | Status of this Memo | |||
| This Internet-Draft is submitted in full conformance with the | This Internet-Draft is submitted in full conformance with the | |||
| skipping to change at page 1, line 47 ¶ | skipping to change at page 2, line 8 ¶ | |||
| 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 http://datatracker.ietf.org/drafts/current/. | Drafts is at http://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 July 1, 2011. | This Internet-Draft will expire on July 8, 2011. | |||
| Copyright Notice | Copyright Notice | |||
| Copyright (c) 2010 IETF Trust and the persons identified as the | ||||
| Copyright (c) 2011 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 | |||
| (http://trustee.ietf.org/license-info) in effect on the date of | (http://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 | |||
| described in the Simplified BSD License. | described in the Simplified BSD License. | |||
| Table of Contents | Table of Contents | |||
| 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . 5 | 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . 5 | |||
| 2. Terminology . . . . . . . . . . . . . . . . . . . . . . . . . 5 | 2. Terminology . . . . . . . . . . . . . . . . . . . . . . . . . 5 | |||
| 3. JSON Web Token (JWT) Overview . . . . . . . . . . . . . . . . 6 | 3. JSON Web Token (JWT) Overview . . . . . . . . . . . . . . . . 7 | |||
| 3.1. Example JWT . . . . . . . . . . . . . . . . . . . . . . . 6 | 3.1. Example JWT . . . . . . . . . . . . . . . . . . . . . . . 7 | |||
| 4. JWT Claims . . . . . . . . . . . . . . . . . . . . . . . . . . 7 | 4. JWT Claims . . . . . . . . . . . . . . . . . . . . . . . . . . 8 | |||
| 4.1. Reserved Claim Names . . . . . . . . . . . . . . . . . . . 7 | 4.1. Reserved Claim Names . . . . . . . . . . . . . . . . . . . 8 | |||
| 4.2. Public Claim Names . . . . . . . . . . . . . . . . . . . . 9 | 4.2. Public Claim Names . . . . . . . . . . . . . . . . . . . . 10 | |||
| 4.3. Private Claim Names . . . . . . . . . . . . . . . . . . . 9 | 4.3. Private Claim Names . . . . . . . . . . . . . . . . . . . 11 | |||
| 5. JWT Envelope . . . . . . . . . . . . . . . . . . . . . . . . . 10 | 5. JWT Header . . . . . . . . . . . . . . . . . . . . . . . . . . 11 | |||
| 5.1. Reserved Envelope Parameter Names . . . . . . . . . . . . 10 | 5.1. Reserved Header Parameter Names . . . . . . . . . . . . . 11 | |||
| 5.2. Public Envelope Parameter Names . . . . . . . . . . . . . 12 | 5.2. Public Header Parameter Names . . . . . . . . . . . . . . 13 | |||
| 5.3. Private Envelope Parameter Names . . . . . . . . . . . . . 12 | 5.3. Private Header Parameter Names . . . . . . . . . . . . . . 13 | |||
| 6. General Rules for Creating and Validating a JWT . . . . . . . 12 | 6. Rules for Creating and Validating a JWT . . . . . . . . . . . 13 | |||
| 7. Base64url encoding as used by JWTs . . . . . . . . . . . . . . 14 | 7. Base64url encoding as used by JWTs . . . . . . . . . . . . . . 17 | |||
| 8. Signing JWTs with Cryptographic Algorithms . . . . . . . . . . 15 | 8. Signing JWTs with Cryptographic Algorithms . . . . . . . . . . 17 | |||
| 8.1. Signing a JWT with HMAC SHA-256 . . . . . . . . . . . . . 15 | 8.1. Signing a JWT with HMAC SHA-256 . . . . . . . . . . . . . 18 | |||
| 8.2. Signing a JWT with RSA SHA-256 . . . . . . . . . . . . . . 16 | 8.2. Signing a JWT with RSA SHA-256 . . . . . . . . . . . . . . 19 | |||
| 8.3. Signing a JWT with ECDSA P-256 SHA-256 . . . . . . . . . . 17 | 8.3. Signing a JWT with ECDSA P-256 SHA-256 . . . . . . . . . . 20 | |||
| 8.4. Additional Algorithms . . . . . . . . . . . . . . . . . . 19 | 8.4. Additional Algorithms . . . . . . . . . . . . . . . . . . 21 | |||
| 9. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 19 | 9. JWT Serialization Formats . . . . . . . . . . . . . . . . . . 21 | |||
| 10. Security Considerations . . . . . . . . . . . . . . . . . . . 20 | 9.1. JWT Compact Serialization . . . . . . . . . . . . . . . . 21 | |||
| 10.1. Unicode Comparison Security Issues . . . . . . . . . . . . 20 | 9.2. JWT JSON Serialization . . . . . . . . . . . . . . . . . . 22 | |||
| 11. Open Issues . . . . . . . . . . . . . . . . . . . . . . . . . 21 | 10. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 22 | |||
| 12. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . 21 | 11. Security Considerations . . . . . . . . . . . . . . . . . . . 23 | |||
| 13. Appendix - Non-Normative - JWT Examples . . . . . . . . . . . 21 | 11.1. Unicode Comparison Security Issues . . . . . . . . . . . . 23 | |||
| 13.1. JWT using HMAC SHA-256 . . . . . . . . . . . . . . . . . . 21 | 12. Open Issues and Things To Be Done (TBD) . . . . . . . . . . . 24 | |||
| 13.1.1. Encoding . . . . . . . . . . . . . . . . . . . . . . 21 | 13. References . . . . . . . . . . . . . . . . . . . . . . . . . . 26 | |||
| 13.1.2. Decoding . . . . . . . . . . . . . . . . . . . . . . 23 | 13.1. Normative References . . . . . . . . . . . . . . . . . . . 26 | |||
| 13.1.3. Validating . . . . . . . . . . . . . . . . . . . . . 23 | 13.2. Informative References . . . . . . . . . . . . . . . . . . 27 | |||
| 13.2. JWT using RSA SHA-256 . . . . . . . . . . . . . . . . . . 23 | Appendix A. JWT Examples . . . . . . . . . . . . . . . . . . . . 27 | |||
| 13.2.1. Encoding . . . . . . . . . . . . . . . . . . . . . . 23 | A.1. JWT using HMAC SHA-256 . . . . . . . . . . . . . . . . . . 27 | |||
| 13.2.2. Decoding . . . . . . . . . . . . . . . . . . . . . . 26 | A.1.1. Encoding . . . . . . . . . . . . . . . . . . . . . . . 28 | |||
| 13.2.3. Validating . . . . . . . . . . . . . . . . . . . . . 27 | A.1.2. Decoding . . . . . . . . . . . . . . . . . . . . . . . 29 | |||
| 13.3. JWT using ECDSA P-256 SHA-256 . . . . . . . . . . . . . . 27 | A.1.3. Validating . . . . . . . . . . . . . . . . . . . . . . 30 | |||
| 13.3.1. Encoding . . . . . . . . . . . . . . . . . . . . . . 27 | A.2. JWT using RSA SHA-256 . . . . . . . . . . . . . . . . . . 30 | |||
| 13.3.2. Decoding . . . . . . . . . . . . . . . . . . . . . . 29 | A.2.1. Encoding . . . . . . . . . . . . . . . . . . . . . . . 30 | |||
| 13.3.3. Validating . . . . . . . . . . . . . . . . . . . . . 29 | A.2.2. Decoding . . . . . . . . . . . . . . . . . . . . . . . 34 | |||
| 14. Appendix - Non-Normative - Notes on implementing base64url | A.2.3. Validating . . . . . . . . . . . . . . . . . . . . . . 35 | |||
| encoding without padding . . . . . . . . . . . . . . . . . . . 29 | A.3. JWT using ECDSA P-256 SHA-256 . . . . . . . . . . . . . . 35 | |||
| 15. Appendix - Non-Normative - Relationship of JWTs to SAML | A.3.1. Encoding . . . . . . . . . . . . . . . . . . . . . . . 35 | |||
| Tokens . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 | A.3.2. Decoding . . . . . . . . . . . . . . . . . . . . . . . 37 | |||
| 16. Appendix - Non-Normative - Relationship of JWTs to Simple | A.3.3. Validating . . . . . . . . . . . . . . . . . . . . . . 37 | |||
| Web Tokens (SWTs) . . . . . . . . . . . . . . . . . . . . . . 31 | A.4. JWT using JSON Serialization . . . . . . . . . . . . . . . 38 | |||
| 17. References . . . . . . . . . . . . . . . . . . . . . . . . . . 31 | A.4.1. Encoding . . . . . . . . . . . . . . . . . . . . . . . 38 | |||
| 17.1. Normative References . . . . . . . . . . . . . . . . . . . 31 | A.4.2. Decoding . . . . . . . . . . . . . . . . . . . . . . . 39 | |||
| 17.2. Informative References . . . . . . . . . . . . . . . . . . 32 | A.4.3. Validating . . . . . . . . . . . . . . . . . . . . . . 39 | |||
| Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . . 33 | Appendix B. Notes on implementing base64url encoding without | |||
| padding . . . . . . . . . . . . . . . . . . . . . . . 39 | ||||
| Appendix C. Relationship of JWTs to SAML Tokens . . . . . . . . . 40 | ||||
| Appendix D. Relationship of JWTs to Simple Web Tokens (SWTs) . . 41 | ||||
| Appendix E. Acknowledgements . . . . . . . . . . . . . . . . . . 41 | ||||
| Appendix F. Document History . . . . . . . . . . . . . . . . . . 41 | ||||
| Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . . 42 | ||||
| 1. Introduction | 1. Introduction | |||
| JSON Web Token (JWT) is a simple token format intended for space | JSON Web Token (JWT) is a compact token format intended for space | |||
| constrained environments such as HTTP Authorization headers and URI | constrained environments such as HTTP Authorization headers and URI | |||
| query parameters. JWTs encode the claims to be transmitted as a JSON | query parameters. JWTs encode claims to be transmitted as a JSON | |||
| object (as defined in RFC 4627 [RFC4627]) that is base64url encoded | object (as defined in RFC 4627 [RFC4627]) that is base64url encoded | |||
| and digitally signed. | and digitally signed. The JWT signature mechanisms are independent | |||
| of the type of content being signed, allowing arbitrary content to be | ||||
| signed. Encryption for JWTs is described in a separate companion | ||||
| specification. | ||||
| The suggested pronunciation of JWT is the same as the English word | The suggested pronunciation of JWT is the same as the English word | |||
| "jot". | "jot". | |||
| 2. Terminology | 2. Terminology | |||
| JSON Web Token (JWT) A string consisting of three JWT Token | JSON Web Token (JWT) A data structure containing three JWT Token | |||
| Segments: the JWT Envelope Segment, the JWT Claim Segment, and the | Segments: the JWT Header Segment, the JWT Payload Segment, and the | |||
| JWT Crypto Segment, in that order, with the segments being | JWT Crypto Segment. The JWT Payload Segment typically represents | |||
| separated by period ('.') characters. | a set of claims convened by the JWT as a JSON object, but in the | |||
| general case, may represent arbitrary signed content. | ||||
| JWT Compact Serialization A data structure representing a JWT as a | ||||
| string consisting of three JWT Token Segments: the JWT Header | ||||
| Segment, the JWT Payload Segment, and the JWT Crypto Segment, in | ||||
| that order, with the segments being separated by period ('.') | ||||
| characters. | ||||
| JWT JSON Serialization A data structure representing a JWT as a JSON | ||||
| object with members for each of three kinds of JWT Token Segments: | ||||
| a "header" member whose value is a non-empty array of JWT Header | ||||
| Segments, a "payload" member whose value is the JWT Payload | ||||
| Segment, and a "signature" member whose value is a non-empty array | ||||
| of JWT Crypto Segments, where the cardinality of both arrays is | ||||
| the same. | ||||
| JWT Token Segment One of the three parts that make up a JSON Web | JWT Token Segment One of the three parts that make up a JSON Web | |||
| Token (JWT). JWT Token Segments are always base64url encoded | Token (JWT). JWT Token Segments are always base64url encoded | |||
| values. | values. | |||
| JWT Envelope Segment A JWT Token Segment containing a base64url | JWT Header Segment A JWT Token Segment containing a base64url | |||
| encoded JSON object that describes the signature applied to the | encoded JSON object that describes the signature applied to the | |||
| JWT Claim Segment. | JWT Header Segment and the JWT Payload Segment. | |||
| JWT Claim Segment A JWT Token Segment containing a base64url encoded | JWT Payload Segment A JWT Token Segment containing base64url encoded | |||
| JSON object that encodes the claims represented by the JWT. | content. This may be a JWT Claims Object. | |||
| JWT Crypto Segment A JWT Token Segment containing base64url encoded | JWT Crypto Segment A JWT Token Segment containing base64url encoded | |||
| cryptographic signature material that secures the JWT Crypto | cryptographic signature material that secures the JWT Header | |||
| Segment's contents. | Segment's and the JWT Payload Segment's contents. | |||
| Decoded JWT Envelope Segment A JWT Envelope Segment that has been | Decoded JWT Header Segment A JWT Header Segment that has been | |||
| base64url decoded back into a JSON object. | base64url decoded back into a JSON object. | |||
| Decoded JWT Claim Segment A JWT Claim Segment that has been | Decoded JWT Payload Segment A JWT Payload Segment that has been | |||
| base64url decoded back into a JSON object. | base64url decoded. If the corresponding JWT Payload Segment is a | |||
| JWT Claims Object, this will be a Decoded JWT Claims Object. | ||||
| Decoded JWT Crypto Segment A JWT Crypto Segment that has been | Decoded JWT Crypto Segment A JWT Crypto Segment that has been | |||
| base64url decoded back into cryptographic material. | base64url decoded back into cryptographic material. | |||
| JWT Claims Object A base64url encoded JSON object that represents | ||||
| the claims contained in the JWT. | ||||
| Decoded JWT Claims Object A JSON object that represents the claims | ||||
| contained in the JWT. | ||||
| JWT Signing Input The concatenation of the JWT Header Segment, a | ||||
| period ('.') character, and the JWT Payload Segment. | ||||
| Digital Signature For the purposes of this specification, we use | ||||
| this term to encompass both Hash-based Message Authentication | ||||
| Codes (HMACs), which can provide authenticity but not non- | ||||
| repudiation, and digital signatures using public key algorithms, | ||||
| which can provide both. Readers should be aware of this | ||||
| distinction, despite the decision to use a single term for both | ||||
| concepts to improve readability of the specification. | ||||
| Base64url Encoding For the purposes of this specification, this term | Base64url Encoding For the purposes of this specification, this term | |||
| always refers to the he URL- and filename-safe Base64 encoding | always refers to the he URL- and filename-safe Base64 encoding | |||
| described in RFC 4648 [RFC4648], Section 5, with the '=' padding | described in RFC 4648 [RFC4648], Section 5, with the '=' padding | |||
| characters omitted, as permitted by Section 3.2; see Section 7 for | characters omitted, as permitted by Section 3.2; see Section 7 for | |||
| more details. | more details. | |||
| Header Parameter Names The names of the members within the JSON | ||||
| object represented in a JWT Header Segment. | ||||
| Header Parameter Values The values of the members within the JSON | ||||
| object represented in a JWT Header Segment. | ||||
| Claim Names The names of the members of the JSON object represented | ||||
| in a JWT Claims Object. | ||||
| Claim Values The values of the members of the JSON object | ||||
| represented in a JWT Claims Object. | ||||
| 3. JSON Web Token (JWT) Overview | 3. JSON Web Token (JWT) Overview | |||
| JWTs represent a set of claims as a JSON object that is base64url | JWTs represent content that is base64url encoded and digitally | |||
| encoded and digitally signed. As per RFC 4627 [RFC4627] Section 2.2, | signed, and optionally encrypted, using JSON data structures; this | |||
| the JSON object consists of zero or more name/value pairs (or | content is typically a set of claims represented as a JSON object. | |||
| members), where the names are strings and the values are arbitrary | ||||
| JSON values. These members are the claims represented by the JWT. | ||||
| The JSON object is base64url encoded to produce the JWT Claim | ||||
| Segment. An accompanying base64url encoded JSON envelope object | ||||
| describes the signature method used. | ||||
| The names within the object MUST be unique. The names within the | When the JWT payload is a set of claims, the claims are represented | |||
| JSON object are referred to as Claim Names. The corresponding values | as name/value pairs that are members of a JSON object. The JSON | |||
| are referred to as Claim Values. | object is base64url encoded to produce the JWT Claims Object, which | |||
| is used as the JWT Payload Segment. An accompanying base64url | ||||
| encoded JSON header - the JWT Header Segment - describes the | ||||
| signature method used. | ||||
| The names within the header object MUST be unique. The names within | ||||
| the header object are referred to as Header Parameter Names. The | ||||
| corresponding values are referred to as Header Parameter Values. | ||||
| Likewise, if the payload represents a JWT Claims Object, the names | ||||
| within the claims object MUST be unique. The names within the claims | ||||
| object are referred to as Claim Names. The corresponding values are | ||||
| referred to as Claim Values. | ||||
| JWTs contain a signature that ensures the integrity of the content of | JWTs contain a signature that ensures the integrity of the content of | |||
| the JSON Claim Segment. This signature value is carried in the JWT | the JWT Header Segment and the JWT Payload Segment. This signature | |||
| Crypto Segment. The JSON Envelope object MUST contain an "alg" | value is carried in the JWT Crypto Segment. The JSON Header object | |||
| parameter, the value of which is a string that unambiguously | MUST contain an "alg" parameter, the value of which is a string that | |||
| identifies the algorithm used to sign the JWT Claim Segment to | unambiguously identifies the algorithm used to sign the JWT Header | |||
| produce the JWT Crypto Segment. | Segment and the JWT Payload Segment to produce the JWT Crypto | |||
| Segment. | ||||
| 3.1. Example JWT | 3.1. Example JWT | |||
| The following is an example of a JSON object that can be encoded to | The following is an example of a JSON object that can be encoded to | |||
| produce a JWT: | produce a JWT Claims Object: | |||
| {"iss":"joe", | {"iss":"joe", | |||
| "exp":1300819380, | "exp":1300819380, | |||
| "http://example.com/is_root":true} | "http://example.com/is_root":true} | |||
| Base64url encoding the UTF-8 representation of the JSON object yields | Base64url encoding the UTF-8 representation of the JSON object yields | |||
| this JWT Claim Segment value: | this JWT Claims Object, which is used as the JWT Payload Segment: | |||
| eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ | eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ | |||
| The following example JSON header object declares that the encoded | ||||
| The following example JSON envelope object declares that the encoded | object is a JSON Web Token (JWT) and the JWT Header Segment and the | |||
| object is a JSON Web Token (JWT) and the JWT Claim Segment is signed | JWT Payload Segment are signed using the HMAC SHA-256 algorithm: | |||
| using the HMAC SHA-256 algorithm: | ||||
| {"typ":"JWT", | {"typ":"JWT", | |||
| "alg":"HS256"} | "alg":"HS256"} | |||
| Base64url encoding the UTF-8 representation of the JSON envelope | Base64url encoding the UTF-8 representation of the JSON header object | |||
| object yields this JWT Envelope Segment value: | yields this JWT Header Segment value: | |||
| eyJ0eXAiOiJKV1QiLA0KICJhbGciOiJIUzI1NiJ9 | eyJ0eXAiOiJKV1QiLA0KICJhbGciOiJIUzI1NiJ9 | |||
| Signing the JWT Claim Segment with the HMAC SHA-256 algorithm and | Signing the UTF-8 representation of the JWT Signing Input (the | |||
| concatenation of the JWT Header Segment, a period ('.') character, | ||||
| and the JWT Payload Segment) with the HMAC SHA-256 algorithm and | ||||
| base64url encoding the result, as per Section 8.1, yields this JWT | base64url encoding the result, as per Section 8.1, yields this JWT | |||
| Crypto Segment value: | Crypto Segment value: | |||
| 35usWj9X8HwGS-CDcx1JP2NmqcrLwZ4EKp8sNThf3cY | dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk | |||
| Combining these segments in the order Envelope.Claims.Signature with | ||||
| period characters between the segments yields this complete JWT (with | Concatenating these segments in the order Header.Payload.Signature | |||
| line breaks for display purposes only): | with period characters between the segments yields this complete JWT | |||
| using the JWT Compact Serialization (with line breaks for display | ||||
| purposes only): | ||||
| eyJ0eXAiOiJKV1QiLA0KICJhbGciOiJIUzI1NiJ9 | eyJ0eXAiOiJKV1QiLA0KICJhbGciOiJIUzI1NiJ9 | |||
| . | . | |||
| eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ | eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ | |||
| . | . | |||
| 35usWj9X8HwGS-CDcx1JP2NmqcrLwZ4EKp8sNThf3cY | dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk | |||
| This computation is illustrated in more detail in Section 13.1. | This computation is illustrated in more detail in Appendix A.1. | |||
| 4. JWT Claims | 4. JWT Claims | |||
| The members of the JSON object represented by the Decoded JWT Claim | If the JWT contains a set of claims represented as a JSON object, | |||
| Segment contain the claims. Note however, that the set of claims a | then the members of the JSON object represented by the Decoded JWT | |||
| JWT must contain to be considered valid is context-dependent and is | Claims Object decoded from the JWT Payload Segment contain the | |||
| outside the scope of this specification. | claims. Note however, that the set of claims a JWT must contain to | |||
| be considered valid is context-dependent and is outside the scope of | ||||
| this specification. When used in a security-related context, | ||||
| implementations MUST understand and support all of the claims | ||||
| present; otherwise, the JWT MUST be rejected for processing. | ||||
| There are three classes of JWT Claim Names: Reserved Claim Names, | There are three classes of JWT Claim Names: Reserved Claim Names, | |||
| Public Claim Names, and Private Claim Names. | Public Claim Names, and Private Claim Names. | |||
| 4.1. Reserved Claim Names | 4.1. Reserved Claim Names | |||
| The following claim names are reserved. None of the claims defined | The following claim names are reserved. None of the claims defined | |||
| in the table below are intended to be mandatory, but rather, provide | in the table below are intended to be mandatory, but rather, provide | |||
| a starting point for a set of useful, interoperable claims. All the | a starting point for a set of useful, interoperable claims. All the | |||
| names are short because a core goal of JWTs is for the tokens | names are short because a core goal of JWTs is for the tokens | |||
| skipping to change at page 8, line 33 ¶ | skipping to change at page 9, line 36 ¶ | |||
| | | | | claim is OPTIONAL. | | | | | | claim is OPTIONAL. | | |||
| | iss | string | StringAndURI | The "iss" (issuer) claim | | | iss | string | StringAndURI | The "iss" (issuer) claim | | |||
| | | | | identifies the principal that | | | | | | identifies the principal that | | |||
| | | | | issued the JWT. The processing | | | | | | issued the JWT. The processing | | |||
| | | | | of this claim is generally | | | | | | of this claim is generally | | |||
| | | | | application specific. This | | | | | | application specific. This | | |||
| | | | | claim is OPTIONAL. | | | | | | claim is OPTIONAL. | | |||
| | aud | string | StringAndURI | The "aud" (audience) claim | | | aud | string | StringAndURI | The "aud" (audience) claim | | |||
| | | | | identifies the audience that the | | | | | | identifies the audience that the | | |||
| | | | | JWT is intended for. The | | | | | | JWT is intended for. The | | |||
| | | | | processing of this claim | | | | | | principal intended to process | | |||
| | | | | requires that if a JWT consumer | | | | | | the JWT MUST be identified by | | |||
| | | | | receives a JWT with an "aud" | | | | | | the value of the audience claim. | | |||
| | | | | value that does not identify | | | | | | If the principal processing the | | |||
| | | | | itself as the JWT audience, then | | | | | | claim does not identify itself | | |||
| | | | | the JWT MUST be rejected. The | | | | | | with the identifier in the "aud" | | |||
| | | | | interpretation of the audience | | | | | | claim value then the JWT MUST be | | |||
| | | | | rejected. The interpretation of | | ||||
| | | | | the contents of the audience | | ||||
| | | | | value is generally application | | | | | | value is generally application | | |||
| | | | | specific. This claim is | | | | | | specific. This claim is | | |||
| | | | | OPTIONAL. | | | | | | OPTIONAL. | | |||
| | typ | string | StringAndURI | The "typ" (type) claim is used | | | typ | string | String | The "typ" (type) claim is used | | |||
| | | | | to declare a type for the | | | | | | to declare a type for the | | |||
| | | | | contents this JWT. The value | | | | | | contents of this JWT. This | | |||
| | | | | MAY be a MIME [RFC2045] type. | | | | | | claim is OPTIONAL. | | |||
| | | | | This claim is OPTIONAL. | | ||||
| +-------+---------+--------------+----------------------------------+ | +-------+---------+--------------+----------------------------------+ | |||
| Table 1: Reserved Claim Definitions | Table 1: Reserved Claim Definitions | |||
| Additional reserved claim names MAY be defined via the IANA JSON Web | Additional reserved claim names MAY be defined via the IANA JSON Web | |||
| Token Claims registry, as per Section 9. The syntaxes referred to | Token Claims registry, as per Section 10. The syntax values used | |||
| above are: | above and in Table 3 are defined as follows: | |||
| +--------------+----------------------------------------------------+ | +--------------+----------------------------------------------------+ | |||
| | Syntax Name | Syntax Definition | | | Syntax Name | Syntax Definition | | |||
| +--------------+----------------------------------------------------+ | +--------------+----------------------------------------------------+ | |||
| | StringAndURI | Any string value MAY be used but a value | | ||||
| | | containing a ":" character MUST be a URI as | | ||||
| | | defined in RFC 3986 [RFC3986]. | | ||||
| | URI | A URI as defined in RFC 3986 [RFC3986]. | | ||||
| | IntDate | The number of seconds from 1970-01-01T0:0:0Z as | | | IntDate | The number of seconds from 1970-01-01T0:0:0Z as | | |||
| | | measured in UTC until the desired date/time. See | | | | measured in UTC until the desired date/time. See | | |||
| | | RFC 3339 [RFC3339] for details regarding | | | | RFC 3339 [RFC3339] for details regarding | | |||
| | | date/times in general and UTC in particular. | | | | date/times in general and UTC in particular. | | |||
| | String | Any string value MAY be used. | | ||||
| | StringAndURI | Any string value MAY be used but a value | | ||||
| | | containing a ":" character MUST be a URI as | | ||||
| | | defined in RFC 3986 [RFC3986]. | | ||||
| | URI | A URI as defined in RFC 3986 [RFC3986]. | | ||||
| | URL | A URL as defined in RFC 1738 [RFC1738]. | | ||||
| +--------------+----------------------------------------------------+ | +--------------+----------------------------------------------------+ | |||
| Table 2 | Table 2 | |||
| 4.2. Public Claim Names | 4.2. Public Claim Names | |||
| Claim names can be defined at will by those using JWTs. However, in | Claim names can be defined at will by those using JWTs. However, in | |||
| order to prevent collisions, any new claim name SHOULD either be | order to prevent collisions, any new claim name SHOULD either be | |||
| defined in the IANA JSON Web Token Claims registry or be defined as a | defined in the IANA JSON Web Token Claims registry or be defined as a | |||
| URI that contains a collision resistant namespace. Examples of | URI that contains a collision resistant namespace. Examples of | |||
| skipping to change at page 10, line 5 ¶ | skipping to change at page 11, line 12 ¶ | |||
| precautions to make sure they are in control of the part of the | precautions to make sure they are in control of the part of the | |||
| namespace they use to define the claim name. | namespace they use to define the claim name. | |||
| 4.3. Private Claim Names | 4.3. Private Claim Names | |||
| A producer and consumer of a JWT may agree to any claim name that is | A producer and consumer of a JWT may agree to any claim name that is | |||
| not a Reserved Name Section 4.1 or a Public Name Section 4.2. Unlike | not a Reserved Name Section 4.1 or a Public Name Section 4.2. Unlike | |||
| Public Names, these private names are subject to collision and should | Public Names, these private names are subject to collision and should | |||
| be used with caution. | be used with caution. | |||
| 5. JWT Envelope | 5. JWT Header | |||
| The members of the JSON object represented by the Decoded JWT | The members of the JSON object represented by the Decoded JWT Header | |||
| Envelope Segment describe the signature applied to the JWT Claim | Segment describe the signature applied to the JWT Header Segment and | |||
| Segment and optionally additional properties of the JWT. | the JWT Payload Segment and optionally additional properties of the | |||
| Implementations MUST understand the entire contents of the envelope; | JWT. Implementations MUST understand the entire contents of the | |||
| otherwise, the JWT MUST be rejected for processing. | header; otherwise, the JWT MUST be rejected for processing. | |||
| 5.1. Reserved Envelope Parameter Names | 5.1. Reserved Header Parameter Names | |||
| The following envelope parameter names are reserved. All the names | The following header parameter names are reserved. All the names are | |||
| are short because a core goal of JWTs is for the tokens themselves to | short because a core goal of JWTs is for the tokens themselves to be | |||
| be short. | short. | |||
| +-----------+--------+--------------+-------------------------------+ | +-----------+--------+--------------+-------------------------------+ | |||
| | Envelope | JSON | Envelope | Envelope Parameter Semantics | | | Header | JSON | Header | Header Parameter Semantics | | |||
| | Parameter | Value | Parameter | | | | Parameter | Value | Parameter | | | |||
| | Name | Type | Syntax | | | | Name | Type | Syntax | | | |||
| +-----------+--------+--------------+-------------------------------+ | +-----------+--------+--------------+-------------------------------+ | |||
| | alg | string | StringAndURI | The "alg" (algorithm) | | | alg | string | StringAndURI | The "alg" (algorithm) header | | |||
| | | | | envelope parameter identifies | | | | | | parameter identifies the | | |||
| | | | | the cryptographic algorithm | | | | | | cryptographic algorithm used | | |||
| | | | | used to secure the JWT. A | | | | | | to secure the JWT. A list of | | |||
| | | | | list of reserved alg values | | | | | | reserved alg values is in | | |||
| | | | | is in Table 4. The | | | | | | Table 4. The processing of | | |||
| | | | | processing of the "alg" | | | | | | the "alg" (algorithm) header | | |||
| | | | | (algorithm) envelope | | ||||
| | | | | parameter, if present, | | | | | | parameter, if present, | | |||
| | | | | requires that the value of | | | | | | requires that the value of | | |||
| | | | | the "alg" envelope parameter | | | | | | the "alg" header parameter | | |||
| | | | | MUST be one that is both | | | | | | MUST be one that is both | | |||
| | | | | supported and for which there | | | | | | supported and for which there | | |||
| | | | | exists a key for use with | | | | | | exists a key for use with | | |||
| | | | | that algorithm associated | | | | | | that algorithm associated | | |||
| | | | | with the issuer of the JWT. | | | | | | with the issuer of the JWT. | | |||
| | | | | Note however, that if the | | | | | | This header parameter is | | |||
| | | | | "iss" (issuer) claim is not | | | | | | REQUIRED. | | |||
| | | | | included in the JWT Claim | | | typ | string | String | The "typ" (type) header | | |||
| | | | | Segment, then the manner in | | ||||
| | | | | which the issuer is | | ||||
| | | | | determined is application | | ||||
| | | | | specific. This envelope | | ||||
| | | | | parameter is REQUIRED. | | ||||
| | typ | string | StringAndURI | The "typ" (type) envelope | | ||||
| | | | | parameter is used to declare | | | | | | parameter is used to declare | | |||
| | | | | that this data structure is a | | | | | | that this data structure is a | | |||
| | | | | JWT. If a "typ" parameter is | | | | | | JWT. If a "typ" parameter is | | |||
| | | | | present, its value MUST be | | | | | | present, it is RECOMMENDED | | |||
| | | | | "JWT". This envelope | | | | | | that its value be "JWT". | | |||
| | | | | parameter is OPTIONAL. | | | | | | This header parameter is | | |||
| | | | | (Non-normative note: Other | | | | | | OPTIONAL. | | |||
| | | | | values could be used by other | | | jku | string | URL | The "jku" (JSON Key URL) | | |||
| | | | | specifications to declare | | | | | | header parameter is a URL | | |||
| | | | | data structures other than | | | | | | that points to JSON-encoded | | |||
| | | | | JWTs, for instance, encrypted | | | | | | public key certificates that | | |||
| | | | | JSON tokens.) | | | | | | can be used to validate the | | |||
| | keyid | string | String | The "keyid" (key ID) envelope | | | | | | signature. The specification | | |||
| | | | | for this encoding is TBD. | | ||||
| | | | | This header parameter is | | ||||
| | | | | OPTIONAL. | | ||||
| | kid | string | String | The "kid" (key ID) header | | ||||
| | | | | parameter is a hint | | | | | | parameter is a hint | | |||
| | | | | indicating which specific key | | | | | | indicating which specific key | | |||
| | | | | owned by the signer should be | | | | | | owned by the signer should be | | |||
| | | | | used to validate the | | | | | | used to validate the | | |||
| | | | | signature. This allows | | | | | | signature. This allows | | |||
| | | | | signers to explicitly signal | | | | | | signers to explicitly signal | | |||
| | | | | a change of key to | | | | | | a change of key to | | |||
| | | | | recipients. Omitting this | | | | | | recipients. Omitting this | | |||
| | | | | parameter is equivalent to | | | | | | parameter is equivalent to | | |||
| | | | | setting it to an empty | | | | | | setting it to an empty | | |||
| | | | | string. The format of this | | | | | | string. The interpretation | | |||
| | | | | of the contents of the "kid" | | ||||
| | | | | parameter is unspecified. | | | | | | parameter is unspecified. | | |||
| | | | | This envelope parameter is | | | | | | This header parameter is | | |||
| | | | | OPTIONAL. | | | | | | OPTIONAL. | | |||
| | curi | string | URI | The "curi" (certificates URI) | | | x5u | string | URL | The "x5u" (X.509 URL) header | | |||
| | | | | envelope parameter is a URI | | | | | | parameter is a URL that | | |||
| | | | | that points to X.509 public | | | | | | points to an X.509 public key | | |||
| | | | | key certificates that can be | | | | | | certificate that can be used | | |||
| | | | | used to validate the | | | | | | to validate the signature. | | |||
| | | | | signature. This envelope | | | | | | This certificate MUST conform | | |||
| | | | | parameter is OPTIONAL. | | | | | | to RFC 5280 [RFC5280]. This | | |||
| | ctp | string | String | The "ctp" (certificate | | | | | | header parameter is OPTIONAL. | | |||
| | | | | thumbprint) envelope | | | x5t | string | String | The "x5t" (x.509 certificate | | |||
| | | | | parameter provides a | | | | | | thumbprint) header parameter | | |||
| | | | | base64url encoded SHA-1 | | | | | | provides a base64url encoded | | |||
| | | | | thumbprint of the DER | | | | | | SHA-256 thumbprint (a.k.a. | | |||
| | | | | encoding of a certificate | | | | | | digest) of the DER encoding | | |||
| | | | | that can be used to validate | | | | | | of an X.509 certificate that | | |||
| | | | | the signature. This envelope | | | | | | can be used to match a | | |||
| | | | | certificate. This header | | ||||
| | | | | parameter is OPTIONAL. | | | | | | parameter is OPTIONAL. | | |||
| +-----------+--------+--------------+-------------------------------+ | +-----------+--------+--------------+-------------------------------+ | |||
| Table 3: Reserved Envelope Parameter Definitions | Table 3: Reserved Header Parameter Definitions | |||
| Additional reserved envelope parameter names MAY be defined via the | Additional reserved header parameter names MAY be defined via the | |||
| IANA JSON Web Token Envelope Parameters registry, as per Section 9. | IANA JSON Web Token Header Parameters registry, as per Section 10. | |||
| The envelope value syntaxes referred to above are defined in Table 2. | The syntax values used above and in Table 1 are defined in Table 2. | |||
| 5.2. Public Envelope Parameter Names | 5.2. Public Header Parameter Names | |||
| Additional envelope parameter names can be defined by those using | Additional header parameter names can be defined by those using JWTs. | |||
| JWTs. However, in order to prevent collisions, any new envelope | However, in order to prevent collisions, any new header parameter | |||
| parameter name or algorithm value SHOULD either be defined in the | name or algorithm value SHOULD either be defined in the IANA JSON Web | |||
| IANA JSON Web Token Envelope Parameters registry or be defined as a | Token Header Parameters registry or be defined as a URI that contains | |||
| URI that contains a collision resistant namespace. In each case, the | a collision resistant namespace. In each case, the definer of the | |||
| definer of the name or value MUST take reasonable precautions to make | name or value MUST take reasonable precautions to make sure they are | |||
| sure they are in control of the part of the namespace they use to | in control of the part of the namespace they use to define the header | |||
| define the envelope parameter name. | parameter name. | |||
| New envelope parameters should be introduced sparingly, as they can | New header parameters should be introduced sparingly, as they can | |||
| result in non-interoperable JWTs. Nonetheless, some extensions | result in non-interoperable JWTs. Nonetheless, some extensions | |||
| needed for some use cases may require them, such as an extension to | needed for some use cases may require them, such as an extension to | |||
| enable the inclusion of multiple signatures. | enable the inclusion of multiple signatures. | |||
| 5.3. Private Envelope Parameter Names | 5.3. Private Header Parameter Names | |||
| A producer and consumer of a JWT may agree to any envelope parameter | A producer and consumer of a JWT may agree to any header parameter | |||
| name that is not a Reserved Name Section 5.1 or a Public Name | name that is not a Reserved Name Section 5.1 or a Public Name | |||
| Section 5.2. Unlike Public Names, these private names are subject to | Section 5.2. Unlike Public Names, these private names are subject to | |||
| collision and should be used with caution. | collision and should be used with caution. | |||
| New envelope parameters should be introduced sparingly, as they can | New header parameters should be introduced sparingly, as they can | |||
| result in non-interoperable JWTs. | result in non-interoperable JWTs. | |||
| 6. General Rules for Creating and Validating a JWT | 6. Rules for Creating and Validating a JWT | |||
| To create a JWT one MUST follow these steps: | To create a JWT one MUST follow these steps: | |||
| 1. Create a JSON object containing the desired claims. Note that | 1. Create the payload content to be encoded as the Decoded JWT | |||
| white space is explicitly allowed in the representation and no | Payload Segment. If the payload represents a JWT Claims Object, | |||
| canonicalization is performed before encoding. | then these steps for creating the Decoded JWT Payload Segment | |||
| also apply: | ||||
| 2. Translate this JSON object's Unicode code points into UTF-8, as | * Create a JSON object containing the desired claims. Note that | |||
| defined in RFC 3629 [RFC3629]. | white space is explicitly allowed in the representation and no | |||
| canonicalization is performed before encoding. | ||||
| 3. Base64url encode the UTF-8 representation of this JSON object as | * Translate this JSON object's Unicode code points into UTF-8, | |||
| defined in this specification (without padding). This encoding | as defined in RFC 3629 [RFC3629]. This is the Decoded JWT | |||
| becomes the JWT Claim Segment. | Payload Segment. | |||
| 4. Create a different JSON object containing the desired envelope | 2. Base64url encode the Decoded JWT Payload Segment. This encoding | |||
| becomes the JWT Payload Segment. | ||||
| 3. Create a JSON object containing a set of desired header | ||||
| parameters. Note that white space is explicitly allowed in the | parameters. Note that white space is explicitly allowed in the | |||
| representation and no canonicalization is performed before | representation and no canonicalization is performed before | |||
| encoding. | encoding. | |||
| 5. Translate this JSON object's Unicode code points into UTF-8, as | 4. Translate this JSON object's Unicode code points into UTF-8, as | |||
| defined in RFC 3629 [RFC3629]. | defined in RFC 3629 [RFC3629]. | |||
| 6. Base64url encode the UTF-8 representation of this JSON object as | 5. Base64url encode the UTF-8 representation of this JSON object as | |||
| defined in this specification (without padding). This encoding | defined in this specification (without padding). This encoding | |||
| becomes the JWT Envelope Segment. | becomes a JWT Header Segment. | |||
| 7. Construct the JWT Crypto Segment as defined for the particular | 6. Construct a JWT Crypto Segment as defined for the particular | |||
| algorithm being used. The "alg" envelope parameter MUST be | algorithm being used. The JWT Signing Input is always the | |||
| present in the JSON Envelope Segment, with the algorithm value | concatenation of a JWT Header Segment, a period ('.') character, | |||
| and the JWT Payload Segment. The "alg" header parameter MUST be | ||||
| present in the JSON Header Segment, with the algorithm value | ||||
| accurately representing the algorithm used to construct the JWT | accurately representing the algorithm used to construct the JWT | |||
| Crypto Segment. | Crypto Segment. | |||
| 8. Combine the JWT Envelope Segment, the JWT Claim Segment and then | 7. If the JWT Compact Serialization is being used, then: | |||
| the JWT Crypto Segment in that order, separating each by period | ||||
| characters, to create the JWT. | * Concatenate the JWT Header Segment, the JWT Payload Segment | |||
| and then the JWT Crypto Segment in that order, separating each | ||||
| by period characters, to create the JWT. | ||||
| Else if the JWT JSON Serialization is being used, then: | ||||
| * Create a JSON object with these three members: a "header" | ||||
| member whose value is an array of JWT Header Segments, a | ||||
| "payload" member whose value is the JWT Payload Segment, and a | ||||
| "signature" member whose value is an array of JWT Crypto | ||||
| Segments. | ||||
| * If more than one signature is present, then repeat steps 3 | ||||
| through 6 for each header and crypto segment to produce | ||||
| additional values for the header and signature arrays. | ||||
| * The header and signature arrays must have the same number of | ||||
| values, with each header value and corresponding signature | ||||
| value being located at the same array index. | ||||
| When validating a JWT the following steps MUST be taken. If any of | When validating a JWT the following steps MUST be taken. If any of | |||
| the listed steps fails then the token MUST be rejected for | the listed steps fails then the token MUST be rejected for | |||
| processing. | processing. | |||
| 1. The JWT MUST contain two period characters. | 1. If the JWT Compact Serialization is being used, then: | |||
| 2. The JWT MUST be split on the two period characters resulting in | * The JWT MUST contain two period characters. | |||
| three non-empty segments. The first segment is the JWT Envelope | ||||
| Segment; the second is the JWT Claim Segment; the third is the | ||||
| JWT Crypto Segment. | ||||
| 3. The JWT Envelope Segment MUST be successfully base64url decoded | * The JWT MUST be split on the two period characters resulting | |||
| following the restriction given in this spec that no padding | in three non-empty segments. The first segment is the JWT | |||
| characters may have been used. | Header Segment; the second is the JWT Payload Segment; the | |||
| third is the JWT Crypto Segment. | ||||
| 4. The Decoded JWT Envelope Segment MUST be completely valid JSON | Else if the JWT JSON Serialization is being used, then: | |||
| syntax. | ||||
| 5. The JWT Claim Segment MUST be successfully base64url decoded | * The JSON MUST contain the three members "header", "payload", | |||
| following the restriction given in this spec that no padding | and "signature" and MAY contain others, which MUST be ignored. | |||
| characters may have been used. | The payload member MUST be a string and the header and | |||
| signature members MUST be non-empty arrays of strings with | ||||
| equal cardinality. | ||||
| 6. The Decoded JWT Claim Segment MUST be completely valid JSON | * Use a "header" member array value as the JWT Header Segment; | |||
| syntax. | use the "payload" member value as the JWT Payload Segment; use | |||
| a "signature" member array value with the same index as the | ||||
| "header" member array value used as the JWT Crypto Segment. | ||||
| 7. The JWT Crypto Segment MUST be successfully base64url decoded | 2. The JWT Payload Segment MUST be successfully base64url decoded | |||
| following the restriction given in this spec that no padding | following the restriction given in this spec that no padding | |||
| characters may have been used. | characters have been used. | |||
| 8. The JWT Envelope Segment MUST be validated to only include | 3. If the payload represents a JWT Claims Object, then these steps | |||
| parameters and values whose syntax and semantics are both | for validating the Decoded JWT Payload Segment also apply: | |||
| understood and supported. | ||||
| 9. When used in a security-related context, the JWT Claim Segment | * The Decoded JWT Payload Segment, which is the Decoded JWT | |||
| MUST be validated to only include claims whose syntax and | Claims Object, MUST be completely valid JSON syntax conforming | |||
| semantics are both understood and supported. | to RFC 4627 [RFC4627]. | |||
| 10. The JWT Crypto Segment MUST be successfully validated against | * When used in a security-related context, the Decoded JWT | |||
| the JWT Claim Segment in the manner defined for the algorithm | Claims Object MUST be validated to only include claims whose | |||
| being used, which MUST be accurately represented by the value of | syntax and semantics are both understood and supported. | |||
| the "alg" envelope parameter, which MUST be present. | ||||
| 4. The JWT Header Segment MUST be successfully base64url decoded | ||||
| following the restriction given in this spec that no padding | ||||
| characters have been used. | ||||
| 5. The Decoded JWT Header Segment MUST be completely valid JSON | ||||
| syntax conforming to RFC 4627 [RFC4627]. | ||||
| 6. The JWT Crypto Segment MUST be successfully base64url decoded | ||||
| following the restriction given in this spec that no padding | ||||
| characters have been used. | ||||
| 7. The JWT Header Segment MUST be validated to only include | ||||
| parameters and values whose syntax and semantics are both | ||||
| understood and supported. | ||||
| 8. The JWT Crypto Segment MUST be successfully validated against the | ||||
| JWT Header Segment and JWT Payload Segment in the manner defined | ||||
| for the algorithm being used, which MUST be accurately | ||||
| represented by the value of the "alg" header parameter, which | ||||
| MUST be present. | ||||
| 9. If the JWT JSON Serialization is being used, then repeat steps 4 | ||||
| to 8 for each element of the header and signature arrays. | ||||
| Processing a JWT inevitably requires comparing known strings to | Processing a JWT inevitably requires comparing known strings to | |||
| values in the token. For example, in checking what the algorithm is, | values in the token. For example, in checking what the algorithm is, | |||
| the Unicode string encoding "alg" will be checked against the member | the Unicode string encoding "alg" will be checked against the member | |||
| names in the Decoded JWT Envelope Segment to see if there is a | names in the Decoded JWT Header Segment to see if there is a matching | |||
| matching envelope parameter name. A similar process occurs when | header parameter name. A similar process occurs when determining if | |||
| determining if the value of the "alg" envelope parameter represents a | the value of the "alg" header parameter represents a supported | |||
| supported algorithm. Comparing Unicode strings, however, has | algorithm. Comparing Unicode strings, however, has significant | |||
| significant security implications, as per Section 10. | security implications, as per Section 11. | |||
| Comparisons between JSON strings and other Unicode strings MUST be | Comparisons between JSON strings and other Unicode strings MUST be | |||
| performed as specified below: | performed as specified below: | |||
| 1. Remove any JSON applied escaping to produce an array of Unicode | 1. Remove any JSON applied escaping to produce an array of Unicode | |||
| code points. | code points. | |||
| 2. Unicode Normalization [USA15] MUST NOT be applied at any point to | 2. Unicode Normalization [USA15] MUST NOT be applied at any point to | |||
| either the JSON string or to the string it is to be compared | either the JSON string or to the string it is to be compared | |||
| against. | against. | |||
| skipping to change at page 14, line 49 ¶ | skipping to change at page 17, line 17 ¶ | |||
| 7. Base64url encoding as used by JWTs | 7. Base64url encoding as used by JWTs | |||
| JWTs make use of the base64url encoding as defined in RFC 4648 | JWTs make use of the base64url encoding as defined in RFC 4648 | |||
| [RFC4648]. As allowed by Section 3.2 of the RFC, this specification | [RFC4648]. As allowed by Section 3.2 of the RFC, this specification | |||
| mandates that base64url encoding when used with JWTs MUST NOT use | mandates that base64url encoding when used with JWTs MUST NOT use | |||
| padding. The reason for this restriction is that the padding | padding. The reason for this restriction is that the padding | |||
| character ('=') is not URL safe. | character ('=') is not URL safe. | |||
| For notes on implementing base64url encoding without padding, see | For notes on implementing base64url encoding without padding, see | |||
| Section 14. | Appendix B. | |||
| 8. Signing JWTs with Cryptographic Algorithms | 8. Signing JWTs with Cryptographic Algorithms | |||
| JWTs use specific cryptographic algorithms to sign the contents of | JWTs use specific cryptographic algorithms to sign the contents of | |||
| the JWT Claim Segment. The use of the following algorithms for | the JWT Header Segment and the JWT Payload Segment. The use of the | |||
| producing JWTs is defined in this section. The table below is the | following algorithms for producing JWTs is defined in this section. | |||
| list of "alg" envelope parameter values reserved by this | The table below is the list of "alg" header parameter values reserved | |||
| specification, each of which is explained in more detail in the | by this specification, each of which is explained in more detail in | |||
| following sections: | the following sections: | |||
| +-----------------+-------------------------------------------------+ | +--------------------+----------------------------------------------+ | |||
| | Alg Claim Value | Algorithm | | | Alg Parameter | Algorithm | | |||
| +-----------------+-------------------------------------------------+ | | Value | | | |||
| | HS256 | HMAC using SHA-256 hash algorithm | | +--------------------+----------------------------------------------+ | |||
| | HS384 | HMAC using SHA-384 hash algorithm | | | HS256 | HMAC using SHA-256 hash algorithm | | |||
| | HS512 | HMAC using SHA-512 hash algorithm | | | HS384 | HMAC using SHA-384 hash algorithm | | |||
| | RS256 | RSA using SHA-256 hash algorithm | | | HS512 | HMAC using SHA-512 hash algorithm | | |||
| | RS384 | RSA using SHA-384 hash algorithm | | | RS256 | RSA using SHA-256 hash algorithm | | |||
| | RS512 | RSA using SHA-512 hash algorithm | | | RS384 | RSA using SHA-384 hash algorithm | | |||
| | ES256 | ECDSA using P-256 curve and SHA-256 hash | | | RS512 | RSA using SHA-512 hash algorithm | | |||
| | | algorithm | | | ES256 | ECDSA using P-256 curve and SHA-256 hash | | |||
| | ES384 | ECDSA using P-384 curve and SHA-384 hash | | | | algorithm | | |||
| | | algorithm | | | ES384 | ECDSA using P-384 curve and SHA-384 hash | | |||
| | ES512 | ECDSA using P-521 curve and SHA-512 hash | | | | algorithm | | |||
| | | algorithm | | | ES512 | ECDSA using P-521 curve and SHA-512 hash | | |||
| +-----------------+-------------------------------------------------+ | | | algorithm | | |||
| +--------------------+----------------------------------------------+ | ||||
| Table 4: JSON Web Token Reserved Algorithm Values | Table 4: JSON Web Token Reserved Algorithm Values | |||
| Of these algorithms, only HMAC SHA-256 and RSA SHA-256 MUST be | Of these algorithms, only HMAC SHA-256 and RSA SHA-256 MUST be | |||
| implemented. It is RECOMMENDED that implementations also implement | implemented by conforming implementations. It is RECOMMENDED that | |||
| at least the ECDSA P-256 SHA-256 algorithm. | implementations also support the ECDSA P-256 SHA-256 algorithm. | |||
| Support for other algorithms is OPTIONAL. | ||||
| The portion of a JWT that is signed is the same for all algorithms: | ||||
| the concatenation of the JWT Header Segment, a period ('.') | ||||
| character, and the JWT Payload Segment. This character sequence is | ||||
| referred to as the JWT Signing Input. Note that in the JWT Compact | ||||
| Serialization, this corresponds to the portion of the JWT | ||||
| representation preceding the second period character. The UTF-8 | ||||
| representation of the JWT Signing Input is passed to the respective | ||||
| signing algorithms. | ||||
| 8.1. Signing a JWT with HMAC SHA-256 | 8.1. Signing a JWT with HMAC SHA-256 | |||
| Hash based Message Authentication Codes (HMACs) enable one to use a | Hash based Message Authentication Codes (HMACs) enable one to use a | |||
| secret plus a cryptographic hash function to generate a Message | secret plus a cryptographic hash function to generate a Message | |||
| Authentication Code (MAC). This can be used to demonstrate that the | Authentication Code (MAC). This can be used to demonstrate that the | |||
| MAC matches the hashed content, in this case the JWT Claim Segment, | MAC matches the hashed content, in this case the JWT Signing Input, | |||
| which therefore demonstrates that whoever generated the MAC was in | which therefore demonstrates that whoever generated the MAC was in | |||
| possession of the secret. | possession of the secret. | |||
| The algorithm for implementing and validating HMACs is provided in | The algorithm for implementing and validating HMACs is provided in | |||
| RFC 2104 [RFC2104]. Although any HMAC can be used with JWTs, this | RFC 2104 [RFC2104]. Although any HMAC can be used with JWTs, this | |||
| section defines the use of the SHA-256 cryptographic hash function as | section defines the use of the SHA-256 cryptographic hash function as | |||
| defined in FIPS 180-3 [FIPS.180-3]. The reserved "alg" envelope | defined in FIPS 180-3 [FIPS.180-3]. The reserved "alg" header | |||
| parameter value "HS256" is used in the JWT Envelope Segment to | parameter value "HS256" is used in the JWT Header Segment to indicate | |||
| indicate that the JWT Crypto Segment contains a base64url encoded | that the JWT Crypto Segment contains a base64url encoded HMAC SHA-256 | |||
| HMAC SHA-256 HMAC value. | HMAC value. | |||
| The HMAC SHA-256 MAC is generated as follows: | The HMAC SHA-256 MAC is generated as follows: | |||
| 1. Take the bytes of the UTF-8 representation of the JWT Claim | 1. Apply the HMAC SHA-256 algorithm to the UTF-8 representation of | |||
| Segment and execute the HMAC SHA-256 algorithm on them using the | the JWT Signing Input using the shared key to produce an HMAC. | |||
| shared key to produce an HMAC. | ||||
| 2. Base64url encode the HMAC as defined in this document. | 2. Base64url encode the HMAC as defined in this document. | |||
| The output is placed in the JWT Crypto Segment for that JWT. | The output is placed in the JWT Crypto Segment for that JWT. | |||
| The HMAC SHA-256 MAC on a JWT is validated as follows: | The HMAC SHA-256 MAC on a JWT is validated as follows: | |||
| 1. Take the bytes of the UTF-8 representation of the JWT Claim | 1. Apply the HMAC SHA-256 algorithm to the UTF-8 representation of | |||
| Segment and calculate an HMAC SHA-256 MAC on them using the | the JWT Signing Input of the JWT using the shared key. | |||
| shared key. | ||||
| 2. Base64url encode the previously generated HMAC as defined in this | 2. Base64url encode the previously generated HMAC as defined in this | |||
| document. | document. | |||
| 3. If the JWT Crypto Segment and the previously calculated value | 3. If the JWT Crypto Segment and the previously calculated value | |||
| exactly match in a character by character, case sensitive | exactly match, then one has confirmation that the key was used to | |||
| comparison, then one has confirmation that the key was used to | ||||
| generate the HMAC on the JWT and that the contents of the JWT | generate the HMAC on the JWT and that the contents of the JWT | |||
| Claim Segment have not be tampered with. | have not be tampered with. | |||
| 4. If the validation fails, the token MUST be rejected. | 4. If the validation fails, the token MUST be rejected. | |||
| Signing with the HMAC SHA-384 and HMAC SHA-512 algorithms is | Signing with the HMAC SHA-384 and HMAC SHA-512 algorithms is | |||
| performed identically to the procedure for HMAC SHA-256 - just with | performed identically to the procedure for HMAC SHA-256 - just with | |||
| correspondingly longer key and result values. | correspondingly longer key and result values. | |||
| JWT implementations MUST support the HMAC SHA-256 algorithm. Support | ||||
| for the HMAC SHA-384 and HMAC SHA-512 algorithms is OPTIONAL. | ||||
| 8.2. Signing a JWT with RSA SHA-256 | 8.2. Signing a JWT with RSA SHA-256 | |||
| This section defines the use of the RSASSA-PKCS1-v1_5 signature | This section defines the use of the RSASSA-PKCS1-v1_5 signature | |||
| algorithm as defined in RFC 3447 [RFC3447], Section 8.2 (commonly | algorithm as defined in RFC 3447 [RFC3447], Section 8.2 (commonly | |||
| known as PKCS#1), using SHA-256 as the hash function. Note that the | known as PKCS#1), using SHA-256 as the hash function. Note that the | |||
| use of the RSASSA-PKCS1-v1_5 algorithm is permitted in FIPS 186-3 | use of the RSASSA-PKCS1-v1_5 algorithm is described in FIPS 186-3 | |||
| [FIPS.186-3], Section 5.5, as is the SHA-256 cryptographic hash | [FIPS.186-3], Section 5.5, as is the SHA-256 cryptographic hash | |||
| function, which is defined in FIPS 180-3 [FIPS.180-3]. The reserved | function, which is defined in FIPS 180-3 [FIPS.180-3]. The reserved | |||
| "alg" envelope parameter value "RS256" is used in the JWT Envelope | "alg" header parameter value "RS256" is used in the JWT Header | |||
| Segment to indicate that the JWT Crypto Segment contains an RSA SHA- | Segment to indicate that the JWT Crypto Segment contains an RSA SHA- | |||
| 256 signature. | 256 signature. | |||
| A 2048-bit or longer key length MUST be used with this algorithm. | A 2048-bit or longer key length MUST be used with this algorithm. | |||
| The RSA SHA-256 signature is generated as follows: | The RSA SHA-256 signature is generated as follows: | |||
| 1. Let K be the signer's RSA private key and let M be the bytes of | 1. Let K be the signer's RSA private key and let M be the UTF-8 | |||
| the UTF-8 representation of the JWT Claim Segment. | representation of the JWT Signing Input. | |||
| 2. Compute the octet string S = RSASSA-PKCS1-V1_5-SIGN (K, M). | 2. Compute the octet string S = RSASSA-PKCS1-V1_5-SIGN (K, M) using | |||
| SHA-256 as the hash function. | ||||
| 3. Base64url encode the octet string S, as defined in this document. | 3. Base64url encode the octet string S, as defined in this document. | |||
| The output is placed in the JWT Crypto Segment for that JWT. | The output is placed in the JWT Crypto Segment for that JWT. | |||
| The RSA SHA-256 signature on a JWT is validated as follows: | The RSA SHA-256 signature on a JWT is validated as follows: | |||
| 1. Take the JWT Crypto Segment and base64url decode it into an octet | 1. Take the JWT Crypto Segment and base64url decode it into an octet | |||
| string S. If decoding fails, then the token MUST be rejected. | string S. If decoding fails, then the token MUST be rejected. | |||
| 2. Let M be the bytes of the UTF-8 representation of the JWT Claim | 2. Let M be the UTF-8 representation of the JWT Signing Input and | |||
| Segment and let (n, e) be the public key corresponding to the | let (n, e) be the public key corresponding to the private key | |||
| private key used by the signer. | used by the signer. | |||
| 3. Validate the signature with RSASSA-PKCS1-V1_5-VERIFY ((n, e), M, | 3. Validate the signature with RSASSA-PKCS1-V1_5-VERIFY ((n, e), M, | |||
| S). | S) using SHA-256 as the hash function. | |||
| 4. If the validation fails, the token MUST be rejected. | 4. If the validation fails, the token MUST be rejected. | |||
| Signing with the RSA SHA-384 and RSA SHA-512 algorithms is performed | Signing with the RSA SHA-384 and RSA SHA-512 algorithms is performed | |||
| identically to the procedure for RSA SHA-256 - just with | identically to the procedure for RSA SHA-256 - just with | |||
| correspondingly longer key and result values. | correspondingly longer key and result values. | |||
| JWT implementations MUST support the RSA SHA-256 algorithm. Support | ||||
| for the RSA SHA-384 and RSA SHA-512 algorithms is OPTIONAL. | ||||
| 8.3. Signing a JWT with ECDSA P-256 SHA-256 | 8.3. Signing a JWT with ECDSA P-256 SHA-256 | |||
| The Elliptic Curve Digital Signature Algorithm (ECDSA) is defined by | The Elliptic Curve Digital Signature Algorithm (ECDSA) is defined by | |||
| FIPS 186-3 [FIPS.186-3]. ECDSA provides for the use of Elliptic | FIPS 186-3 [FIPS.186-3]. ECDSA provides for the use of Elliptic | |||
| Curve cryptography, which is able to provide equivalent security to | Curve cryptography, which is able to provide equivalent security to | |||
| RSA cryptography but using shorter key lengths and with greater | RSA cryptography but using shorter key lengths and with greater | |||
| processing speed. This means that ECDSA signatures will be | processing speed. This means that ECDSA signatures will be | |||
| substantially smaller in terms of length than equivalently strong RSA | substantially smaller in terms of length than equivalently strong RSA | |||
| Digital Signatures. | Digital Signatures. | |||
| This specification defines the use of ECDSA with the P-256 curve and | This specification defines the use of ECDSA with the P-256 curve and | |||
| the SHA-256 cryptographic hash function. The P-256 curve is also | the SHA-256 cryptographic hash function. The P-256 curve is also | |||
| defined in FIPS 186-3. The reserved "alg" envelope parameter value | defined in FIPS 186-3. The reserved "alg" header parameter value | |||
| "ES256" is used in the JWT Envelope Segment to indicate that the JWT | "ES256" is used in the JWT Header Segment to indicate that the JWT | |||
| Crypto Segment contains a ECDSA P-256 SHA-256 signature. | Crypto Segment contains an ECDSA P-256 SHA-256 signature. | |||
| A JWT is signed with an ECDSA P-256 SHA-256 signature as follows: | A JWT is signed with an ECDSA P-256 SHA-256 signature as follows: | |||
| 1. Take the bytes of the UTF-8 representation of the JWT Claim | 1. Generate a digital signature of the UTF-8 representation of the | |||
| Segment and generate a digital signature of them using ECDSA | JWT Signing Input using ECDSA P-256 SHA-256 with the desired | |||
| P-256 SHA-256 with the desired private key. The output will be | private key. The output will be the EC point (R, S), where R and | |||
| the EC point (R, S), where R and S are unsigned integers. | S are unsigned integers. | |||
| 2. Turn R and S into byte arrays in big endian order. Each array | 2. Turn R and S into byte arrays in big endian order. Each array | |||
| will be 32 bytes long. | will be 32 bytes long. | |||
| 3. Concatenate the two byte arrays in the order R and then S. | 3. Concatenate the two byte arrays in the order R and then S. | |||
| 4. Base64url encode the 64 byte array as defined in this | 4. Base64url encode the 64 byte array as defined in this | |||
| specification. | specification. | |||
| The output becomes the JWT Crypto Segment for the JWT. | The output becomes the JWT Crypto Segment for the JWT. | |||
| skipping to change at page 18, line 35 ¶ | skipping to change at page 21, line 6 ¶ | |||
| 1. Take the JWT Crypto Segment and base64url decode it into a byte | 1. Take the JWT Crypto Segment and base64url decode it into a byte | |||
| array. If decoding fails, the token MUST be rejected. | array. If decoding fails, the token MUST be rejected. | |||
| 2. The output of the base64url decoding MUST be a 64 byte array. | 2. The output of the base64url decoding MUST be a 64 byte array. | |||
| 3. Split the 64 byte array into two 32 byte arrays. The first array | 3. Split the 64 byte array into two 32 byte arrays. The first array | |||
| will be R and the second S. Remember that the byte arrays are in | will be R and the second S. Remember that the byte arrays are in | |||
| big endian byte order; please check the ECDSA validator in use to | big endian byte order; please check the ECDSA validator in use to | |||
| see what byte order it requires. | see what byte order it requires. | |||
| 4. Submit the bytes of the UTF-8 representation of the JWT Claim | 4. Submit the UTF-8 representation of the JWT Signing Input, R, S | |||
| Segment, R, S and the public key (x, y) to the ECDSA P-256 SHA- | and the public key (x, y) to the ECDSA P-256 SHA-256 validator. | |||
| 256 validator. | ||||
| 5. If the validation fails, the token MUST be rejected. | 5. If the validation fails, the token MUST be rejected. | |||
| The ECDSA validator will then determine if the digital signature is | The ECDSA validator will then determine if the digital signature is | |||
| valid, given the inputs. Note that ECDSA digital signature contains | valid, given the inputs. Note that ECDSA digital signature contains | |||
| a value referred to as K, which is a random number generated for each | a value referred to as K, which is a random number generated for each | |||
| digital signature instance. This means that two ECDSA digital | digital signature instance. This means that two ECDSA digital | |||
| signatures using exactly the same input parameters will output | signatures using exactly the same input parameters will output | |||
| different signatures because their K values will be different. The | different signatures because their K values will be different. The | |||
| consequence of this is that one must validate an ECDSA signature by | consequence of this is that one must validate an ECDSA signature by | |||
| submitting the previously specified inputs to an ECDSA validator. | submitting the previously specified inputs to an ECDSA validator. | |||
| Signing with the ECDSA P-384 SHA-384 and ECDSA P-521 SHA-512 | Signing with the ECDSA P-384 SHA-384 and ECDSA P-521 SHA-512 | |||
| algorithms is performed identically to the procedure for ECDSA P-256 | algorithms is performed identically to the procedure for ECDSA P-256 | |||
| SHA-256 - just with correspondingly longer key and result values. | SHA-256 - just with correspondingly longer key and result values. | |||
| It is RECOMMENDED that JWT implementations support the ECDSA P-256 | ||||
| SHA-256 algorithm. Support for the ECDSA P-384 SHA-384 and ECDSA | ||||
| P-521 SHA-512 algorithms is OPTIONAL. | ||||
| 8.4. Additional Algorithms | 8.4. Additional Algorithms | |||
| Additional algorithms MAY be used to protect JWTs with corresponding | Additional algorithms MAY be used to protect JWTs with corresponding | |||
| "alg" envelope parameter values being defined to refer to them. Like | "alg" header parameter values being defined to refer to them. Like | |||
| claim names, new "alg" envelope parameter values SHOULD either be | claim names, new "alg" header parameter values SHOULD either be | |||
| defined in the IANA JSON Web Token Algorithms registry or be a URI | defined in the IANA JSON Web Token Algorithms registry or be a URI | |||
| that contains a collision resistant namespace. In particular, the | that contains a collision resistant namespace. In particular, the | |||
| use of algorithm identifiers defined in XML DSIG [RFC3275] and | use of algorithm identifiers defined in XML DSIG [RFC3275] and | |||
| related specifications is permitted. | related specifications is permitted. | |||
| 9. IANA Considerations | 9. JWT Serialization Formats | |||
| JSON Web Tokens (JWTs) support two serialization formats: the JWT | ||||
| Compact Serialization, which is more space efficient and intended for | ||||
| uses where the token is passed as a simple string-valued parameter, | ||||
| and the JWT JSON Serialization, which is more general, being able to | ||||
| contain multiple signatures over the same content. The two | ||||
| serialization formats are intended for use in different contexts. | ||||
| 9.1. JWT Compact Serialization | ||||
| The JWT Compact Serialization represents a JWT as a string consisting | ||||
| of three JWT Token Segments: the JWT Header Segment, the JWT Payload | ||||
| Segment, and the JWT Crypto Segment, in that order, with the segments | ||||
| being separated by period ('.') characters. It is intended for uses | ||||
| where the token is passed as a simple string-valued parameter, | ||||
| including in URLs. | ||||
| The Compact Serialization contains only one signature to keep this | ||||
| format simple. The example JWT in Section 3.1 uses the Compact | ||||
| Serialization. | ||||
| 9.2. JWT JSON Serialization | ||||
| The JWT JSON Serialization represents a JWT as a JSON object with | ||||
| members for each of three kinds of JWT Token Segments: a "header" | ||||
| member whose value is a non-empty array of JWT Header Segments, a | ||||
| "payload" member whose value is the JWT Payload Segment, and a | ||||
| "signature" member whose value is a non-empty array of JWT Crypto | ||||
| Segments, where the cardinality of both arrays is the same. | ||||
| Unlike the Compact Serialization, JWTs using the JSON Serialization | ||||
| MAY contain multiple signatures. Each signature is represented as a | ||||
| JWT Crypto Segment in the "signature" member array. For each | ||||
| signature, there is a corresponding "header" member array element | ||||
| that specifies the signature algorithm for that signature, and | ||||
| potentially other information as well. Therefore, the syntax is: | ||||
| {"header":["<header 1 contents>",...,"<header N contents>"], | ||||
| "payload":"<payload contents>", | ||||
| "signature":["<signature 1 contents>",...,"<signature N contents>"] | ||||
| } | ||||
| The i'th signature is computed on the concatenation of <header i | ||||
| contents>.<payload contents>. | ||||
| Appendix A.4 contains an example JWT using the JSON Serialization. | ||||
| 10. IANA Considerations | ||||
| This specification calls for: | This specification calls for: | |||
| o A new IANA registry entitled "JSON Web Token Claims" for reserved | o A new IANA registry entitled "JSON Web Token Claims" for reserved | |||
| claim names Section 4.1 used in a Decoded JWT Claim Segment. | claim names is defined in Section 4.1. Inclusion in the registry | |||
| Inclusion in the registry is RFC Required in the RFC 5226 | ||||
| [RFC5226] sense for reserved JWT claim names that are intended to | ||||
| be interoperable between implementations. The registry will just | ||||
| record the reserved claim name and a pointer to the RFC that | ||||
| defines it. This specification defines inclusion of the claim | ||||
| names defined in Table 1. | ||||
| o A new IANA registry entitled "JSON Web Token Envelope Parameters" | ||||
| for reserved envelope parameter names Section 5.1 used in a | ||||
| Decoded JWT Envelope Parameter Segment. Inclusion in the registry | ||||
| is RFC Required in the RFC 5226 [RFC5226] sense for reserved JWT | is RFC Required in the RFC 5226 [RFC5226] sense for reserved JWT | |||
| envelope parameter names that are intended to be interoperable | claim names that are intended to be interoperable between | |||
| between implementations. The registry will just record the | implementations. The registry will just record the reserved claim | |||
| reserved envelope parameter name and a pointer to the RFC that | name and a pointer to the RFC that defines it. This specification | |||
| defines it. This specification defines inclusion of the envelope | defines inclusion of the claim names defined in Table 1. | |||
| parameter names defined in Table 3. | ||||
| o A new IANA registry entitled "JSON Web Token Header Parameters" | ||||
| for reserved header parameter names is defined in Section 5.1. | ||||
| Inclusion in the registry is RFC Required in the RFC 5226 | ||||
| [RFC5226] sense for reserved JWT header parameter names that are | ||||
| intended to be interoperable between implementations. The | ||||
| registry will just record the reserved header parameter name and a | ||||
| pointer to the RFC that defines it. This specification defines | ||||
| inclusion of the header parameter names defined in Table 3. | ||||
| o A new IANA registry entitled "JSON Web Token Algorithms" for | o A new IANA registry entitled "JSON Web Token Algorithms" for | |||
| reserved values used with the "alg" envelope parameter values used | reserved values used with the "alg" header parameter values is | |||
| in a decoded JWT Envelope Segment. Inclusion in the registry is | defined in Section 8.4. Inclusion in the registry is RFC Required | |||
| RFC Required in the RFC 5226 [RFC5226] sense. The registry will | in the RFC 5226 [RFC5226] sense. The registry will just record | |||
| just record the "alg" value and a pointer to the RFC that defines | the "alg" value and a pointer to the RFC that defines it. This | |||
| it. This specification defines inclusion of the algorithm values | specification defines inclusion of the algorithm values defined in | |||
| defined in Table 4. | Table 4. | |||
| 10. Security Considerations | 11. Security Considerations | |||
| TBD: Lots of work to do here. We need to remember to look into any | TBD: Lots of work to do here. We need to remember to look into any | |||
| issues relating to security and JSON parsing. One wonders just how | issues relating to security and JSON parsing. One wonders just how | |||
| secure most JSON parsing libraries are. Were they ever hardened for | secure most JSON parsing libraries are. Were they ever hardened for | |||
| security scenarios? If not, what kind of holes does that open up? | security scenarios? If not, what kind of holes does that open up? | |||
| Also, we need to walk through the JSON standard and see what kind of | Also, we need to walk through the JSON standard and see what kind of | |||
| issues we have especially around comparison of names. For instance, | issues we have especially around comparison of names. For instance, | |||
| comparisons of claim names and other parameters must occur after they | comparisons of claim names and other parameters must occur after they | |||
| are unescaped. Need to also put in text about: Importance of keeping | are unescaped. Need to also put in text about: Importance of keeping | |||
| secrets secret. Rotating keys. Strengths and weaknesses of the | secrets secret. Rotating keys. Strengths and weaknesses of the | |||
| different algorithms. Case sensitivity and more generally Unicode | different algorithms. | |||
| comparison issues that can cause security holes, especially in claim | ||||
| names and explain why Unicode Normalization is such a problem. | ||||
| TBD: Need to put in text about why strict JSON validation is | TBD: Need to put in text about why strict JSON validation is | |||
| necessary. Basically, that if malformed JSON is received then the | necessary. Basically, that if malformed JSON is received then the | |||
| intent of the sender is impossible to reliably discern. While in | intent of the sender is impossible to reliably discern. While in | |||
| non-security contexts it's o.k. to be generous in what one accepts, | non-security contexts it's o.k. to be generous in what one accepts, | |||
| in security contexts this can lead to serious security holes. For | in security contexts this can lead to serious security holes. For | |||
| example, malformed JSON might indicate that someone has managed to | example, malformed JSON might indicate that someone has managed to | |||
| find a security hole in the issuer's code and is leveraging it to get | find a security hole in the issuer's code and is leveraging it to get | |||
| the issuer to issue "bad" tokens whose content the attacker can | the issuer to issue "bad" tokens whose content the attacker can | |||
| control. | control. | |||
| 10.1. Unicode Comparison Security Issues | 11.1. Unicode Comparison Security Issues | |||
| Claim names in JWTs are Unicode strings. For security reasons, the | Claim names in JWTs are Unicode strings. For security reasons, the | |||
| representations these names must be compared verbatim after | representations of these names must be compared verbatim after | |||
| performing any escape processing (as per RFC 4627 [RFC4627], Section | performing any escape processing (as per RFC 4627 [RFC4627], Section | |||
| 2.5). In particular, Unicode Normalization [USA15] or case folding | 2.5). | |||
| MUST NOT be applied at any point to either the JSON string or to the | ||||
| string it is to be compared against. | ||||
| This means, for instance, that these JSON strings must compare as | This means, for instance, that these JSON strings must compare as | |||
| being equal ("JWT", "\u004aWT"), whereas these must all compare as | being equal ("JWT", "\u004aWT"), whereas these must all compare as | |||
| being not equal to the first set or to each other ("jwt", "Jwt", | being not equal to the first set or to each other ("jwt", "Jwt", | |||
| "JW\u0074"). | "JW\u0074"). | |||
| JSON strings MAY contain characters outside the Unicode Basic | JSON strings MAY contain characters outside the Unicode Basic | |||
| Multilingual Plane. For instance, the G clef character (U+1D11E) may | Multilingual Plane. For instance, the G clef character (U+1D11E) may | |||
| be represented in a JSON string as "\uD834\uDD1E". Ideally, JWT | be represented in a JSON string as "\uD834\uDD1E". Ideally, JWT | |||
| implementations SHOULD ensure that characters outside the Basic | implementations SHOULD ensure that characters outside the Basic | |||
| Multilingual Plane are preserved and compared correctly; | Multilingual Plane are preserved and compared correctly; | |||
| alternatively, if this is not possible due to these characters | alternatively, if this is not possible due to these characters | |||
| exercising limitations present in the underlying JSON implementation, | exercising limitations present in the underlying JSON implementation, | |||
| then input containing them MUST be rejected. | then input containing them MUST be rejected. | |||
| 11. Open Issues | 12. Open Issues and Things To Be Done (TBD) | |||
| The following open issues have been identified during review of | The following items remain to be done in this draft (and related | |||
| previous drafts. Additional input on them is solicited. | drafts): | |||
| o The draft currently defines no mechanism(s) for retrieving public | o The specification will be a lot clearer if the signature portions | |||
| keys that are not encoded as X.509 certificates. A mechanism or | are cleanly separated from the claims token format and | |||
| mechanisms similar to the Magic Signatures key discovery process | serialization portions. Having tried it this way and being | |||
| for Magic Keys could be added to future drafts. Some have | dissatisfied with the sometimes unwieldy readability of the | |||
| suggested that they keys themselves also be encoded as JWTs. | result, I plan to perform the separation in the next draft. | |||
| o Related to the above, it's not clear whether the "iss" claim | o Consider whether there is a better term than "Digital Signature" | |||
| should be expected to contain a location for retrieving non-X.509 | for the concept that includes both HMACs and digital signatures | |||
| public keys, or whether a separate issuer key location parameter | using public keys. | |||
| should be defined. Also, does this belong in the envelope or the | ||||
| claims? | ||||
| 12. Acknowledgements | o Consider whether we really want to allow private claim names and | |||
| header parameters that are not registered with IANA and are not in | ||||
| collision-resistant namespaces. Eventually this could result in | ||||
| interop nightmares where you need to have different code to talk | ||||
| to different endpoints that "knows" about each endpoints' private | ||||
| parameters. | ||||
| The authors acknowledge that the design of JWTs was intentionally | o Clarify the optional ability to provide type information JWTs | |||
| influenced by the design and simplicity of Simple Web Tokens [SWT]. | and/or their segments. Specifically, clarify the intended use of | |||
| Solutions for signing JSON tokens were also previously explored by | the "typ" Header Parameter and the "typ" claim, whether they | |||
| Magic Signatures [MagicSignatures], JSON Simple Sign [JSS], and | convey syntax or semantics, and indeed, whether this is the right | |||
| Canvas Applications [CanvasApp], all of which influenced this draft. | approach. Also clarify the relationship between these type values | |||
| and MIME [RFC2045] types. | ||||
| 13. Appendix - Non-Normative - JWT Examples | o Clarify the semantics of the "kid" (key ID) header parameter. | |||
| Open issues include: What happens if a kid header is received with | ||||
| an unrecognized value? Is that an error? Should it be treated as | ||||
| if it's empty? What happens if the header has a recognized value | ||||
| but the value doesn't match the key associated with that value, | ||||
| but it does match another key that is associated with the issuer? | ||||
| Is that an error? | ||||
| 13.1. JWT using HMAC SHA-256 | o The "x5t" parameter is currently specified as "a base64url encoded | |||
| SHA-256 thumbprint of the DER encoding of an X.509 certificate". | ||||
| 13.1.1. Encoding | SHA-1 was traditionally used for certificate digests but | |||
| collisions are possible to create and can be used for denial of | ||||
| service attacks within multi-tenant services. We need to | ||||
| understand the compatibility issues of using SHA-256 thumbprints | ||||
| instead. We also likely want to specify the digest algorithm | ||||
| explicitly. | ||||
| The Decoded JWT Claim Segment used in this example is: | o Several people have objected to the requirement for implementing | |||
| RSA SHA-256, some because they will only be using HMACs and | ||||
| symmetric keys, and others because they only want to use ECDSA | ||||
| when using asymmetric keys, either for security or key length | ||||
| reasons, or both. I believe therefore, that we should consider | ||||
| changing the MUST for RSA SHA-256 to RECOMMENDED. | ||||
| o Since RFC 3447 Section 8 explicitly calls for people NOT to adopt | ||||
| RSASSA-PKCS1 for new applications and instead requests that people | ||||
| transition to RSASSA-PSS, we probably need some Security | ||||
| Considerations text explaining why RSASSA-PKCS1 is being used | ||||
| (it's what's commonly implemented) and what the potential | ||||
| consequences are. | ||||
| o Generalize the normative text on signing algorithms so that the | ||||
| descriptions apply equally to the use of various key lengths - not | ||||
| just HMAC SHA-256, RSA SHA-256, and ECDSA P-256 SHA-256. | ||||
| o Add a table cross-referencing the algorithm name strings used in | ||||
| standard software packages and specifications. | ||||
| o Add Security Considerations text on timing attacks. | ||||
| o Finish the Security Considerations section. | ||||
| o Sort out what to do with the IANA registries if this is first | ||||
| standardized as an OpenID specification. | ||||
| o Write the related specification for encoding public keys using | ||||
| JSON, as per the agreement documented at | ||||
| http://self-issued.info/?p=390. This will be used by the "jku" | ||||
| (JSON Key URL) header parameter. | ||||
| o Write the companion encryption specification, per the agreements | ||||
| documented at http://self-issued.info/?p=378. | ||||
| 13. References | ||||
| 13.1. Normative References | ||||
| [FIPS.180-3] | ||||
| National Institute of Standards and Technology, "Secure | ||||
| Hash Standard (SHS)", FIPS PUB 180-3, October 2008. | ||||
| [FIPS.186-3] | ||||
| National Institute of Standards and Technology, "Digital | ||||
| Signature Standard (DSS)", FIPS PUB 186-3, June 2009. | ||||
| [RFC1738] Berners-Lee, T., Masinter, L., and M. McCahill, "Uniform | ||||
| Resource Locators (URL)", RFC 1738, December 1994. | ||||
| [RFC2045] Freed, N. and N. Borenstein, "Multipurpose Internet Mail | ||||
| Extensions (MIME) Part One: Format of Internet Message | ||||
| Bodies", RFC 2045, November 1996. | ||||
| [RFC2104] Krawczyk, H., Bellare, M., and R. Canetti, "HMAC: Keyed- | ||||
| Hashing for Message Authentication", RFC 2104, | ||||
| February 1997. | ||||
| [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | ||||
| Requirement Levels", BCP 14, RFC 2119, March 1997. | ||||
| [RFC3339] Klyne, G., Ed. and C. Newman, "Date and Time on the | ||||
| Internet: Timestamps", RFC 3339, July 2002. | ||||
| [RFC3447] Jonsson, J. and B. Kaliski, "Public-Key Cryptography | ||||
| Standards (PKCS) #1: RSA Cryptography Specifications | ||||
| Version 2.1", RFC 3447, February 2003. | ||||
| [RFC3629] Yergeau, F., "UTF-8, a transformation format of ISO | ||||
| 10646", STD 63, RFC 3629, November 2003. | ||||
| [RFC3986] Berners-Lee, T., Fielding, R., and L. Masinter, "Uniform | ||||
| Resource Identifier (URI): Generic Syntax", STD 66, | ||||
| RFC 3986, January 2005. | ||||
| [RFC4627] Crockford, D., "The application/json Media Type for | ||||
| JavaScript Object Notation (JSON)", RFC 4627, July 2006. | ||||
| [RFC4648] Josefsson, S., "The Base16, Base32, and Base64 Data | ||||
| Encodings", RFC 4648, October 2006. | ||||
| [RFC5226] Narten, T. and H. Alvestrand, "Guidelines for Writing an | ||||
| IANA Considerations Section in RFCs", BCP 26, RFC 5226, | ||||
| May 2008. | ||||
| [RFC5280] Cooper, D., Santesson, S., Farrell, S., Boeyen, S., | ||||
| Housley, R., and W. Polk, "Internet X.509 Public Key | ||||
| Infrastructure Certificate and Certificate Revocation List | ||||
| (CRL) Profile", RFC 5280, May 2008. | ||||
| [USA15] Davis, M., Whistler, K., and M. Duerst, "Unicode | ||||
| Normalization Forms", Unicode Standard Annex 15, 09 2009. | ||||
| 13.2. Informative References | ||||
| [CanvasApp] | ||||
| Facebook, "Canvas Applications", 2010. | ||||
| [JSS] Bradley, J. and N. Sakimura (editor), "JSON Simple Sign", | ||||
| September 2010. | ||||
| [MagicSignatures] | ||||
| Panzer (editor), J., Laurie, B., and D. Balfanz, "Magic | ||||
| Signatures", August 2010. | ||||
| [OASIS.saml-core-2.0-os] | ||||
| Cantor, S., Kemp, J., Philpott, R., and E. Maler, | ||||
| "Assertions and Protocol for the OASIS Security Assertion | ||||
| Markup Language (SAML) V2.0", OASIS Standard saml-core- | ||||
| 2.0-os, March 2005. | ||||
| [RFC3275] Eastlake, D., Reagle, J., and D. Solo, "(Extensible Markup | ||||
| Language) XML-Signature Syntax and Processing", RFC 3275, | ||||
| March 2002. | ||||
| [RFC4122] Leach, P., Mealling, M., and R. Salz, "A Universally | ||||
| Unique IDentifier (UUID) URN Namespace", RFC 4122, | ||||
| July 2005. | ||||
| [SWT] Hardt, D. and Y. Goland, "Simple Web Token (SWT)", | ||||
| Version 0.9.5.1, November 2009. | ||||
| [W3C.CR-xml11-20021015] | ||||
| Cowan, J., "Extensible Markup Language (XML) 1.1", W3C | ||||
| CR CR-xml11-20021015, October 2002. | ||||
| Appendix A. JWT Examples | ||||
| A.1. JWT using HMAC SHA-256 | ||||
| A.1.1. Encoding | ||||
| The Decoded JWT Payload Segment used in this example is: | ||||
| {"iss":"joe", | {"iss":"joe", | |||
| "exp":1300819380, | "exp":1300819380, | |||
| "http://example.com/is_root":true} | "http://example.com/is_root":true} | |||
| Note that white space is explicitly allowed in Decoded JWT Claim | Note that white space is explicitly allowed in Decoded JWT Claims | |||
| Segments and no canonicalization is performed before encoding. The | Objects and no canonicalization is performed before encoding. The | |||
| following byte array contains the UTF-8 characters for the Decoded | following byte array contains the UTF-8 characters for the Decoded | |||
| JWT Claim Segment: | JWT Payload Segment: | |||
| [123, 34, 105, 115, 115, 34, 58, 34, 106, 111, 101, 34, 44, 13, 10, | [123, 34, 105, 115, 115, 34, 58, 34, 106, 111, 101, 34, 44, 13, 10, | |||
| 32, 34, 101, 120, 112, 34, 58, 49, 51, 48, 48, 56, 49, 57, 51, 56, | 32, 34, 101, 120, 112, 34, 58, 49, 51, 48, 48, 56, 49, 57, 51, 56, | |||
| 48, 44, 13, 10, 32, 34, 104, 116, 116, 112, 58, 47, 47, 101, 120, 97, | 48, 44, 13, 10, 32, 34, 104, 116, 116, 112, 58, 47, 47, 101, 120, 97, | |||
| 109, 112, 108, 101, 46, 99, 111, 109, 47, 105, 115, 95, 114, 111, | 109, 112, 108, 101, 46, 99, 111, 109, 47, 105, 115, 95, 114, 111, | |||
| 111, 116, 34, 58, 116, 114, 117, 101, 125] | 111, 116, 34, 58, 116, 114, 117, 101, 125] | |||
| Base64url encoding the above yields the JWT Claim Segment value: | ||||
| Base64url encoding the above yields the JWT Payload Segment value: | ||||
| eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ | eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ | |||
| The following example JSON envelope object declares that the encoded | The following example JSON header object declares that the data | |||
| object is a JSON Web Token (JWT) and the JWT Claim Segment is signed | structure is a JSON Web Token (JWT) and the JWT Signing Input is | |||
| using the HMAC SHA-256 algorithm: | signed using the HMAC SHA-256 algorithm: | |||
| {"typ":"JWT", | {"typ":"JWT", | |||
| "alg":"HS256"} | "alg":"HS256"} | |||
| The following byte array contains the UTF-8 characters for the | The following byte array contains the UTF-8 characters for the | |||
| Decoded JWT Envelope Segment: | Decoded JWT Header Segment: | |||
| [123, 34, 116, 121, 112, 34, 58, 34, 74, 87, 84, 34, 44, 13, 10, 32, | [123, 34, 116, 121, 112, 34, 58, 34, 74, 87, 84, 34, 44, 13, 10, 32, | |||
| 34, 97, 108, 103, 34, 58, 34, 72, 83, 50, 53, 54, 34, 125] | 34, 97, 108, 103, 34, 58, 34, 72, 83, 50, 53, 54, 34, 125] | |||
| Base64url encoding this UTF-8 representation yields this JWT Envelope | Base64url encoding this UTF-8 representation yields this JWT Header | |||
| Segment value: | Segment value: | |||
| eyJ0eXAiOiJKV1QiLA0KICJhbGciOiJIUzI1NiJ9 | eyJ0eXAiOiJKV1QiLA0KICJhbGciOiJIUzI1NiJ9 | |||
| Concatenating the JWT Header Segment, a period character, and the JWT | ||||
| Payload Segment yields this JWT Signing Input value (with line breaks | ||||
| for display purposes only): | ||||
| eyJ0eXAiOiJKV1QiLA0KICJhbGciOiJIUzI1NiJ9 | ||||
| . | ||||
| eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ | ||||
| The UTF-8 representation of the JWT Signing Input is the following | ||||
| byte array: | ||||
| [101, 121, 74, 48, 101, 88, 65, 105, 79, 105, 74, 75, 86, 49, 81, | ||||
| 105, 76, 65, 48, 75, 73, 67, 74, 104, 98, 71, 99, 105, 79, 105, 74, | ||||
| 73, 85, 122, 73, 49, 78, 105, 74, 57, 46, 101, 121, 74, 112, 99, 51, | ||||
| 77, 105, 79, 105, 74, 113, 98, 50, 85, 105, 76, 65, 48, 75, 73, 67, | ||||
| 74, 108, 101, 72, 65, 105, 79, 106, 69, 122, 77, 68, 65, 52, 77, 84, | ||||
| 107, 122, 79, 68, 65, 115, 68, 81, 111, 103, 73, 109, 104, 48, 100, | ||||
| 72, 65, 54, 76, 121, 57, 108, 101, 71, 70, 116, 99, 71, 120, 108, 76, | ||||
| 109, 78, 118, 98, 83, 57, 112, 99, 49, 57, 121, 98, 50, 57, 48, 73, | ||||
| 106, 112, 48, 99, 110, 86, 108, 102, 81] | ||||
| HMACs are generated using keys. This example used the key | HMACs are generated using keys. This example used the key | |||
| represented by the following byte array: | represented by the following byte array: | |||
| [83, 159, 117, 12, 235, 169, 168, 200, 131, 152, 227, 246, 214, 212, | [3, 35, 53, 75, 43, 15, 165, 188, 131, 126, 6, 101, 119, 123, 166, | |||
| 188, 74, 71, 83, 244, 166, 90, 24, 239, 251, 32, 124, 6, 201, 194, | 143, 90, 179, 40, 230, 240, 84, 201, 40, 169, 15, 132, 178, 210, 80, | |||
| 104, 241, 62, 174, 246, 65, 111, 49, 52, 210, 118, 212, 124, 34, 88, | 46, 191, 211, 251, 90, 146, 210, 6, 71, 239, 150, 138, 180, 195, 119, | |||
| 167, 112, 84, 88, 83, 65, 155, 18, 234, 250, 224, 101, 147, 221, 23, | 98, 61, 34, 61, 46, 33, 114, 5, 46, 79, 8, 192, 205, 154, 245, 103, | |||
| 104, 219, 170, 146, 215] | 208, 128, 163] | |||
| Running the HMAC SHA-256 algorithm on the JWT Claim Segment with this | Running the HMAC SHA-256 algorithm on the UTF-8 representation of the | |||
| key yields the following byte array: | JWT Signing Input with this key yields the following byte array: | |||
| [223, 155, 172, 90, 63, 87, 240, 124, 6, 75, 224, 131, 115, 29, 73, | [116, 24, 223, 180, 151, 153, 224, 37, 79, 250, 96, 125, 216, 173, | |||
| 63, 99, 102, 169, 202, 203, 193, 158, 4, 42, 159, 44, 53, 56, 95, | 187, 186, 22, 212, 37, 77, 105, 214, 191, 240, 91, 88, 5, 88, 83, | |||
| 221, 198] | 132, 141, 121] | |||
| Base64url encoding the above HMAC output yields the JWT Crypto | Base64url encoding the above HMAC output yields the JWT Crypto | |||
| Segment value: | Segment value: | |||
| 35usWj9X8HwGS-CDcx1JP2NmqcrLwZ4EKp8sNThf3cY | dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk | |||
| Combining these segments in the order Envelope.Claims.Signature with | Combining these segments in the order Header.Payload.Signature with | |||
| period characters between the segments yields this complete JWT (with | period characters between the segments yields this complete JWT using | |||
| line breaks for display purposes only): | the JWT Compact Serialization (with line breaks for display purposes | |||
| only): | ||||
| eyJ0eXAiOiJKV1QiLA0KICJhbGciOiJIUzI1NiJ9 | eyJ0eXAiOiJKV1QiLA0KICJhbGciOiJIUzI1NiJ9 | |||
| . | . | |||
| eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ | eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ | |||
| . | . | |||
| 35usWj9X8HwGS-CDcx1JP2NmqcrLwZ4EKp8sNThf3cY | dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk | |||
| 13.1.2. Decoding | ||||
| A.1.2. Decoding | ||||
| Decoding the JWT first requires removing the base64url encoding from | Decoding the JWT first requires removing the base64url encoding from | |||
| the JWT Envelope Segment and the JWT Claim Segment. We base64url | the JWT Header Segment, the JWT Payload Segment, and the JWT Crypto | |||
| decode the segments per Section 7 and turn them into the | Segment. We base64url decode the segments per Section 7 and turn | |||
| corresponding UTF-8 byte arrays, which we then translate into the | them into the corresponding byte arrays. We translate the header | |||
| Decoded JWT Envelope Segment and Decoded JWT Claim Segment strings. | segment byte array containing UTF-8 encoded characters into the | |||
| Decoded JWT Header Segment string. Likewise, if the payload | ||||
| represents a JWT Claims Object, we translate the payload segment byte | ||||
| array containing UTF-8 encoded characters into a Decoded JWT Claims | ||||
| Object string. | ||||
| 13.1.3. Validating | A.1.3. Validating | |||
| Next we validate the decoded results. Since the "alg" parameter in | Next we validate the decoded results. Since the "alg" parameter in | |||
| the envelope is "HS256", we validate the HMAC SHA-256 signature | the header is "HS256", we validate the HMAC SHA-256 signature | |||
| contained in the JWT Crypto Segment. If any of the validation steps | contained in the JWT Crypto Segment. If any of the validation steps | |||
| fail, the token MUST be rejected. | fail, the token MUST be rejected. | |||
| First, we validate that the decoded envelope and claim segment | First, we validate that the decoded JWT Header Segment string is | |||
| strings are both legal JSON. | legal JSON. | |||
| If the payload represents a JWT Claims Object, we also validate that | ||||
| the decoded JWT Payload Segment string is legal JSON. | ||||
| To validate the signature, we repeat the previous process of using | To validate the signature, we repeat the previous process of using | |||
| the correct key and the JWT Claim Segment as input to a SHA-256 HMAC | the correct key and the UTF-8 representation of the JWT Signing Input | |||
| function and then taking the output, base64url encoding it, and | as input to a SHA-256 HMAC function and then taking the output and | |||
| determining if it matches the JWT Crypto Segment in the JWT. If it | determining if it matches the Decoded JWT Crypto Segment. If it | |||
| matches exactly, the token has been validated. | matches exactly, the token has been validated. | |||
| 13.2. JWT using RSA SHA-256 | A.2. JWT using RSA SHA-256 | |||
| 13.2.1. Encoding | A.2.1. Encoding | |||
| The Decoded JWT Claim Segment used in this example is the same as in | The Decoded JWT Payload Segment used in this example is the same as | |||
| the previous example: | in the previous example: | |||
| {"iss":"joe", | {"iss":"joe", | |||
| "exp":1300819380, | "exp":1300819380, | |||
| "http://example.com/is_root":true} | "http://example.com/is_root":true} | |||
| Since the JWT Claim Segment will therefore be the same, its | Since the JWT Payload Segment will therefore be the same, its | |||
| computation is not repeated here. However, the Decoded JWT Envelope | computation is not repeated here. However, the Decoded JWT Header | |||
| Segment is different in two ways: First, because a different | Segment is different in two ways: First, because a different | |||
| algorithm is being used, the "alg" value is different. Second, for | algorithm is being used, the "alg" value is different. Second, for | |||
| illustration purposes only, the optional "typ" parameter is not used. | illustration purposes only, the optional "typ" parameter is not used. | |||
| (This difference is not related to the signature algorithm employed.) | (This difference is not related to the signature algorithm employed.) | |||
| The Decoded JWT Envelope Segment used is: | The Decoded JWT Header Segment used is: | |||
| {"alg":"RS256"} | {"alg":"RS256"} | |||
| The following byte array contains the UTF-8 characters for the | The following byte array contains the UTF-8 characters for the | |||
| Decoded JWT Envelope Segment: | Decoded JWT Header Segment: | |||
| [123, 34, 97, 108, 103, 34, 58, 34, 82, 83, 50, 53, 54, 34, 125] | [123, 34, 97, 108, 103, 34, 58, 34, 82, 83, 50, 53, 54, 34, 125] | |||
| Base64url encoding this UTF-8 representation yields this JWT Envelope | ||||
| Base64url encoding this UTF-8 representation yields this JWT Header | ||||
| Segment value: | Segment value: | |||
| eyJhbGciOiJSUzI1NiJ9 | eyJhbGciOiJSUzI1NiJ9 | |||
| Concatenating the JWT Header Segment, a period character, and the JWT | ||||
| Payload Segment yields this JWT Signing Input value (with line breaks | ||||
| for display purposes only): | ||||
| eyJhbGciOiJSUzI1NiJ9 | ||||
| . | ||||
| eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ | ||||
| The UTF-8 representation of the JWT Signing Input is the following | ||||
| byte array: | ||||
| [101, 121, 74, 104, 98, 71, 99, 105, 79, 105, 74, 83, 85, 122, 73, | ||||
| 49, 78, 105, 74, 57, 46, 101, 121, 74, 112, 99, 51, 77, 105, 79, 105, | ||||
| 74, 113, 98, 50, 85, 105, 76, 65, 48, 75, 73, 67, 74, 108, 101, 72, | ||||
| 65, 105, 79, 106, 69, 122, 77, 68, 65, 52, 77, 84, 107, 122, 79, 68, | ||||
| 65, 115, 68, 81, 111, 103, 73, 109, 104, 48, 100, 72, 65, 54, 76, | ||||
| 121, 57, 108, 101, 71, 70, 116, 99, 71, 120, 108, 76, 109, 78, 118, | ||||
| 98, 83, 57, 112, 99, 49, 57, 121, 98, 50, 57, 48, 73, 106, 112, 48, | ||||
| 99, 110, 86, 108, 102, 81] | ||||
| The RSA key consists of a public part (n, e), and a private exponent | The RSA key consists of a public part (n, e), and a private exponent | |||
| d. The values of the RSA key used in this example, presented as the | d. The values of the RSA key used in this example, presented as the | |||
| byte arrays representing big endian integers are: | byte arrays representing big endian integers are: | |||
| +-----------+-------------------------------------------------------+ | +-----------+-------------------------------------------------------+ | |||
| | Parameter | Value | | | Parameter | Value | | |||
| | Name | | | | Name | | | |||
| +-----------+-------------------------------------------------------+ | +-----------+-------------------------------------------------------+ | |||
| | n | [210, 252, 123, 106, 10, 30, 108, 103, 16, 74, 235, | | | n | [161, 248, 22, 10, 226, 227, 201, 180, 101, 206, 141, | | |||
| | | 143, 136, 178, 87, 102, 155, 77, 246, 121, 221, 173, | | | | 45, 101, 98, 99, 54, 43, 146, 125, 190, 41, 225, 240, | | |||
| | | 9, 155, 92, 74, 108, 217, 168, 128, 21, 181, 161, 51, | | | | 36, 119, 252, 22, 37, 204, 144, 161, 54, 227, 139, | | |||
| | | 191, 11, 133, 108, 120, 113, 182, 223, 0, 11, 85, 79, | | | | 217, 52, 151, 197, 182, 234, 99, 221, 119, 17, 230, | | |||
| | | 206, 179, 194, 237, 81, 43, 182, 143, 20, 92, 110, | | | | 124, 116, 41, 249, 86, 176, 251, 138, 143, 8, 154, | | |||
| | | 132, 52, 117, 47, 171, 82, 161, 207, 193, 36, 64, | | | | 220, 75, 105, 137, 60, 193, 51, 63, 83, 237, 208, 25, | | |||
| | | 143, 121, 181, 138, 69, 120, 193, 100, 40, 133, 87, | | | | 184, 119, 132, 37, 47, 236, 145, 79, 228, 133, 119, | | |||
| | | 137, 247, 162, 73, 227, 132, 203, 45, 159, 174, 45, | | | | 105, 89, 75, 234, 66, 128, 211, 44, 15, 85, 191, 98, | | |||
| | | 103, 253, 150, 251, 146, 108, 25, 142, 7, 115, 153, | | | | 148, 79, 19, 3, 150, 188, 110, 155, 223, 110, 189, | | |||
| | | 253, 200, 21, 192, 175, 9, 125, 222, 90, 173, 239, | | | | 210, 189, 163, 103, 142, 236, 160, 198, 104, 247, 1, | | |||
| | | 244, 77, 231, 14, 130, 127, 72, 120, 67, 36, 57, 191, | | | | 179, 141, 191, 251, 56, 200, 52, 44, 226, 254, 109, | | |||
| | | 238, 185, 96, 104, 208, 71, 79, 197, 13, 109, 144, | | | | 39, 250, 222, 74, 90, 72, 116, 151, 157, 212, 185, | | |||
| | | 191, 58, 152, 223, 175, 16, 64, 200, 156, 2, 214, | | | | 207, 154, 222, 196, 199, 91, 5, 133, 44, 44, 15, 94, | | |||
| | | 146, 171, 59, 60, 40, 150, 96, 157, 134, 253, 115, | | | | 248, 165, 193, 117, 3, 146, 249, 68, 232, 237, 100, | | |||
| | | 183, 116, 206, 7, 64, 100, 124, 238, 234, 163, 16, | | | | 193, 16, 198, 182, 71, 96, 154, 164, 120, 58, 235, | | |||
| | | 189, 18, 249, 133, 168, 235, 159, 89, 253, 212, 38, | | | | 156, 108, 154, 215, 85, 49, 48, 80, 99, 139, 131, | | |||
| | | 206, 165, 178, 18, 15, 79, 42, 52, 188, 171, 118, 75, | | | | 102, 92, 111, 111, 122, 130, 163, 150, 112, 42, 31, | | |||
| | | 126, 108, 84, 214, 132, 2, 56, 188, 196, 5, 135, 165, | | | | 100, 27, 130, 211, 235, 242, 57, 34, 25, 73, 31, 182, | | |||
| | | 158, 102, 237, 31, 51, 137, 69, 119, 99, 92, 71, 10, | | | | 134, 135, 44, 87, 22, 245, 10, 248, 53, 141, 154, | | |||
| | | 247, 92, 249, 44, 32, 209, 218, 67, 225, 191, 196, | | | | 139, 157, 23, 195, 64, 114, 143, 127, 135, 216, 154, | | |||
| | | 25, 226, 34, 166, 240, 208, 187, 53, 140, 94, 56, | | | | 24, 216, 252, 171, 103, 173, 132, 89, 12, 46, 207, | | |||
| | | 249, 203, 5, 10, 234, 254, 144, 72, 20, 241, 172, 26, | | | | 117, 147, 57, 54, 60, 7, 3, 77, 111, 96, 111, 158, | | |||
| | | 164, 156, 202, 158, 160, 202, 131] | | | | 33, 224, 84, 86, 202, 229, 233, 161] | | |||
| | e | [1, 0, 1] | | | e | [1, 0, 1] | | |||
| | d | [95, 135, 19, 181, 226, 88, 254, 9, 248, 21, 131, | | | d | [18, 174, 113, 164, 105, 205, 10, 43, 195, 126, 82, | | |||
| | | 236, 92, 31, 43, 117, 120, 177, 230, 252, 44, 131, | | | | 108, 69, 0, 87, 31, 29, 97, 117, 29, 100, 233, 73, | | |||
| | | 81, 75, 55, 145, 55, 17, 161, 186, 68, 154, 21, 31, | | | | 112, 123, 98, 89, 15, 157, 11, 165, 124, 150, 60, 64, | | |||
| | | 225, 203, 44, 160, 253, 51, 183, 113, 230, 138, 59, | | | | 30, 63, 207, 47, 44, 211, 189, 236, 136, 229, 3, 191, | | |||
| | | 25, 68, 100, 157, 200, 103, 173, 28, 30, 82, 64, 187, | | | | 198, 67, 155, 11, 40, 200, 47, 125, 55, 151, 103, 31, | | |||
| | | 133, 62, 95, 36, 179, 52, 89, 177, 64, 40, 210, 214, | | | | 82, 19, 238, 216, 193, 90, 37, 216, 213, 206, 160, 2, | | |||
| | | 99, 107, 239, 236, 30, 141, 169, 116, 179, 82, 252, | | | | 94, 227, 171, 46, 139, 127, 121, 33, 111, 198, 59, | | |||
| | | 83, 211, 246, 18, 126, 168, 163, 194, 157, 209, 79, | | | | 234, 86, 39, 83, 180, 6, 68, 198, 161, 81, 39, 217, | | |||
| | | 57, 65, 104, 44, 86, 167, 135, 104, 22, 78, 77, 218, | | | | 178, 149, 69, 64, 160, 187, 225, 163, 5, 86, 152, 45, | | |||
| | | 143, 6, 203, 249, 199, 52, 170, 232, 0, 50, 36, 39, | | | | 78, 159, 222, 95, 100, 37, 241, 77, 75, 113, 52, 65, | | |||
| | | 142, 169, 69, 74, 33, 177, 124, 176, 109, 23, 128, | | | | 181, 93, 199, 59, 155, 74, 237, 204, 146, 172, 227, | | |||
| | | 117, 134, 140, 192, 91, 61, 182, 255, 29, 253, 195, | | | | 146, 126, 55, 245, 125, 12, 253, 94, 117, 129, 250, | | |||
| | | 213, 99, 120, 180, 237, 173, 237, 240, 195, 122, 76, | | | | 81, 44, 143, 73, 97, 169, 235, 11, 128, 248, 168, 7, | | |||
| | | 220, 38, 209, 212, 154, 194, 111, 111, 227, 181, 34, | | | | 70, 114, 138, 85, 255, 70, 71, 31, 52, 37, 6, 59, | | |||
| | | 10, 93, 210, 147, 150, 98, 27, 188, 104, 140, 242, | | | | 157, 83, 100, 47, 94, 222, 30, 132, 214, 19, 8, 26, | | |||
| | | 238, 226, 198, 224, 213, 77, 163, 199, 130, 1, 76, | | | | 250, 92, 34, 208, 81, 40, 91, 214, 59, 148, 59, 86, | | |||
| | | 208, 115, 157, 178, 82, 204, 81, 202, 235, 168, 211, | | | | 93, 137, 138, 5, 104, 84, 19, 229, 60, 60, 108, 101, | | |||
| | | 241, 184, 36, 186, 171, 36, 208, 104, 236, 144, 50, | | | | 37, 255, 31, 227, 78, 61, 220, 112, 240, 213, 100, | | |||
| | | 100, 215, 214, 120, 171, 8, 240, 110, 201, 231, 226, | | | | 80, 253, 164, 139, 161, 46, 16, 78, 157, 235, 159, | | |||
| | | 61, 150, 6, 40, 183, 68, 191, 148, 179, 105, 70, 86, | | | | 184, 24, 129, 225, 196, 189, 242, 93, 146, 71, 244, | | |||
| | | 70, 60, 126, 65, 115, 153, 237, 115, 208, 118, 200, | | | | 80, 200, 101, 146, 121, 104, 231, 115, 52, 244, 65, | | |||
| | | 145, 252, 244, 99, 169, 170, 156, 230, 45, 169, 205, | | | | 79, 117, 167, 80, 225, 57, 84, 110, 58, 138, 115, | | |||
| | | 23, 226, 55, 220, 42, 128, 2, 241] | | | | 157] | | |||
| +-----------+-------------------------------------------------------+ | +-----------+-------------------------------------------------------+ | |||
| The RSA private key (n, d) is then passed to the RSA signing | The RSA private key (n, d) is then passed to the RSA signing | |||
| function, which also takes the hash type, SHA-256, and the JWT Claim | function, which also takes the hash type, SHA-256, and the UTF-8 | |||
| Segment as inputs. The result of the signature is a byte array S, | representation of the JWT Signing Input as inputs. The result of the | |||
| which represents a big endian integer. In this example, S is: | signature is a byte array S, which represents a big endian integer. | |||
| In this example, S is: | ||||
| +--------+----------------------------------------------------------+ | +--------+----------------------------------------------------------+ | |||
| | Result | Value | | | Result | Value | | |||
| | Name | | | | Name | | | |||
| +--------+----------------------------------------------------------+ | +--------+----------------------------------------------------------+ | |||
| | S | [208, 141, 219, 44, 66, 129, 179, 230, 69, 120, 123, | | | S | [112, 46, 33, 137, 67, 232, 143, 209, 30, 181, 216, 45, | | |||
| | | 108, 203, 96, 182, 145, 66, 179, 198, 104, 43, 187, 199, | | | | 191, 120, 69, 243, 65, 6, 174, 27, 129, 255, 247, 115, | | |||
| | | 159, 175, 5, 217, 101, 109, 236, 88, 136, 193, 133, 79, | | | | 17, 22, 173, 209, 113, 125, 131, 101, 109, 66, 10, 253, | | |||
| | | 39, 162, 131, 58, 114, 133, 202, 171, 227, 135, 157, | | | | 60, 150, 238, 221, 115, 162, 102, 62, 81, 102, 104, 123, | | |||
| | | 123, 188, 90, 111, 66, 241, 38, 238, 59, 18, 125, 146, | | | | 0, 11, 135, 34, 110, 1, 135, 237, 16, 115, 249, 69, 229, | | |||
| | | 129, 14, 54, 183, 10, 221, 33, 105, 37, 173, 119, 239, | | | | 130, 173, 252, 239, 22, 216, 90, 121, 142, 232, 198, | | |||
| | | 92, 27, 232, 175, 173, 49, 21, 28, 252, 237, 183, 107, | | | | 109, 219, 61, 184, 151, 91, 23, 208, 148, 2, 190, 237, | | |||
| | | 98, 156, 113, 116, 162, 219, 53, 96, 44, 214, 175, 154, | | | | 213, 217, 217, 112, 7, 16, 141, 178, 129, 96, 213, 248, | | |||
| | | 61, 100, 175, 90, 118, 247, 42, 196, 45, 74, 217, 145, | | | | 4, 12, 167, 68, 87, 98, 184, 31, 190, 127, 249, 217, 46, | | |||
| | | 92, 39, 123, 224, 247, 171, 206, 203, 91, 167, 103, 57, | | | | 10, 231, 111, 36, 242, 91, 51, 187, 230, 244, 74, 230, | | |||
| | | 163, 87, 172, 67, 77, 255, 9, 218, 107, 62, 228, 71, | | | | 30, 177, 4, 10, 203, 32, 4, 77, 62, 249, 18, 142, 212, | | |||
| | | 239, 36, 246, 23, 96, 108, 28, 19, 179, 24, 167, 196, | | | | 1, 48, 121, 91, 212, 189, 59, 65, 238, 202, 208, 102, | | |||
| | | 42, 97, 198, 80, 241, 79, 31, 0, 85, 17, 50, 6, 143, | | | | 171, 101, 25, 129, 253, 228, 141, 247, 127, 55, 45, 195, | | |||
| | | 238, 214, 131, 246, 13, 49, 111, 30, 142, 182, 145, 200, | | | | 139, 159, 175, 221, 59, 239, 177, 139, 93, 163, 204, 60, | | |||
| | | 17, 127, 76, 236, 69, 66, 133, 198, 137, 103, 45, 3, 48, | | | | 46, 176, 47, 158, 58, 65, 214, 18, 202, 173, 21, 145, | | |||
| | | 123, 203, 17, 162, 1, 105, 133, 22, 105, 25, 63, 173, | | | | 18, 115, 160, 95, 35, 185, 232, 56, 250, 175, 132, 157, | | |||
| | | 186, 231, 206, 246, 22, 243, 250, 53, 237, 209, 36, 111, | | | | 105, 132, 41, 239, 90, 30, 136, 121, 130, 54, 195, 212, | | |||
| | | 168, 11, 40, 237, 179, 83, 125, 180, 84, 231, 129, 37, | | | | 14, 96, 69, 34, 165, 68, 200, 242, 122, 122, 45, 184, 6, | | |||
| | | 236, 172, 22, 234, 58, 198, 187, 124, 65, 145, 148, 227, | | | | 99, 209, 108, 247, 202, 234, 86, 222, 64, 92, 178, 33, | | |||
| | | 122, 177, 16, 176, 84, 28, 1, 141, 179, 57, 96, 232, | | | | 90, 69, 178, 194, 85, 102, 181, 90, 193, 167, 72, 160, | | |||
| | | 215, 51, 7, 49, 63, 195, 155, 94, 51, 22, 239, 90, 138, | | | | 112, 223, 200, 163, 42, 70, 149, 67, 208, 25, 238, 251, | | |||
| | | 207, 41, 62] | | | | 71] | | |||
| +--------+----------------------------------------------------------+ | +--------+----------------------------------------------------------+ | |||
| Base64url encoding the signature produces this value for the JWT | Base64url encoding the signature produces this value for the JWT | |||
| Crypto Segment: | Crypto Segment: | |||
| 0I3bLEKBs-ZFeHtsy2C2kUKzxmgru8efrwXZZW3sWIjBhU8nooM6coXKq-OHnXu8Wm9C8SbuOxJ9koEONrcK3SFpJa1371wb6K-tMRUc_O23a2KccXSi2zVgLNavmj1kr1p29yrELUrZkVwne-D3q87LW6dnOaNXrENN_wnaaz7kR-8k9hdgbBwTsxinxCphxlDxTx8AVREyBo_u1oP2DTFvHo62kcgRf0zsRUKFxolnLQMwe8sRogFphRZpGT-tuufO9hbz-jXt0SRvqAso7bNTfbRU54El7KwW6jrGu3xBkZTjerEQsFQcAY2zOWDo1zMHMT_Dm14zFu9ais8pPg | cC4hiUPoj9Eetdgtv3hF80EGrhuB__dzERat0XF9g2VtQgr9PJbu3XOiZj5RZmh7AAuHIm4Bh-0Qc_lF5YKt_O8W2Fp5jujGbds9uJdbF9CUAr7t1dnZcAcQjbKBYNX4BAynRFdiuB--f_nZLgrnbyTyWzO75vRK5h6xBArLIARNPvkSjtQBMHlb1L07Qe7K0GarZRmB_eSN9383LcOLn6_dO--xi12jzDwusC-eOkHWEsqtFZESc6BfI7noOPqvhJ1phCnvWh6IeYI2w9QOYEUipUTI8np6LbgGY9Fs98rqVt5AXLIhWkWywlVmtVrBp0igcN_IoypGlUPQGe77Rw | |||
| Combining these segments in the order Envelope.Claims.Signature with | Combining these segments in the order Header.Payload.Signature with | |||
| period characters between the segments yields this complete JWT (with | period characters between the segments yields this complete JWT using | |||
| line breaks for display purposes only): | the JWT Compact Serialization (with line breaks for display purposes | |||
| only): | ||||
| eyJhbGciOiJSUzI1NiJ9 | eyJhbGciOiJSUzI1NiJ9 | |||
| . | . | |||
| eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ | eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ | |||
| . | . | |||
| 0I3bLEKBs-ZFeHtsy2C2kUKzxmgru8efrwXZZW3sWIjBhU8nooM6coXKq-OHnXu8Wm9C8SbuOxJ9koEONrcK3SFpJa1371wb6K-tMRUc_O23a2KccXSi2zVgLNavmj1kr1p29yrELUrZkVwne-D3q87LW6dnOaNXrENN_wnaaz7kR-8k9hdgbBwTsxinxCphxlDxTx8AVREyBo_u1oP2DTFvHo62kcgRf0zsRUKFxolnLQMwe8sRogFphRZpGT-tuufO9hbz-jXt0SRvqAso7bNTfbRU54El7KwW6jrGu3xBkZTjerEQsFQcAY2zOWDo1zMHMT_Dm14zFu9ais8pPg | cC4hiUPoj9Eetdgtv3hF80EGrhuB__dzERat0XF9g2VtQgr9PJbu3XOiZj5RZmh7AAuHIm4Bh-0Qc_lF5YKt_O8W2Fp5jujGbds9uJdbF9CUAr7t1dnZcAcQjbKBYNX4BAynRFdiuB--f_nZLgrnbyTyWzO75vRK5h6xBArLIARNPvkSjtQBMHlb1L07Qe7K0GarZRmB_eSN9383LcOLn6_dO--xi12jzDwusC-eOkHWEsqtFZESc6BfI7noOPqvhJ1phCnvWh6IeYI2w9QOYEUipUTI8np6LbgGY9Fs98rqVt5AXLIhWkWywlVmtVrBp0igcN_IoypGlUPQGe77Rw | |||
| 13.2.2. Decoding | A.2.2. Decoding | |||
| Decoding the JWT from this example requires processing the JWT | Decoding the JWT from this example requires processing the JWT Header | |||
| Envelope Segment and Claim Segment exactly as done in the first | Segment and JWT Payload Segment exactly as done in the first example. | |||
| example. | ||||
| 13.2.3. Validating | A.2.3. Validating | |||
| Since the "alg" parameter in the envelope is "RS256", we validate the | Since the "alg" parameter in the header is "RS256", we validate the | |||
| RSA SHA-256 signature contained in the JWT Crypto Segment. If any of | RSA SHA-256 signature contained in the JWT Crypto Segment. If any of | |||
| the validation steps fail, the token MUST be rejected. | the validation steps fail, the token MUST be rejected. | |||
| First, we validate that the decoded envelope and claim segment | First, we validate that the decoded JWT Header Segment string is | |||
| strings are both legal JSON. | legal JSON. | |||
| If the payload represents a JWT Claims Object, we also validate that | ||||
| the decoded JWT Payload Segment string is legal JSON. | ||||
| Validating the JWT Crypto Segment is a little different from the | Validating the JWT Crypto Segment is a little different from the | |||
| previous example. First, we base64url decode the JWT Crypto Segment | previous example. First, we base64url decode the JWT Crypto Segment | |||
| to produce a signature S to check. We then pass (n, e), S and the | to produce a signature S to check. We then pass (n, e), S and the | |||
| JWT Claim Segment to an RSA signature verifier that has been | UTF-8 representation of the JWT Signing Input to an RSA signature | |||
| configured to use the SHA-256 hash function. | verifier that has been configured to use the SHA-256 hash function. | |||
| 13.3. JWT using ECDSA P-256 SHA-256 | A.3. JWT using ECDSA P-256 SHA-256 | |||
| 13.3.1. Encoding | A.3.1. Encoding | |||
| The Decoded JWT Claim Segment used in this example is the same as in | The Decoded JWT Payload Segment used in this example is the same as | |||
| the previous examples: | in the previous examples: | |||
| {"iss":"joe", | {"iss":"joe", | |||
| "exp":1300819380, | "exp":1300819380, | |||
| "http://example.com/is_root":true} | "http://example.com/is_root":true} | |||
| Since the JWT Claim Segment will therefore be the same, its | Since the JWT Payload Segment will therefore be the same, its | |||
| computation is not repeated here. However, the Decoded JWT Envelope | computation is not repeated here. However, the Decoded JWT Header | |||
| Segment is differs from the previous example because a different | Segment is differs from the previous example because a different | |||
| algorithm is being used. The Decoded JWT Envelope Segment used is: | algorithm is being used. The Decoded JWT Header Segment used is: | |||
| {"alg":"ES256"} | {"alg":"ES256"} | |||
| The following byte array contains the UTF-8 characters for the | The following byte array contains the UTF-8 characters for the | |||
| Decoded JWT Envelope Segment: | Decoded JWT Header Segment: | |||
| [123, 34, 97, 108, 103, 34, 58, 34, 69, 83, 50, 53, 54, 34, 125] | [123, 34, 97, 108, 103, 34, 58, 34, 69, 83, 50, 53, 54, 34, 125] | |||
| Base64url encoding this UTF-8 representation yields this JWT Envelope | Base64url encoding this UTF-8 representation yields this JWT Header | |||
| Segment value: | Segment value: | |||
| eyJhbGciOiJFUzI1NiJ9 | eyJhbGciOiJFUzI1NiJ9 | |||
| Concatenating the JWT Header Segment, a period character, and the JWT | ||||
| Payload Segment yields this JWT Signing Input value (with line breaks | ||||
| for display purposes only): | ||||
| eyJhbGciOiJFUzI1NiJ9 | ||||
| . | ||||
| eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ | ||||
| The UTF-8 representation of the JWT Signing Input is the following | ||||
| byte array: | ||||
| [101, 121, 74, 104, 98, 71, 99, 105, 79, 105, 74, 70, 85, 122, 73, | ||||
| 49, 78, 105, 74, 57, 46, 101, 121, 74, 112, 99, 51, 77, 105, 79, 105, | ||||
| 74, 113, 98, 50, 85, 105, 76, 65, 48, 75, 73, 67, 74, 108, 101, 72, | ||||
| 65, 105, 79, 106, 69, 122, 77, 68, 65, 52, 77, 84, 107, 122, 79, 68, | ||||
| 65, 115, 68, 81, 111, 103, 73, 109, 104, 48, 100, 72, 65, 54, 76, | ||||
| 121, 57, 108, 101, 71, 70, 116, 99, 71, 120, 108, 76, 109, 78, 118, | ||||
| 98, 83, 57, 112, 99, 49, 57, 121, 98, 50, 57, 48, 73, 106, 112, 48, | ||||
| 99, 110, 86, 108, 102, 81] | ||||
| The ECDSA key consists of a public part, the EC point (x, y), and a | The ECDSA key consists of a public part, the EC point (x, y), and a | |||
| private part d. The values of the ECDSA key used in this example, | private part d. The values of the ECDSA key used in this example, | |||
| presented as the byte arrays representing big endian integers are: | presented as the byte arrays representing big endian integers are: | |||
| +-----------+-------------------------------------------------------+ | +-----------+-------------------------------------------------------+ | |||
| | Parameter | Value | | | Parameter | Value | | |||
| | Name | | | | Name | | | |||
| +-----------+-------------------------------------------------------+ | +-----------+-------------------------------------------------------+ | |||
| | x | [48, 160, 66, 76, 210, 28, 41, 68, 131, 138, 45, 117, | | | x | [127, 205, 206, 39, 112, 246, 196, 93, 65, 131, 203, | | |||
| | | 201, 43, 55, 231, 110, 162, 13, 159, 0, 137, 58, 59, | | | | 238, 111, 219, 75, 123, 88, 7, 51, 53, 123, 233, 239, | | |||
| | | 78, 238, 138, 60, 10, 175, 236, 62] | | | | 19, 186, 207, 110, 60, 123, 209, 84, 69] | | |||
| | y | [224, 75, 101, 233, 36, 86, 217, 136, 139, 82, 179, | | | y | [199, 241, 68, 205, 27, 189, 155, 126, 135, 44, 223, | | |||
| | | 121, 189, 251, 213, 30, 232, 105, 239, 31, 15, 198, | | | | 237, 185, 238, 185, 244, 179, 105, 93, 110, 169, 11, | | |||
| | | 91, 102, 89, 105, 91, 108, 206, 8, 23, 35] | | | | 36, 173, 138, 70, 35, 40, 133, 136, 229, 173] | | |||
| | d | [243, 189, 12, 7, 168, 31, 185, 50, 120, 30, 213, 39, | | | d | [142, 155, 16, 158, 113, 144, 152, 191, 152, 4, 135, | | |||
| | | 82, 246, 12, 200, 154, 107, 229, 229, 25, 52, 254, 1, | | | | 223, 31, 93, 119, 233, 203, 41, 96, 110, 190, 210, | | |||
| | | 147, 141, 219, 85, 216, 247, 120, 1] | | | | 38, 59, 95, 87, 194, 19, 223, 132, 244, 178] | | |||
| +-----------+-------------------------------------------------------+ | +-----------+-------------------------------------------------------+ | |||
| The ECDSA private part d is then passed to an ECDSA signing function, | The ECDSA private part d is then passed to an ECDSA signing function, | |||
| which also takes the curve type, P-256, the hash type, SHA-256, and | which also takes the curve type, P-256, the hash type, SHA-256, and | |||
| the JWT Claim Segment as inputs. The result of the signature is the | the UTF-8 representation of the JWT Signing Input as inputs. The | |||
| EC point (R, S), where R and S are unsigned integers. In this | result of the signature is the EC point (R, S), where R and S are | |||
| example, the R and S values, given as byte arrays representing big | unsigned integers. In this example, the R and S values, given as | |||
| endian integers are: | byte arrays representing big endian integers are: | |||
| +--------+----------------------------------------------------------+ | +--------+----------------------------------------------------------+ | |||
| | Result | Value | | | Result | Value | | |||
| | Name | | | | Name | | | |||
| +--------+----------------------------------------------------------+ | +--------+----------------------------------------------------------+ | |||
| | R | [175, 11, 115, 42, 160, 182, 181, 28, 135, 222, 52, 154, | | | R | [14, 209, 33, 83, 121, 99, 108, 72, 60, 47, 127, 21, 88, | | |||
| | | 182, 237, 206, 137, 82, 20, 243, 7, 12, 164, 107, 72, | | | | 7, 212, 2, 163, 178, 40, 3, 58, 249, 124, 126, 23, 129, | | |||
| | | 236, 187, 241, 190, 26, 76, 32, 181] | | | | 154, 195, 22, 158, 166, 101] | | |||
| | S | [120, 23, 189, 205, 202, 13, 177, 187, 23, 47, 12, 227, | | | S | [197, 10, 7, 211, 140, 60, 112, 229, 216, 241, 45, 175, | | |||
| | | 237, 250, 230, 233, 245, 216, 9, 170, 24, 185, 198, 187, | | | | 8, 74, 84, 128, 166, 101, 144, 197, 242, 147, 80, 154, | | |||
| | | 193, 94, 158, 117, 167, 88, 153, 196] | | | | 143, 63, 127, 138, 131, 163, 84, 213] | | |||
| +--------+----------------------------------------------------------+ | +--------+----------------------------------------------------------+ | |||
| Concatenating the S array to the end of the R array and base64url | Concatenating the S array to the end of the R array and base64url | |||
| encoding the result produces this value for the JWT Crypto Segment: | encoding the result produces this value for the JWT Crypto Segment: | |||
| rwtzKqC2tRyH3jSatu3OiVIU8wcMpGtI7LvxvhpMILV4F73Nyg2xuxcvDOPt-ubp9dgJqhi5xrvBXp51p1iZxA | DtEhU3ljbEg8L38VWAfUAqOyKAM6-Xx-F4GawxaepmXFCgfTjDxw5djxLa8ISlSApmWQxfKTUJqPP3-Kg6NU1Q | |||
| Combining these segments in the order Envelope.Claims.Signature with | Combining these segments in the order Header.Payload.Signature with | |||
| period characters between the segments yields this complete JWT (with | period characters between the segments yields this complete JWT using | |||
| line breaks for display purposes only): | the JWT Compact Serialization (with line breaks for display purposes | |||
| only): | ||||
| eyJhbGciOiJFUzI1NiJ9 | eyJhbGciOiJFUzI1NiJ9 | |||
| . | . | |||
| eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ | eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ | |||
| . | . | |||
| rwtzKqC2tRyH3jSatu3OiVIU8wcMpGtI7LvxvhpMILV4F73Nyg2xuxcvDOPt-ubp9dgJqhi5xrvBXp51p1iZxA | DtEhU3ljbEg8L38VWAfUAqOyKAM6-Xx-F4GawxaepmXFCgfTjDxw5djxLa8ISlSApmWQxfKTUJqPP3-Kg6NU1Q | |||
| 13.3.2. Decoding | ||||
| Decoding the JWT from this example requires processing the JWT | A.3.2. Decoding | |||
| Envelope Segment and Claim Segment exactly as done in the first | ||||
| example. | ||||
| 13.3.3. Validating | Decoding the JWT from this example requires processing the JWT Header | |||
| Segment and JWT Payload Segment exactly as done in the first example. | ||||
| Since the "alg" parameter in the envelope is "ES256", we validate the | A.3.3. Validating | |||
| Since the "alg" parameter in the header is "ES256", we validate the | ||||
| ECDSA P-256 SHA-256 signature contained in the JWT Crypto Segment. | ECDSA P-256 SHA-256 signature contained in the JWT Crypto Segment. | |||
| If any of the validation steps fail, the token MUST be rejected. | If any of the validation steps fail, the token MUST be rejected. | |||
| First, we validate that the decoded envelope and claim segment | First, we validate that the decoded JWT Header Segment string is | |||
| strings are both legal JSON. | legal JSON. | |||
| If the payload represents a JWT Claims Object, we also validate that | ||||
| the decoded JWT Payload Segment string is legal JSON. | ||||
| Validating the JWT Crypto Segment is a little different from the | Validating the JWT Crypto Segment is a little different from the | |||
| first example. First, we base64url decode the JWT Crypto Segment as | first example. First, we base64url decode the JWT Crypto Segment as | |||
| in the previous examples but we then need to split the 64 member byte | in the previous examples but we then need to split the 64 member byte | |||
| array that must result into two 32 byte arrays, the first R and the | array that must result into two 32 byte arrays, the first R and the | |||
| second S. We then pass (x, y), (R, S) and the JWT Claim Segment to an | second S. We then pass (x, y), (R, S) and the UTF-8 representation of | |||
| ECDSA signature verifier that has been configured to use the P-256 | the JWT Signing Input to an ECDSA signature verifier that has been | |||
| curve with the SHA-256 hash function. | configured to use the P-256 curve with the SHA-256 hash function. | |||
| As explained in Section 8.3, the use of the k value in ECDSA means | As explained in Section 8.3, the use of the k value in ECDSA means | |||
| that we cannot validate the correctness of the signature in the same | that we cannot validate the correctness of the signature in the same | |||
| way we validated the correctness of the HMAC. Instead, | way we validated the correctness of the HMAC. Instead, | |||
| implementations MUST use an ECDSA validator to validate the | implementations MUST use an ECDSA validator to validate the | |||
| signature. | signature. | |||
| 14. Appendix - Non-Normative - Notes on implementing base64url encoding | A.4. JWT using JSON Serialization | |||
| without padding | ||||
| Previous example JWTs shown have used the JWT Compact Serialization. | ||||
| This section contains an example JWT using the JWT JSON | ||||
| Serialization. This example demonstrates the capability for | ||||
| conveying multiple signatures for the same JWT. | ||||
| A.4.1. Encoding | ||||
| The Decoded JWT Payload Segment used in this example is the same as | ||||
| in the previous examples: | ||||
| {"iss":"joe", | ||||
| "exp":1300819380, | ||||
| "http://example.com/is_root":true} | ||||
| Two signatures are used in this JWT: an RSA SHA-256 signature, for | ||||
| which the header and signature values are the same as in | ||||
| Appendix A.2, and an ECDSA P-256 SHA-256 signature, for which the | ||||
| header and signature values are the same as in Appendix A.3. The two | ||||
| Decoded JWT Header Segments used are: | ||||
| {"alg":"RS256"} | ||||
| and: | ||||
| {"alg":"ES256"} | ||||
| Since the computations for all JWT Token Segments used in this | ||||
| example were already presented in previous examples, they are not | ||||
| repeated here. | ||||
| A JSON Serialization of this JWT is as follows: | ||||
| {"header":[ | ||||
| "eyJhbGciOiJSUzI1NiJ9", | ||||
| "eyJhbGciOiJFUzI1NiJ9"], | ||||
| "payload":"eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ", | ||||
| "signature":[ | ||||
| "cC4hiUPoj9Eetdgtv3hF80EGrhuB__dzERat0XF9g2VtQgr9PJbu3XOiZj5RZmh7AAuHIm4Bh-0Qc_lF5YKt_O8W2Fp5jujGbds9uJdbF9CUAr7t1dnZcAcQjbKBYNX4BAynRFdiuB--f_nZLgrnbyTyWzO75vRK5h6xBArLIARNPvkSjtQBMHlb1L07Qe7K0GarZRmB_eSN9383LcOLn6_dO--xi12jzDwusC-eOkHWEsqtFZESc6BfI7noOPqvhJ1phCnvWh6IeYI2w9QOYEUipUTI8np6LbgGY9Fs98rqVt5AXLIhWkWywlVmtVrBp0igcN_IoypGlUPQGe77Rw", | ||||
| "DtEhU3ljbEg8L38VWAfUAqOyKAM6-Xx-F4GawxaepmXFCgfTjDxw5djxLa8ISlSApmWQxfKTUJqPP3-Kg6NU1Q"] | ||||
| } | ||||
| A.4.2. Decoding | ||||
| Decoding the JWT first requires removing the base64url encoding from | ||||
| the array of JWT Header Segments, the JWT Payload Segment, and the | ||||
| array of JWT Crypto Segments. We base64url decode the segments per | ||||
| Section 7 and turn them into the corresponding byte arrays. We | ||||
| translate the header segment byte arrays containing UTF-8 encoded | ||||
| characters into Decoded JWT Header Segment strings. Likewise, if the | ||||
| payload represents a JWT Claims Object, we translate the payload | ||||
| segment byte array into a Decoded JWT Claims Object string. | ||||
| A.4.3. Validating | ||||
| If any of the validation steps fail, the token MUST be rejected. | ||||
| First, we validate that the header and signature arrays contain the | ||||
| same number of elements. | ||||
| Next, we validate that the Decoded JWT Header Segment strings are all | ||||
| legal JSON. | ||||
| If the payload represents a JWT Claims Object, we also validate that | ||||
| the decoded JWT Payload Segment string is legal JSON. | ||||
| Finally, for each Decoded JWT Header Segment, we validate the | ||||
| corresponding signature using the algorithm specified in the "alg" | ||||
| parameter, which must be present. | ||||
| Appendix B. Notes on implementing base64url encoding without padding | ||||
| This appendix describes how to implement base64url encoding and | This appendix describes how to implement base64url encoding and | |||
| decoding functions without padding based upon standard base64 | decoding functions without padding based upon standard base64 | |||
| encoding and decoding functions that do use padding. | encoding and decoding functions that do use padding. | |||
| To be concrete, example C# code implementing these functions is shown | To be concrete, example C# code implementing these functions is shown | |||
| below. Similar code could be used in other languages. | below. Similar code could be used in other languages. | |||
| static string base64urlencode(byte [] arg) | static string base64urlencode(byte [] arg) | |||
| { | { | |||
| skipping to change at page 30, line 45 ¶ | skipping to change at page 40, line 45 ¶ | |||
| '=' padding characters are added; if the length mod 4 is 3, one '=' | '=' padding characters are added; if the length mod 4 is 3, one '=' | |||
| padding character is added; if the length mod 4 is 1, the input is | padding character is added; if the length mod 4 is 1, the input is | |||
| malformed. | malformed. | |||
| An example correspondence between unencoded and encoded values | An example correspondence between unencoded and encoded values | |||
| follows. The byte sequence below encodes into the string below, | follows. The byte sequence below encodes into the string below, | |||
| which when decoded, reproduces the byte sequence. | which when decoded, reproduces the byte sequence. | |||
| 3 236 255 224 193 | 3 236 255 224 193 | |||
| A-z_4ME | A-z_4ME | |||
| 15. Appendix - Non-Normative - Relationship of JWTs to SAML Tokens | Appendix C. Relationship of JWTs to SAML Tokens | |||
| SAML 2.0 [OASIS.saml-core-2.0-os] provides a standard for creating | SAML 2.0 [OASIS.saml-core-2.0-os] provides a standard for creating | |||
| tokens with much greater expressivity and more security options than | tokens with much greater expressivity and more security options than | |||
| supported by JWTs. However, the cost of this flexibility and | supported by JWTs. However, the cost of this flexibility and | |||
| expressiveness is both size and complexity. In addition, SAML's use | expressiveness is both size and complexity. In addition, SAML's use | |||
| of XML [W3C.CR-xml11-20021015] and XML DSIG [RFC3275] only | of XML [W3C.CR-xml11-20021015] and XML DSIG [RFC3275] only | |||
| contributes to the size of SAML tokens. | contributes to the size of SAML tokens. | |||
| JWTs are intended to provide a simple token format that is small | JWTs are intended to provide a simple token format that is small | |||
| enough to fit into HTTP headers and query arguments in URIs. It does | enough to fit into HTTP headers and query arguments in URIs. It does | |||
| this by supporting a much simpler token model than SAML and using the | this by supporting a much simpler token model than SAML and using the | |||
| JSON [RFC4627] object encoding syntax. It also supports securing | JSON [RFC4627] object encoding syntax. It also supports securing | |||
| tokens using Hash-based Message Authentication Codes (HMACs) and | tokens using Hash-based Message Authentication Codes (HMACs) and | |||
| digital signatures using a smaller (and less flexible) format than | digital signatures using a smaller (and less flexible) format than | |||
| XML DSIG. | XML DSIG. | |||
| Therefore, while JWTs can do some of the things SAML tokens do, JWTs | Therefore, while JWTs can do some of the things SAML tokens do, JWTs | |||
| are not intended as a full replacement for SAML tokens, but rather as | are not intended as a full replacement for SAML tokens, but rather as | |||
| a compromise token format to be used when space is at a premium. | a compromise token format to be used when space is at a premium. | |||
| 16. Appendix - Non-Normative - Relationship of JWTs to Simple Web | Appendix D. Relationship of JWTs to Simple Web Tokens (SWTs) | |||
| Tokens (SWTs) | ||||
| Both JWTs and Simple Web Tokens SWT [SWT], at their core, enable sets | Both JWTs and Simple Web Tokens SWT [SWT], at their core, enable sets | |||
| of claims to be communicated between applications. For SWTs, both | of claims to be communicated between applications. For SWTs, both | |||
| the claim names and claim values are strings. For JWTs, while claim | the claim names and claim values are strings. For JWTs, while claim | |||
| names are strings, claim values can be any JSON type. Both token | names are strings, claim values can be any JSON type. Both token | |||
| types offer cryptographic protection of their content: SWTs with HMAC | types offer cryptographic protection of their content: SWTs with HMAC | |||
| SHA-256 and JWTs with a choice of algorithms, including HMAC SHA-256, | SHA-256 and JWTs with a choice of algorithms, including HMAC SHA-256, | |||
| RSA SHA-256, and ECDSA P-256 SHA-256. | RSA SHA-256, and ECDSA P-256 SHA-256. The signed content of a SWT | |||
| must be a set of claims, whereas the payload of a JWT, in general, | ||||
| 17. References | can be any base64url encoded content. | |||
| 17.1. Normative References | ||||
| [FIPS.180-3] | ||||
| National Institute of Standards and Technology, "Secure | ||||
| Hash Standard (SHS)", FIPS PUB 180-3, October 2008. | ||||
| [FIPS.186-3] | ||||
| National Institute of Standards and Technology, "Digital | ||||
| Signature Standard (DSS)", FIPS PUB 186-3, June 2009. | ||||
| [RFC2045] Freed, N. and N. Borenstein, "Multipurpose Internet Mail | ||||
| Extensions (MIME) Part One: Format of Internet Message | ||||
| Bodies", RFC 2045, November 1996. | ||||
| [RFC2104] Krawczyk, H., Bellare, M., and R. Canetti, "HMAC: Keyed- | ||||
| Hashing for Message Authentication", RFC 2104, | ||||
| February 1997. | ||||
| [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | ||||
| Requirement Levels", BCP 14, RFC 2119, March 1997. | ||||
| [RFC3339] Klyne, G., Ed. and C. Newman, "Date and Time on the | ||||
| Internet: Timestamps", RFC 3339, July 2002. | ||||
| [RFC3447] Jonsson, J. and B. Kaliski, "Public-Key Cryptography | ||||
| Standards (PKCS) #1: RSA Cryptography Specifications | ||||
| Version 2.1", RFC 3447, February 2003. | ||||
| [RFC3629] Yergeau, F., "UTF-8, a transformation format of ISO | ||||
| 10646", STD 63, RFC 3629, November 2003. | ||||
| [RFC3986] Berners-Lee, T., Fielding, R., and L. Masinter, "Uniform | ||||
| Resource Identifier (URI): Generic Syntax", STD 66, | ||||
| RFC 3986, January 2005. | ||||
| [RFC4627] Crockford, D., "The application/json Media Type for | ||||
| JavaScript Object Notation (JSON)", RFC 4627, July 2006. | ||||
| [RFC4648] Josefsson, S., "The Base16, Base32, and Base64 Data | ||||
| Encodings", RFC 4648, October 2006. | ||||
| [RFC5226] Narten, T. and H. Alvestrand, "Guidelines for Writing an | ||||
| IANA Considerations Section in RFCs", BCP 26, RFC 5226, | ||||
| May 2008. | ||||
| [USA15] Davis, M., Whistler, K., and M. Duerst, "Unicode | ||||
| Normalization Forms", Unicode Standard Annex 15, 09 2009. | ||||
| 17.2. Informative References | ||||
| [CanvasApp] | ||||
| Facebook, "Canvas Applications", 2010. | ||||
| [JSS] Bradley, J. and N. Sakimura (editor), "JSON Simple Sign", | Appendix E. Acknowledgements | |||
| September 2010. | ||||
| [MagicSignatures] | The authors acknowledge that the design of JWTs was intentionally | |||
| Panzer (editor), J., Laurie, B., and D. Balfanz, "Magic | influenced by the design and simplicity of Simple Web Tokens [SWT]. | |||
| Signatures", August 2010. | Solutions for signing JSON tokens were also previously explored by | |||
| Magic Signatures [MagicSignatures], JSON Simple Sign [JSS], and | ||||
| Canvas Applications [CanvasApp], all of which influenced this draft. | ||||
| [OASIS.saml-core-2.0-os] | Appendix F. Document History | |||
| Cantor, S., Kemp, J., Philpott, R., and E. Maler, | ||||
| "Assertions and Protocol for the OASIS Security Assertion | ||||
| Markup Language (SAML) V2.0", OASIS Standard saml-core- | ||||
| 2.0-os, March 2005. | ||||
| [RFC3275] Eastlake, D., Reagle, J., and D. Solo, "(Extensible Markup | -01 | |||
| Language) XML-Signature Syntax and Processing", RFC 3275, | ||||
| March 2002. | ||||
| [RFC4122] Leach, P., Mealling, M., and R. Salz, "A Universally | o Draft incorporating consensus decisions reached at IIW. | |||
| Unique IDentifier (UUID) URN Namespace", RFC 4122, | ||||
| July 2005. | ||||
| [SWT] Hardt, D. and Y. Goland, "Simple Web Token (SWT)", | -00 | |||
| Version 0.9.5.1, November 2009. | ||||
| [W3C.CR-xml11-20021015] | o Public draft published before November 2010 IIW based upon the | |||
| Cowan, J., "Extensible Markup Language (XML) 1.1", W3C | JSON token convergence proposal incorporating input from several | |||
| CR CR-xml11-20021015, October 2002. | implementers of related specifications. | |||
| Authors' Addresses | Authors' Addresses | |||
| Michael B. Jones | Michael B. Jones | |||
| Microsoft | Microsoft | |||
| Email: mbj@microsoft.com | Email: mbj@microsoft.com | |||
| URI: http://self-issued.info/ | URI: http://self-issued.info/ | |||
| Dirk Balfanz | Dirk Balfanz | |||
| skipping to change at page 34, line 4 ¶ | skipping to change at page 42, line 32 ¶ | |||
| Yaron Y. Goland | Yaron Y. Goland | |||
| Microsoft | Microsoft | |||
| Email: yarong@microsoft.com | Email: yarong@microsoft.com | |||
| John Panzer | John Panzer | |||
| Email: jpanzer@google.com | Email: jpanzer@google.com | |||
| Nat Sakimura | Nat Sakimura | |||
| Nomura Research Institute | Nomura Research Institute | |||
| Email: n-sakimura@nri.co.jp | Email: n-sakimura@nri.co.jp | |||
| Paul Tarjan | ||||
| Email: paul.tarjan@facebook.com | ||||
| End of changes. 193 change blocks. | ||||
| 628 lines changed or deleted | 1024 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/ | ||||