Comenzando con jwt

JWT sin firmar

Un JWT sin firmar tiene el valor de encabezado alg: none y un componente JWS (firma) vacío:

eyJhbGciOiJub25lIn0
.eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ
.

El punto final indica que la firma está vacía.

Encabezado

{
  "alg": "none"
}

Carga útil

{
  "iss": "joe",
  "exp": 1300819380,
  "http://example.com/is_root": true
}

JWT firmado (JWS)

Un JWT firmado incluye una firma codificada en Base64 Url Safe como tercer componente. El algoritmo utilizado para generar la firma se indica en el encabezado.

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9
.eyJzdWIiOiJKb2huIERvZSIsImFkbWluIjp0cnVlLCJpYXQiOjE0NzAzNTM5OTQsImV4cCI6MTQ3MDM1NzYyNywianRpIjoiNmU0MDRiYTgtZjg4NS00ZDVmLWJmYTItZTNmNWEwODM4MGE0In0
.7CfBdVP4uKsb0cogYepCvMLm8rcpjBYW1XZzA-a5e44

Encabezado

{
  "typ": "JWT",
  "alg": "HS256"
}

Este JWT se firmó con el algoritmo HMAC-SHA256, por lo tanto alg: HS256.

Carga útil

{
  "sub": "John Doe",
  "admin": true,
  "iat": 1470353994,
  "exp": 1470357627,
  "jti": "6e404ba8-f885-4d5f-bfa2-e3f5a08380a4"
}

Este JWT se puede verificar con el secreto UTF-8 notsosecret.

¿Cómo saber si tienes un JWS o un JWE?

De la Sección 9 de la especificación de cifrado web JSON (RFC 7516):

El encabezado JOSE para un JWS se puede distinguir del encabezado JOSE para un JWE examinando el valor del parámetro de encabezado “alg” (algoritmo). Si el valor representa una firma digital o un algoritmo MAC, o es el valor “ninguno”, es para un JWS; si representa un algoritmo de cifrado de clave, envoltura de clave, acuerdo de clave directa, acuerdo de clave con envoltura de clave o cifrado directo, es para un JWE. (Extraer el valor “alg” para examinar es sencillo cuando se usa la serialización compacta JWS o la serialización compacta JWE y puede ser más difícil cuando se usa la serialización JWS JSON o la serialización JWE JSON).

Y

El encabezado JOSE para un JWS también se puede distinguir del encabezado JOSE para un JWE determinando si existe un miembro “enc” (algoritmo de cifrado). Si el miembro “enc” existe, es un JWE; de lo contrario, es un JWS.

JWS (firmado)##

{
  "alg": "HS256"
}

JUGAR (cifrado)

{
  "alg":"RSA1_5",
  "enc":"A256GCM",
  "iv":"__79_Pv6-fg",
  "x5t":"7noOPq-hJ1_hCnvWh6IeYI2w9Q0"
}

Cifrado web JSON (PLAY)

JSON Web Encryption (JWE) representa contenido cifrado utilizando estructuras de datos basadas en notación de objetos JavaScript (JSON). Define una forma de cifrar los datos de sus reclamos para que solo el receptor previsto pueda leer la información presente en un token.

En la serialización JWE JSON, un JWE se representa como un objeto JSON que contiene algunos o todos estos ocho miembros:

  "protected", with the value BASE64URL(UTF8(JWE Protected Header))
  "unprotected", with the value JWE Shared Unprotected Header
  "header", with the value JWE Per-Recipient Unprotected Header
  "encrypted_key", with the value BASE64URL(JWE Encrypted Key)
  "iv", with the value BASE64URL(JWE Initialization Vector)
  "ciphertext", with the value BASE64URL(JWE Ciphertext)
  "tag", with the value BASE64URL(JWE Authentication Tag)
  "aad", with the value BASE64URL(JWE AAD)

Las seis cadenas de resultados codificadas en base64url y los dos JSON desprotegidos los valores de los objetos se representan como miembros dentro de un objeto JSON.

Ejemplo de JUEGO

El siguiente encabezado JWE de ejemplo declara que:

  • la clave de cifrado de contenido se cifra para el destinatario utilizando el algoritmo RSA-PKCS1_1.5 para producir la clave cifrada JWE

  • el texto sin formato se cifra utilizando el algoritmo AES-256-GCM para producir el texto cifrado JWE

  • se utilizó el vector de inicialización de 64 bits especificado con la codificación base64url __79_Pv6-fg

  • la huella digital del certificado X.509 que corresponde a la clave utilizada para cifrar el JWE tiene la codificación base64url 7noOPq-hJ1_hCnvWh6IeYI2w9Q0.

    { “alg”:“RSA1_5”, “enc”:“A256GCM”, “iv”:"__79_Pv6-fg", “x5t”:“7noOPq-hJ1_hCnvWh6IeYI2w9Q0” }

La codificación Base64url de los bytes de la representación UTF-8 del encabezado JWE produce este valor de encabezado JWE codificado (con saltos de línea solo para fines de visualización):

eyJhbGciOiJSU0ExXzUiLA0KICJlbmMiOiJBMjU2R0NNIiwNCiAiaXYiOiJfXzc5
X1B2Ni1mZyIsDQogIng1dCI6Ijdub09QcS1oSjFfaENudldoNkllWUkydzlRMCJ

Lea Especificación de cifrado web JSON (RFC 7516) para obtener más información

Qué almacenar en un JWT

El JWT RFC establece tres clases de reclamaciones:

  • Reclamos registrados como sub, iss, exp o nbf

  • Reclamaciones públicas con nombres públicos o nombres registrados por IANA que contienen valores que deben ser únicos como email, address o phone_number. Ver lista completa

  • Reclamos privados para usar en su propio contexto y los valores pueden colisionar

Ninguna de estas afirmaciones es obligatoria

Un JWT es autónomo y debe evitar el uso de la sesión del servidor que proporciona los datos necesarios para realizar la autenticación (sin necesidad de almacenamiento en el servidor ni acceso a la base de datos). Por lo tanto, la información de “roles” o “permisos” se puede incluir en reclamaciones privadas de JWT.

Reclamos registrados

Los siguientes Nombres de reclamación están registrados en el registro de “Reclamaciones de token web JSON” de la IANA establecido por Sección 10.1.

  • iss (emisor): identifica al principal que emitió el JWT.
  • sub (sujeto): identifica al principal que es el sujeto del JWT. Debe ser único
  • aud (audiencia): identifica los destinatarios a los que está destinado el JWT (matriz de cadenas/uri)
  • exp (hora de caducidad): identifica la hora de caducidad (UTC Unix) después de la cual ya no debe aceptar este token. Debe ser posterior a la fecha de emisión.
  • nbf(not before): identifica la hora UTC Unix antes de la cual no se debe aceptar el JWT
  • iat (emitido en): identifica la hora UTC Unix en la que se emitió el JWT
  • jti (JWT ID): proporciona un identificador único para el JWT.

Ejemplo

{
    "iss": "stackoverflow",
    "sub": "joe",
    "aud": ["all"],
    "iat": 1300819370,
    "exp": 1300819380,
    "jti": "3F2504E0-4F89-11D3-9A0C-0305E82C3301"
    "context": {
        "user": {
            "key": "joe",
            "displayName": "Joe Smith"
        },
        "roles":["admin","finaluser"]
    }
}