12-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?
Laravel genera un token único y secreto para la sesión del usuario.
La directiva
@csrflo imprime en un campo oculto del formulario (<input type="hidden" name="_token" value="...">).Cuando se envía el formulario (POST, PUT, PATCH, DELETE), este token viaja con los datos.
Laravel compara el token recibido con el almacenado en la sesión del usuario.
Si coinciden: La solicitud es legítima y proviene de tu propio formulario. Procesa la petición.
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?
El usuario se autentica una vez (envía usuario y contraseña a un endpoint como
/login).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_id,expiración,roles).El cliente (una app móvil, un SPA con Vue/React) guarda ese JWT (normalmente en
localStorageo una cookie segura).Para cada solicitud posterior a un endpoint protegido, el cliente envía el JWT en la cabecera
Authorization: Bearer <tu-token-jwt>.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ística | Token CSRF (@csrf) | Token JWT |
|---|---|---|
| Propósito Principal | Defensa (Prevenir ataques CSRF) | Autenticación (Identificar al usuario) |
| ¿Qué protege? | Formularios web de tu propia aplicación | Endpoints de API o rutas protegidas |
| Mecanismo | Compara 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 usa | Aplicaciones web tradicionales (con sesiones, MVC). | APIs RESTful, SPAs, aplicaciones móviles, microservicios. |
| Dónde se envía | En el cuerpo (body) de la solicitud HTTP (como un campo de formulario). | En la cabecera (header) Authorization de la solicitud HTTP. |
| Dependencia | Requiere que exista una sesión activa en el servidor. | No requiere sesión en el servidor. La información está en el token. |
| Alcance | Especí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/sanctumotymon/jwt-auth, también necesitarías incluir el JWT (o token de API) en la cabeceraAuthorizationpara 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
Publicar un comentario