Skip to main content

Las 3 mejores prácticas de seguridad para manejar JWT

Escrito por
feature jwt security

18 de diciembre de 2023

0 minutos de lectura
Top 3 JWT Security Best Practices for Your Apps

En el desarrollo web moderno, los JSON Web Tokens (JWT) se han convertido en un método popular para transmitir información de forma segura entre distintas partes. Se usan para la autenticación y la autorización, y a menudo para almacenar información de los usuarios. Sin embargo, el uso cada vez mayor de JWT también implica riesgos de seguridad que los desarrolladores deben conocer.

Como desarrollador, tienes la responsabilidad de garantizar la seguridad de tu aplicación y proteger los datos de los usuarios. En esta publicación del blog, hablaremos de las tres mejores prácticas de seguridad para manejar JWT. También compartiremos ejemplos prácticos en Python y te mostraremos cómo Snyk puede ayudarte a identificar y corregir vulnerabilidades de seguridad en tu aplicación.

Al terminar de leer esta publicación, entenderás mejor cómo manejar JWT de forma segura en tus aplicaciones y por qué es importante usar herramientas como Snyk para proteger tu código. ¡Comencemos!

Mejor práctica n.º 1: Mantén en secreto los JWT

Los JWT se usan ampliamente en las aplicaciones web modernas para la autenticación y la autorización. Sin embargo, si no se manejan correctamente, pueden representar un riesgo considerable para la seguridad de tu aplicación. En esta sección, hablaremos de la importancia de mantenerlos en secreto y de cómo hacerlo.

Por qué es importante mantener en secreto los JWT

Los JWT son, en esencia, objetos JSON firmados que contienen información sobre un usuario. Esta información puede incluir datos confidenciales, como identificadores de usuario, roles y permisos. Si un atacante obtiene un JWT, puede usarlo para suplantar al usuario y acceder a tu aplicación sin autorización.

Por eso, es fundamental mantener en secreto los JWT y garantizar que solo las partes autorizadas puedan acceder a ellos. Cuando pienses en la confidencialidad de los JWT, piensa en las cookies de sesión de una aplicación web tradicional: si un atacante te roba las cookies, puede suplantarte con facilidad y causar estragos.

Cómo mantener en secreto los JWT

El primer paso para mantener los JWT en secreto es garantizar que se transmitan de forma segura por la red. Para lograrlo, puedes usar HTTPS en todas las comunicaciones entre el cliente y el servidor.

El segundo paso es almacenar los JWT de forma segura en el cliente. Una opción es usar las marcas HttpOnly y Secure al enviar cookies al cliente. La marca HttpOnly impide que los scripts del lado del cliente accedan a la cookie, mientras que la marca Secure garantiza que solo se transmita por HTTPS.

Otra forma de almacenar los JWT de manera segura es usar mecanismos de almacenamiento del navegador, como sessionStorage o localStorage. Estos mecanismos permiten guardar datos en el navegador, donde otros dominios no pueden acceder a ellos. Sin embargo, ten cuidado. Si almacenas los JWT en sessionStorage o localStorage, el código JavaScript podrá acceder a ellos. Por eso, debes evaluar tu sitio web detenidamente para asegurarte de que no sea vulnerable a ataques de cross-site scripting (XSS), que podrían permitir que los atacantes comprometan tus JWT.

Por último, es fundamental garantizar que los JWT se validen correctamente en el servidor. Esto incluye comprobar la firma y verificar el contenido del token.

Ejemplo práctico: cómo Snyk puede detectar problemas de seguridad relacionados con mantener en secreto los JWT

Snyk es una herramienta de seguridad para desarrolladores que puede ayudarte a identificar problemas de seguridad relacionados con los JWT. Por ejemplo, Snyk puede detectar si tu aplicación usa algoritmos de cifrado débiles o no usa las marcas HttpOnly o Secure al enviar cookies al cliente.

Veamos un fragmento de código de ejemplo en Python:

from flask import Flask, jsonify, request
from flask_jwt_extended import JWTManager, jwt_required, create_access_token

app = Flask(__name__)

app.config['JWT_SECRET_KEY'] = 'super-secret'  # Keep your secret key safe and make sure it’s unique!
jwt = JWTManager(app)

@app.route('/login', methods=['POST'])
def login():
    username = request.json.get('username')
    password = request.json.get('password')

    # Check if the username and password are valid
    # ...

    # If the user is authenticated, create a JWT
    access_token = create_access_token(identity=username)

    return jsonify({'access_token': access_token}), 200

@app.route('/protected', methods=['GET'])
@jwt_required
def protected():
    return jsonify({'message': 'You are authorized!'}), 200

if __name__ == '__main__':
    app.run()

En este ejemplo, usamos la biblioteca Flask-JWT-Extended para crear y verificar JWT. Sin embargo, Snyk puede detectar si usamos algoritmos de cifrado inseguros o no validamos correctamente los JWT en el servidor.

