Autenticación y autorización
Cuando una aplicación necesita controlar quién puede acceder a sus recursos, aparecen dos conceptos que suelen encontrarse juntos: autenticación y autorización.
La autenticación consiste en comprobar quién es el usuario. La autorización determina qué recursos o acciones puede utilizar después de identificarse.
OAuth y JWT pueden formar parte de estos procesos, pero no representan exactamente lo mismo.
1. ¿Qué es OAuth?
OAuth es un protocolo que permite delegar acceso a determinados recursos sin entregar directamente las credenciales de un usuario a la aplicación que solicita ese acceso.
Un caso conocido es el inicio de sesión mediante un proveedor externo. La aplicación redirige al usuario al proveedor correspondiente, donde se realiza la autenticación y se solicita autorización para el acceso requerido.
La idea general puede representarse así:
Aplicación -> Proveedor de identidad -> Autenticación y autorización -> Aplicación
OAuth se centra en la delegación de autorización. No debe confundirse con un formato de token.
2. ¿Qué es un JWT?
JWT (JSON Web Token) es un formato compacto para representar información que puede transmitirse entre partes como un objeto JSON codificado.
Un JWT suele contener un conjunto de claims y una firma que permite verificar la integridad del token cuando se utiliza un algoritmo de firma adecuado.
De forma simplificada:
Usuario autenticado
->
Servidor genera JWT
->
Cliente envía el JWT
->
Servidor valida el JWT
El hecho de que un token tenga formato JWT no significa por sí mismo que la aplicación sea segura. La seguridad depende también de cómo se emite, valida, almacena y utiliza.
3. OAuth y JWT no son lo mismo
Es común mencionar OAuth y JWT en la misma sección de una aplicación, pero cumplen funciones distintas.
OAuth define un mecanismo para delegar autorización. JWT define una forma de representar información dentro de un token.
Por esa razón, una implementación puede utilizar OAuth sin que todos sus tokens sean JWT, y una aplicación puede utilizar JWT sin implementar OAuth.
4. Flujo simplificado con OAuth
Un flujo de autorización puede representarse de manera general de la siguiente forma:
Usuario
->
Aplicación
->
Proveedor de autorización
->
Usuario autoriza el acceso
->
Aplicación recibe el resultado de la autorización
Los detalles concretos dependen del flujo y del proveedor utilizado. OAuth define los mecanismos necesarios para realizar esta delegación y proteger el intercambio de credenciales y tokens.
5. Uso de JWT en una API
En una API, un JWT puede utilizarse para representar la identidad o los permisos asociados a una solicitud.
Por ejemplo, una petición puede incluir un token mediante el encabezado HTTP Authorization:
Authorization: Bearer <token>
El servidor recibe la solicitud y valida el token antes de permitir el acceso al recurso correspondiente.
La lógica general puede expresarse así:
Petición HTTP
->
Validación del JWT
->
Identidad y claims disponibles
->
Comprobación de autorización
->
Acceso al recurso
6. La firma no oculta el contenido
Un error común consiste en asumir que un JWT firmado funciona como un mecanismo de cifrado.
La firma permite comprobar que el contenido no fue alterado y que el token fue emitido de acuerdo con el mecanismo de firma configurado. No significa que el contenido sea secreto.
Por eso no se debe tratar un JWT firmado como si fuera información cifrada.
7. Autenticación no significa autorización
Que un usuario haya iniciado sesión no implica que pueda realizar cualquier operación.
Una aplicación puede autenticar correctamente a un usuario y después comprobar si tiene permiso para acceder a un recurso concreto.
Podemos separarlo en dos preguntas:
¿Quién eres?
->
Autenticación
¿Qué puedes hacer?
->
Autorización
Esta separación ayuda a mantener clara la lógica de seguridad de una API o aplicación web.
Consideraciones
OAuth y JWT suelen aparecer juntos porque ambos forman parte de muchas arquitecturas modernas de autenticación y autorización, pero no deben confundirse.
OAuth define cómo una aplicación puede obtener acceso autorizado a recursos. JWT define una estructura para transportar información en forma de token.
Además, un JWT no vuelve segura a una aplicación por sí solo. La implementación debe validar correctamente los tokens y aplicar controles de autorización apropiados para cada recurso.
© Arturo Juárez Monroy