Serialización de datos para excluir campos sensibles en APIs

Clase 25 de 35Curso de Backend con NestJS

Resumen

Proteger la información sensible como contraseñas es esencial en el diseño de una API. Aunque apliquemos un proceso de hashing sobre el campo password, no tiene sentido devolverlo en la respuesta de los endpoints. Por eso, es fundamental serializar y excluir datos críticos de manera eficiente para fortalecer nuestra seguridad y mantener buenas prácticas de desarrollo.

¿Por qué es importante excluir campos sensibles al serializar en una API?

Excluir datos como contraseñas, incluso si están protegidos con hashing, ayuda a minimizar los riesgos de exposición de información. Así, evitamos que valores privados viajen en respuestas y mantenemos la API alineada con principios de responsabilidad y privacidad.

¿Cómo utilizar ClassTransformer y Exclude para proteger campos en entidades?

Para conseguir esto empleamos ClassTransformer, una herramienta muy útil en el contexto de APIs con Node.js. Lo más relevante es el decorador @Exclude, disponible a través de la importación desde ClassTransformer. Basta con aplicarlo al campo en cuestión dentro de la entidad para lograr que ese dato no se envíe en las respuestas automáticamente.

  • Importar Exclude del paquete ClassTransformer.
  • Agregar el decorador en la columna que deseamos omitir.
  • No hay pasos adicionales dentro de la entidad; un solo decorador resuelve el problema.

¿Cómo activar la serialización automática en toda la aplicación?

Agregar el decorador es solo el primer paso. Para que la API procese correctamente la exclusión en todas las respuestas hacer lo siguiente:

  1. Habilitar la transformación automática en el archivo principal (main) con la opción transform: true en el validator general.
  2. Configurar opciones de transformación adicional (como habilitar conversiones implícitas).
  3. Implementar un interceptor global con app.useGlobalInterceptor, importando ClassSerializerInterceptor desde NestJS.
  4. Incluir el Reflector de NestJS Core para completar la configuración.

Este patrón asegura la serialización y exclusión de campos en cada entidad sin afectar los métodos o endpoints existentes.

¿Qué ventajas tiene este enfoque global sobre la serialización manual?

Gracias a la serialización global, ya no es necesario modificar cada endpoint individualmente. Cualquier operación que retorne una entidad (como get, create, findOne) la enviará automáticamente serializada, sin el campo password. Esto simplifica la lógica y mejora el mantenimiento del código. Cualquier punto que utilice el repositorio y la entidad user obtiene la exclusión sin pasos adicionales.

¿Te interesa saber cómo adaptar este patrón a otros campos sensibles de tus entidades o te gustaría compartir tu experiencia mejorando la seguridad de las APIs? ¡Puedes comentar tu caso!