Compartir cookies entre subdominios es una técnica esencial cuando gestionas múltiples subdominios bajo un dominio principal y necesitas mantener una sesión de usuario o compartir cierta información entre ellos. En PHP, esta tarea es relativamente sencilla utilizando algunas configuraciones específicas para las cookies.
Antes de adentrarnos en los detalles técnicos de cómo compartir cookies, es importante recordar qué es una cookie. Una cookie es un pequeño archivo que los servidores web envían a los navegadores para almacenar información. Esta información puede ser leída en futuras solicitudes y es ampliamente usada para gestionar sesiones de usuario, preferencias, seguimiento de actividades, entre otras funciones.
Las cookies contienen varios parámetros importantes, entre ellos:
1. Nombre: El nombre de la cookie.
2. Valor: El valor almacenado en la cookie.
3. Fecha de expiración: Cuándo expira la cookie.
4. Ruta: El camino donde la cookie está disponible.
5. Dominio: El dominio o subdominios donde la cookie es válida.
6. Seguro: Indica si la cookie debe transmitirse solo a través de HTTPS.
7. HttpOnly: Indica si la cookie es accesible solo desde el servidor (no desde scripts como JavaScript).
Por defecto, las cookies están restringidas al dominio donde fueron creadas, lo que significa que una cookie establecida en example.com
no será accesible automáticamente en sub.example.com
, a menos que especifiques lo contrario.
Cuando trabajas con varios subdominios (por ejemplo, sub1.example.com
y sub2.example.com
), es posible que quieras compartir las cookies entre ellos para gestionar sesiones de usuario o compartir cierta información. Para lograr esto, es necesario establecer correctamente el parámetro Domain de la cookie.
La función principal que usaremos para establecer cookies en PHP es setcookie()
. Esta función permite definir las cookies y sus parámetros.
setcookie()
bool setcookie ( string $nombre , string $valor = "" , int $expiracion = 0 , string $ruta = "" , string $dominio = "" , bool $seguro = false , bool $httponly = false )
true
, la cookie solo se transmitirá a través de HTTPS.
true
, la cookie solo será accesible desde HTTP (y no desde JavaScript).
Para compartir una cookie entre los subdominios de example.com
, debes configurar el parámetro $dominio de la siguiente manera:
<?php
// Establecer una cookie válida para todos los subdominios de example.com
$nombre = "usuario";
$valor = "Juan Perez";
$expiracion = time() + 86400; // 1 día
$ruta = "/";
$dominio = ".example.com"; // El punto inicial asegura que se aplique a todos los subdominios
// Configurar la cookie
setcookie($nombre, $valor, $expiracion, $ruta, $dominio, true, true);
?>
En este ejemplo:
/
).
$dominio = ".example.com"
, lo que hace que la cookie esté disponible tanto en el dominio principal (example.com
) como en sus subdominios (sub1.example.com
, sub2.example.com
, etc.).
true
, lo que significa que esta cookie solo se enviará a través de conexiones HTTPS.
true
para que la cookie no sea accesible desde scripts JavaScript.
El punto al inicio del dominio (.example.com
) es esencial para que la cookie sea compartida entre todos los subdominios. Si omites el punto inicial y configuras el dominio simplemente como example.com
, la cookie solo será accesible en el dominio principal, pero no en sus subdominios.
Cuando trabajas con cookies, especialmente al compartirlas entre subdominios, es importante tener en cuenta algunos aspectos de seguridad:
1. Usar HTTPS siempre que sea posible: Asegúrate de que las cookies se envíen solo a través de conexiones seguras utilizando el parámetro secure en true
. Esto evita que la información se transmita de manera insegura.
2. HttpOnly para evitar ataques XSS: Al establecer la opción HttpOnly a true
, se garantiza que las cookies no sean accesibles desde JavaScript, lo que reduce el riesgo de ataques de tipo Cross-Site Scripting (XSS).
3. SameSite Attribute: Aunque no está disponible en la función setcookie()
de PHP por defecto (hasta versiones recientes), es recomendable añadir el atributo SameSite para controlar si las cookies deben ser enviadas con solicitudes entre sitios (cross-site) o solo con solicitudes dentro del mismo sitio. Este atributo puede ayudar a prevenir ataques de tipo Cross-Site Request Forgery (CSRF). A partir de PHP 7.3, puedes configurar SameSite
utilizando la función setcookie()
o las cabeceras HTTP:
setcookie("usuario", "Juan Perez", [
'expires' => time() + 86400,
'path' => '/',
'domain' => '.example.com',
'secure' => true,
'httponly' => true,
'samesite' => 'Strict', // Puede ser 'Strict', 'Lax', o 'None'
]);
El valor Strict
asegura que la cookie no se envíe en solicitudes de terceros, mientras que Lax
permite cierta flexibilidad, como solicitudes GET.
Compartir cookies entre subdominios en PHP es una técnica útil cuando necesitas mantener sesiones o compartir información entre diferentes subdominios de un mismo sitio web. A través de la función setcookie()
y configurando correctamente el dominio, puedes lograr que las cookies sean accesibles en todos los subdominios de tu aplicación.
Recuerda siempre considerar los aspectos de seguridad, como el uso de HTTPS, el atributo HttpOnly y SameSite, para garantizar que las cookies no se utilicen de manera indebida o comprometan la seguridad de tu aplicación.
Con estas técnicas, tendrás un mejor control sobre la gestión de sesiones y otras funcionalidades que requieran el uso compartido de cookies entre subdominios.
Jorge García
Fullstack developer