Al usar una herramienta como Snyk, puedes garantizar la seguridad de tu aplicación y mantener tus JWT en secreto.

Mejor práctica n.º 2: Valida los JWT

Como mencionamos en la sección anterior, los JWT se usan para la autenticación y la autorización, y si se comprometen pueden producirse brechas de seguridad. Por eso, es fundamental validar los JWT antes de confiar en ellos.

Importancia de validar los JWT

La validación de los JWT garantiza que la solicitud entrante provenga de un usuario autenticado y autorizado. Confirma que el token no haya vencido ni se haya manipulado y que lo haya firmado quien lo emitió. Si el JWT no se valida correctamente, puede dar lugar a vulnerabilidades de seguridad, como accesos no autorizados y filtraciones de datos.

Cómo validar los JWT

Para validar los JWT, debes seguir estos pasos:

  1. Analiza el JWT para extraer el encabezado, la carga útil y la firma.

  2. Verifica la firma con la clave secreta o pública.

  3. Comprueba las notificaciones de vencimiento (exp) y de validez desde (nbf) para asegurarte de que el JWT sea válido.

  4. Verifica la notificación del emisor (iss) para asegurarte de que el JWT provenga de una parte de confianza.

  5. Verifica la notificación de audiencia (aud) para asegurarte de que el JWT esté destinado al destinatario correcto.

Python ofrece varias bibliotecas para validar JWT, como PyJWT, una implementación del estándar JWT para Python. A continuación, se muestra un ejemplo de cómo validar un JWT con PyJWT:

import jwt

token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyLCJleHAiOjE1MTYyMzkwMjJ9.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c"

try:
    decoded_token = jwt.decode(token, 'secret', algorithms=['HS256'], options={"verify_exp": True, "verify_iss": True, "verify_aud": True})
    print(decoded_token)
except jwt.ExpiredSignatureError:
    print("Token has expired")
except jwt.InvalidIssuerError:
    print("Invalid issuer")
except jwt.InvalidAudienceError:
    print("Invalid audience")
except jwt.InvalidTokenError:
    print("Invalid token")

En el ejemplo anterior, se usa el método jwt.decode() para decodificar y validar el token. El parámetro algorithms especifica qué algoritmos se deben usar para verificar la firma. El parámetro options especifica las comprobaciones adicionales que se deben realizar, como verificar el vencimiento, el emisor y la audiencia.

Ejemplo práctico: cómo Snyk puede detectar problemas de seguridad relacionados con la validación de JWT

Snyk ofrece una herramienta integral de análisis de seguridad que puede detectar problemas relacionados con la validación de JWT. Por ejemplo, Snyk puede analizar tu base de código para encontrar prácticas de validación inseguras, como usar un algoritmo inseguro o no verificar las notificaciones del emisor o de la audiencia. Snyk también puede detectar vulnerabilidades en las bibliotecas de terceros que se usan para validar JWT.

Con Snyk, los desarrolladores pueden garantizar que su base de código no tenga vulnerabilidades de seguridad relacionadas con la validación de JWT. Para comenzar a usar Snyk, pueden crear una cuenta gratis e integrarlo en su flujo de trabajo de desarrollo.

Mejor práctica n.º 3: Establece un tiempo de vencimiento para los JWT

Los JWT se usan ampliamente en las aplicaciones web modernas para transmitir información de forma segura entre distintas partes. Sin embargo, si no se protegen correctamente, pueden dar lugar a vulnerabilidades de seguridad que comprometan toda la aplicación. Una de las mejores prácticas para prevenir estas vulnerabilidades es establecer un tiempo de vencimiento para los JWT.

Importancia de establecer un tiempo de vencimiento para los JWT

Establecer un tiempo de vencimiento para los JWT es importante porque limita el período durante el cual se pueden usar. Una vez transcurrido ese plazo, el JWT deja de ser válido y el usuario debe obtener uno nuevo para acceder a la aplicación. Así se evita que los atacantes usen un JWT antiguo para acceder a la aplicación, incluso después de que el usuario haya cerrado sesión.

Cómo establecer un tiempo de vencimiento para los JWT

Para establecer un tiempo de vencimiento en un JWT, agrega una notificación de vencimiento a la carga útil. El valor de la notificación de vencimiento (exp) es una marca de tiempo Unix que representa cuándo vencerá el JWT. Al verificarlo, el servidor puede comprobar la notificación exp para asegurarse de que siga siendo válido.

Este es un ejemplo de cómo establecer un tiempo de vencimiento de 30 minutos para un JWT en Python:

import jwt
import datetime

# Set the expiration time to 30 minutes from now
exp_time = datetime.datetime.utcnow() + datetime.timedelta(minutes=30)

# Encode the JWT with the expiration claim
jwt.encode({'some_payload': 'some_value', 'exp': exp_time}, 'secret_key', algorithm='HS256')

