JSON Web Token

JSON Web Token (JWT, suggested pronunciation, same as the word "jot" ) is a proposed Internet standard for creating data with optional signature and/or optional encryption whose payload holds JSON that asserts some number of claims. The tokens are signed either using a private secret or a public/private key.

For example, a server could generate a token that has the claim "logged in as administrator" and provide that to a client. The client could then use that token to prove that it is logged in as admin. The tokens can be signed by one party's private key (usually the server's) so that any party can subsequently verify whether the token is legitimate. If the other party, by some suitable and trustworthy means, is in possession of the corresponding public key, they too are able to verify the token's legitimacy. The tokens are designed to be compact, URL-safe, and usable, especially in a web-browser single-sign-on (SSO) context. JWT claims can typically be used to pass identity of authenticated users between an identity provider and a service provider, or any other type of claims as required by business processes.

JWT relies on other JSON-based standards: JSON Web Signature and JSON Web Encryption.

Structure

 * Header
 * Identifies which algorithm is used to generate the signature. In the below example,  indicates that this token is signed using HMAC-SHA256.


 * Typical cryptographic algorithms used are HMAC with SHA-256 (HS256) and RSA signature with SHA-256 (RS256). JWA (JSON Web Algorithms) RFC 7518 introduces many more for both authentication and encryption.
 * Payload
 * Contains a set of claims. The JWT specification defines seven Registered Claim Names, which are the standard fields commonly included in tokens. Custom claims are usually also included, depending on the purpose of the token.
 * This example has the standard Issued At Time claim and a custom claim.
 * Signature
 * Securely validates the token. The signature is calculated by encoding the header and payload using Base64url Encoding and concatenating the two together with a period separator. That string is then run through the cryptographic algorithm specified in the header. This example uses HMAC-SHA256 with a shared secret (public key algorithms are also defined). The Base64url Encoding is similar to base64, but uses different non-alphanumeric characters and omits padding.
 * Signature
 * Securely validates the token. The signature is calculated by encoding the header and payload using Base64url Encoding and concatenating the two together with a period separator. That string is then run through the cryptographic algorithm specified in the header. This example uses HMAC-SHA256 with a shared secret (public key algorithms are also defined). The Base64url Encoding is similar to base64, but uses different non-alphanumeric characters and omits padding.

The three parts are encoded separately using Base64url Encoding, and concatenated using periods to produce the JWT:

The above data and the secret of "secretkey" creates the token:

(The above json strings are formatted without newlines or spaces, into utf-8 byte arrays. This is important as even slight changes in the data will effect the resulting token)

This resulting token can be easily passed into HTML and HTTP.

Use
In authentication, when a user successfully logs in, a JSON Web Token (JWT) is often returned. This token should be sent to the client using a secure mechanism like an HTTP-only cookie. Storing the JWT locally in browser storage mechanisms like local or session storage is discouraged. This is because JavaScript running on the client-side (including browser extensions) can access these storage mechanisms, exposing the JWT and compromising security. For unattended processes, the client may also authenticate directly by generating and signing its own JWT with a pre-shared secret and pass it to a OAuth compliant service like so: If the client passes a valid JWT assertion the server will generate an access_token valid for making calls to the application and pass it back to the client: When the client wants to access a protected route or resource, the user agent should send the JWT, typically in the  HTTP header using the   schema. The content of the header might look like the following: Authorization: Bearer eyJhbGci...&lt;snip&gt;...yu5CSpyHI This is a stateless authentication mechanism as the user state is never saved in server memory. The server's protected routes will check for a valid JWT in the Authorization header, and if it is present, the user will be allowed to access protected resources. As JWTs are self-contained, all the necessary information is there, reducing the need to query the database multiple times.

Implementations
JWT implementations exist for many languages and frameworks, including but not limited to:


 * .NET (C# VB.Net etc.)
 * C
 * Clojure
 * Common Lisp
 * Dart
 * Elixir
 * Erlang
 * Go
 * Haskell
 * Java
 * JavaScript
 * Lua
 * Node.js
 * OCaml
 * Perl
 * PHP
 * PL/SQL
 * PowerShell
 * Python
 * Racket
 * Raku
 * Ruby
 * Rust
 * Scala
 * Swift

Vulnerabilities
JSON web tokens may contain session state. But if project requirements allow session invalidation before JWT expiration, services can no longer trust token assertions by the token alone. To validate that the session stored in the token is not revoked, token assertions must be checked against a data store. This renders the tokens no longer stateless, undermining the primary advantage of JWTs.

Security consultant Tim McLean reported vulnerabilities in some JWT libraries that used the  field to incorrectly validate tokens, most commonly by accepting a   token. While these vulnerabilities were patched, McLean suggested deprecating the  field altogether to prevent similar implementation confusion. Still, new  vulnerabilities are still being found in the wild, with four CVEs filed in the 2018-2021 period having this cause.

With proper design, developers can address algorithm vulnerabilities by taking precautions:

Several JWT libraries were found to be vulnerable to an invalid Elliptic-curve attack in 2017.
 * 1) Never let the JWT header alone drive verification
 * 2) Know the algorithms (avoid depending on the alg field alone)
 * 3) Use an appropriate key size

Some have argued that JSON web tokens are difficult to use securely due to the many different encryption algorithms and options available in the standard, and that alternate standards should be used instead for both web frontends and backends.