Autenticación Bearer (Token):
La autenticación es un componente crítico de la seguridad en las aplicaciones web. Es el proceso que permite verificar la identidad de los usuarios y asegurar que solo los usuarios autorizados tengan acceso a ciertos recursos. En el protocolo HTTP, existen varios métodos de autenticación, cada uno con sus propias características, ventajas y desventajas. Veamos la autenticación Bearer.
Esta autenticación se basa en el uso de tokens, como un token JWT (JSON Web Token). El token se pasa en la cabecera de la solicitud HTTP.
Cómo Funciona:
- Obtener Token: Primero, el cliente debe obtener un token de acceso. Esto puede hacerse a través de un proceso de inicio de sesión, donde el cliente envía sus credenciales a un servidor de autenticación, y como respuesta recibe un token.
- Enviar Token en la Cabecera: Una vez que el cliente
tiene un token, lo incluye, cada vez que necesite solicitar un servicio, en la cabecera
de la solicitud HTTP utilizando el esquema "Bearer".
Ejemplo:
Authorization: Bearer token_aquí
- Validación en el Servidor: El servidor recibe la solicitud y extrae el token de la cabecera. Luego, valida el token, asegurándose de que esté firmado correctamente y no haya expirado. Si el token es válido, el servidor procesa la solicitud. Si no lo es, responde con un error.
¿Qué es un token?
Un token de autorización es una cadena de caracteres que se utiliza para autenticar a un usuario en un sistema. Este token se genera luego de que el usuario se ha autenticado correctamente, y luego se utiliza para autorizar o denegar solicitudes de acceso a recursos.
JSON Web Tokens (JWT):
Consiste en tres partes: una cabecera, una carga útil y una firma.
1. La cabecera:
- alg: El algoritmo de firma utilizado. Puede ser uno de varios algoritmos de firma, como HMAC, RSA, o ECDSA. Por ejemplo, "HS256" significa HMAC con SHA-256, mientras que "RS256" indica RSA con SHA-256.
- typ: El tipo de token. Para un JWT, esto suele ser simplemente "JWT".
{
"alg": "HS256",
"typ": "JWT"
}
Importancia de la Cabecera:
- Selección del Algoritmo: La cabecera indica al servidor qué algoritmo debe utilizar para verificar la firma del token. El servidor puede confiar únicamente en su configuración y no en la cabecera del token para realizar la verificación, ya que un atacante podría modificar la cabecera.
- Interoperabilidad: Al especificar el tipo de token y el algoritmo de firma, la cabecera ayuda a garantizar que el cliente y el servidor puedan entender y procesar el token correctamente.
- Seguridad: El algoritmo de firma en la cabecera juega un papel vital en la seguridad del token, ya que asegura la integridad de la información contenida en el token. La elección del algoritmo debe hacerse con cuidado, ya que algunos algoritmos pueden tener vulnerabilidades conocidas.
Consideraciones de Seguridad:
- Algoritmo "none": Un valor "none" para el campo alg indica que el token no está firmado. Esto puede ser una vulnerabilidad si el servidor no está configurado correctamente y acepta tokens sin firma.
- Manipulación de la Cabecera: Un atacante podría tratar de manipular la cabecera para cambiar el algoritmo de firma. Por eso, es fundamental que el servidor no confíe en la cabecera para decidir cómo verificar la firma.
2. La carga útil:
Tipos de Reclamos:
- Reclamos Registrados: Estos son reclamos predefinidos con nombres reservados y significados específicos. Algunos ejemplos comunes incluyen:
- iss: Emisor del token.
- sub: Asunto del token (por lo general, el usuario al que representa).
- aud: Audiencia del token (a quién está destinado).
- exp: Fecha de vencimiento del token.
- iat: Hora en que se emitió el token.
- nbf: Hora antes de la cual el token no debe ser aceptado.
- Reclamos Públicos: Estos son reclamos que pueden ser definidos por quienes utilizan JWT pero que no están registrados. Deben seguir ciertas convenciones para evitar colisiones.
- Reclamos Privados: Estos son reclamos personalizados creados para compartir información entre partes que acuerdan usarlos y no están registrados ni son públicos.
{
"iss": "miaplicacion.com",
"sub": "1234567890",
"aud": "miaplicacion.com/usuarios",
"exp": 1617378490,
"name": "John Doe",
"admin": true
}
Importancia de la Carga Útil:
- Transmisión de Información: La carga útil lleva la información real que se quiere compartir entre el cliente y el servidor.
- Autorización: Puede contener detalles sobre los roles y permisos del usuario, que el servidor puede utilizar para determinar qué recursos puede acceder el cliente.
- Identificación: Ayuda en la identificación del usuario y puede incluir detalles como el ID de usuario, el nombre, el correo electrónico, etc.
Consideraciones de Seguridad:
- Confidencialidad: La carga útil de un JWT no está encriptada, solo codificada en base64. Si hay información sensible, debe considerarse la encriptación.
- Integridad: La carga útil es asegurada mediante la firma del token, pero la selección adecuada del algoritmo y la gestión segura de las claves son esenciales para mantener la integridad.
3. La firma:
Cómo Funciona la Firma:
- Concatenación: La firma se crea tomando la concatenación de la cabecera codificada en base64 y la carga útil codificada en base64.
- Aplicación del Algoritmo: Se aplica un algoritmo de firma (por ejemplo, HMAC con SHA-256) utilizando una clave secreta o un par de claves pública/privada, dependiendo del algoritmo seleccionado en la cabecera.
- Resultado: El resultado es una cadena que constituye la firma. Esta firma se adjunta al token, formando la tercera y última parte del JWT.
Verificación de la Firma:
Cuando el servidor recibe un JWT, verifica la firma de la siguiente manera:
- Extrae la cabecera y la carga útil.
- Concatena las dos partes y aplica el mismo algoritmo de firma utilizando la misma clave secreta o la clave pública correspondiente.
- Compara la firma calculada con la firma recibida en el token.
- Si coinciden, la firma es válida; de lo contrario, el token es rechazado.
Importancia de la Firma:
- Integridad: La firma asegura que el token no haya sido alterado en tránsito. Si alguien cambia cualquier parte de la cabecera o la carga útil, la firma ya no coincidirá.
- Autenticidad: La firma garantiza que el token haya sido creado por una fuente confiable. Solo la entidad que tiene la clave secreta correcta (o la clave privada, en el caso de algoritmos de clave asimétrica) puede crear una firma válida.
Consideraciones de Seguridad:
- Manejo de Claves: La seguridad de la firma depende del manejo seguro de las claves. Si un atacante obtiene acceso a la clave secreta o privada, puede crear y firmar tokens válidos.
- Selección de Algoritmo: La elección del algoritmo de firma es crucial. Algunos algoritmos algo antiguos o débiles pueden ser vulnerables a ataques.