24-La directiva @csrf (y el token CSRF)

 Excelente pregunta. Sí, estás en lo correcto al ver una similitud, pero conceptualmente son muy diferentes en su propósito, mecanismo y alcance.

Vamos a desglosarlo:

La directiva @csrf (y el token CSRF)

  • Propósito: Defensa contra CSRF (Cross-Site Request Forgery).

    • Problema que resuelve: Evita que un sitio web malicioso engañe a un usuario autenticado para que envíe una solicitud no deseada a tu aplicación (ej: cambiar su email, hacer una transferencia).

    • ¿Cómo funciona?

      1. Laravel genera un token único y secreto para la sesión del usuario.

      2. La directiva @csrf lo imprime en un campo oculto del formulario (<input type="hidden" name="_token" value="...">).

      3. Cuando se envía el formulario (POST, PUT, PATCH, DELETE), este token viaja con los datos.

      4. Laravel compara el token recibido con el almacenado en la sesión del usuario.

      5. Si coinciden: La solicitud es legítima y proviene de tu propio formulario. Procesa la petición.

      6. Si no coinciden: Laravel asume que es un ataque y rechaza la solicitud con un error 419.

  • Ámbito: Protección de formularios web dentro de una aplicación tradicional (con sesiones y cookies). Es específico de Laravel/PHP.


El Token JWT (JSON Web Token)

  • Propósito: Autenticación y Autorización.

    • Problema que resuelve: Permite que un usuario demuestre quién es y qué permisos tiene en cada solicitud, sin que el servidor tenga que guardar su estado (sesión). Es ideal para APIs y aplicaciones stateless.

    • ¿Cómo funciona?

      1. El usuario se autentica una vez (envía usuario y contraseña a un endpoint como /login).

      2. El servidor verifica las credenciales. Si son correctas, genera un JWT (firmado digitalmente con una clave secreta) y se lo devuelve al cliente. El JWT contiene "claims" o afirmaciones (ej: user_idexpiraciónroles).

      3. El cliente (una app móvil, un SPA con Vue/React) guarda ese JWT (normalmente en localStorage o una cookie segura).

      4. Para cada solicitud posterior a un endpoint protegido, el cliente envía el JWT en la cabecera Authorization: Bearer <tu-token-jwt>.

      5. El servidor verifica la firma digital del token. Si es válida y no ha expirado, extrae la información del usuario (ej: el user_id) del propio token para saber quién hace la request. No necesita guardar sesiones.

  • Ámbito: Autenticación para APIs y aplicaciones stateless. Es un estándar abierto (RFC 7519) que es independiente del lenguaje o framework.


Tabla Comparativa: @csrf vs. JWT

CaracterísticaToken CSRF (@csrf)Token JWT
Propósito PrincipalDefensa (Prevenir ataques CSRF)Autenticación (Identificar al usuario)
¿Qué protege?Formularios web de tu propia aplicaciónEndpoints de API o rutas protegidas
MecanismoCompara un token secreto de la sesión con el enviado por el formulario. Stateful.Verifica una firma digital criptográfica contenida en el token. Stateless.
Dónde se usaAplicaciones web tradicionales (con sesiones, MVC).APIs RESTful, SPAs, aplicaciones móviles, microservicios.
Dónde se envíaEn el cuerpo (body) de la solicitud HTTP (como un campo de formulario).En la cabecera (header) Authorization de la solicitud HTTP.
DependenciaRequiere que exista una sesión activa en el servidor.No requiere sesión en el servidor. La información está en el token.
AlcanceEspecífico de Laravel (y otros frameworks web con mecanismos similares, como Django CSRF token).Estándar de la industria (RFC 7519), universal para cualquier tecnología.

Conclusión y Relación

La similitud que ves es que ambos son "tokens", pero esa es prácticamente la única similitud. Resuelven problemas completamente distintos.

De hecho, ¡pueden llegar a usarse juntos en una misma aplicación!

  • Escenario: Una aplicación híbrida que tiene tanto vistas de Laravel Blade (con formularios) como una API interna.

  • Ejemplo: Un formulario creado con Blade que envía datos mediante AJAX a una ruta de API de tu mismo Laravel.

    • Necesitarías el token CSRF (@csrf) para proteger el formulario contra ataques CSRF.

    • Y si tu API está protegida con el paquete laravel/sanctum o tymon/jwt-auth, también necesitarías incluir el JWT (o token de API) en la cabecera Authorization para autenticar al usuario.

En resumen:

  • @csrf: "Oye, servidor, soy el formulario legítimo que tú mismo generaste. Confía en que esta solicitud viene de mí."

  • JWT: "Oye, servidor, soy el usuario 'Juan'. Aquí está mi credencial firmada que prueba mi identidad.

Comentarios

Entradas más populares de este blog

1-Autenticación JWT en PHP: Explicación y Ejemplo

8-JWT en 10 minutos - ¿Qué es JWT? ¿Para que sirve? ¿Cuando usarlo? ¿Cómo se usa?

2-JSON Web Tokens