Ejemplo práctico: cómo Snyk puede detectar problemas de seguridad

Snyk es una herramienta de seguridad para desarrolladores que puede ayudar a detectar problemas relacionados con el establecimiento de tiempos de vencimiento para los JWT. Por ejemplo, Snyk Open Source puede analizar las dependencias de tu aplicación para detectar vulnerabilidades conocidas, incluidas las relacionadas con los JWT.

Snyk Open Source también puede identificar si una aplicación usa una versión obsoleta o insegura de una biblioteca JWT. Mantener tus bibliotecas JWT actualizadas te permite asegurarte de que se corrijan las vulnerabilidades relacionadas con los JWT.

Paquetes de código abierto recomendados

Hay varios paquetes de código abierto que pueden ayudarte a establecer tiempos de vencimiento para los JWT en Python. Uno de ellos es PyJWT, que ofrece una interfaz sencilla para codificar y decodificar JWT, incluido el establecimiento del tiempo de vencimiento.

Para instalar PyJWT, puedes usar pip:

pip install PyJWT

Una vez instalado, puedes usar PyJWT para establecer el tiempo de vencimiento de un JWT:

import jwt
import datetime

# Set the expiration time to 30 minutes from now
exp_time = datetime.datetime.utcnow() + datetime.timedelta(minutes=30)

# Encode the JWT with the expiration claim using PyJWT
jwt.encode({'some_payload': 'some_value', 'exp': exp_time}, 'secret_key', algorithm='HS256')

En conclusión, establecer tiempos de vencimiento para los JWT es una práctica de seguridad fundamental que puede ayudar a prevenir vulnerabilidades en tu aplicación. Al usar herramientas como Snyk y paquetes de código abierto como PyJWT, puedes garantizar que tu aplicación sea segura y esté al día con las mejores prácticas de seguridad.

La importancia crítica de las mejores prácticas de seguridad para JWT

En resumen, seguir las mejores prácticas de seguridad para JWT es fundamental para garantizar la seguridad e integridad de tus aplicaciones web. Como vimos, manejar los JWT de forma incorrecta puede provocar vulnerabilidades y brechas graves, que pueden derivar en accesos no autorizados, filtraciones de datos y daños a la reputación. Si siguen las tres mejores prácticas de seguridad para manejar JWT, los desarrolladores pueden reducir significativamente la probabilidad de enfrentar estos riesgos.

  1. Almacenamiento seguro de JWT: Evita guardar JWT en el almacenamiento local o en cookies, y elige alternativas más seguras, como las cookies HTTP-only o la administración de sesiones del lado del servidor.

  2. Valida y verifica los JWT: Valida siempre los JWT al recibirlos y verifica su firma para asegurarte de que no hayan sido manipulados. Implementa un manejo adecuado de errores para procesar los tokens no válidos de forma segura.

  3. Usa algoritmos y cifrado sólidos: Elige algoritmos de cifrado robustos, como RS256, y administra tus claves privadas de forma segura para evitar la creación y modificación no autorizadas de tokens.

Refuerza la seguridad de tu aplicación con Snyk

Para reforzar aún más la seguridad de tus aplicaciones web, considera crear una cuenta en Snyk. Snyk es una potente herramienta de seguridad para desarrolladores que analiza tu código fuente, los paquetes de código abierto, las imágenes de contenedores y las configuraciones en la nube para detectar vulnerabilidades. Con Snyk Open Source, puedes identificar y corregir rápidamente problemas de seguridad en tus proyectos de Python y sus dependencias.

Por ejemplo, Snyk puede ayudarte a detectar si tu proyecto de Python usa una versión obsoleta o vulnerable de una biblioteca JWT y ofrecerte recomendaciones prácticas para actualizarla a una versión segura.

# Requirements.txt file in your Python project
pyjwt==1.7.1

Snyk podría notificarte que la versión 1.7.1 de pyjwt es vulnerable y sugerirte actualizarla a una versión más segura, como la 2.1.0.

# Updated Requirements.txt file
pyjwt==2.1.0

Al integrar Snyk en tu flujo de trabajo de desarrollo, puedes detectar y corregir problemas de seguridad de forma proactiva antes de que se vuelvan críticos, y así garantizar que tus aplicaciones sigan siendo seguras y cumplan con las normas.

Toma medidas hoy mismo

No dejes al azar la seguridad de tus aplicaciones web. Asegúrate de seguir las mejores prácticas para manejar JWT y crea una cuenta en Snyk para acceder a una solución de seguridad integral que te ayude a proteger tus aplicaciones frente a vulnerabilidades y riesgos. Con Snyk, puedes desarrollar con confianza y saber que tus aplicaciones son seguras y cumplen con los estándares del sector. Comienza hoy con una cuenta gratis para proteger tus aplicaciones web.