Acabo de leer este artículo que tiene algunos años pero describe una forma inteligente de asegurar sus API REST. Esencialmente:
- Cada cliente tiene un par de claves públicas / privadas únicas
- Solo el cliente y el servidor conocen la clave privada; nunca se envía por cable
- Con cada solicitud, el cliente toma varias entradas (la solicitud completa en sí, la marca de tiempo actual y la clave privada) y las ejecuta a través de una función HMAC para producir un hash de la solicitud
- El cliente luego envía la solicitud normal (que contiene la clave pública) y el hash al servidor
- El servidor busca la clave privada del cliente (basada en la clave pública proporcionada) y realiza una comprobación de marca de tiempo (que ciertamente no entiendo) que verifica que la solicitud no sea víctima de un ataque de repetición
- Si todo está bien, entonces el servidor usa la clave privada y la misma función HMAC para generar su propio hash de la solicitud
- El servidor luego compara ambos hashes (el enviado por el cliente y el que generó); si coinciden, la solicitud se autentica y se le permite continuar
Luego me topé con JWT , que suena muy similar. Sin embargo, el primer artículo no menciona JWT en absoluto, por lo que me pregunto si JWT es diferente a la solución de autenticación anterior y, de ser así, cómo.
Respuestas:
Comencemos con una respuesta muy básica.
JWT (como se usa en el contexto de OAuth y OpenID) no requiere secretos compartidos entre el cliente y la API. Hay 3 componentes y pares de 2 comparten un secreto cada uno: cliente <-> servidor de identificación, servidor de identificación <-> API.
Esto mueve la mayor complejidad de la API al servidor de identificación, la API solo tiene que verificar que el token haya sido emitido por el servidor de identificación y no haya sido atemperado. Para verificar que la API verifique que la firma JWT sea válida con el secreto compartido único conocido entre el servidor de identificación y la API. ¡Eso es!
La forma en que el servidor de identificación valida la identidad del usuario puede variar ampliamente (en muchos casos es el antiguo par de nombre de usuario + contraseña a través de una conexión TLS), pero no tiene ningún efecto en su API.
TLS maneja la privacidad y seguridad del mensaje y el token en sí mismo al usar JWT, JWT ignora tales problemas.
fuente