Sólo cookies; por supuesto, no hay nada que te lo impida:
if (empty($_SESSION['ip']) {
$_SESSION['ip'] = $_SERVER['REMOTE_ADDR'];
} else {
if ($_SESSION['ip'] != $_SERVER['REMOTE_ADDR']) {
// IP changed
}
}
Tenga en cuenta que la identificación de un usuario por dirección IP es solo una medida provisional, y no lo consideraría relevante para la seguridad, por ejemplo. Las organizaciones grandes usan NAT, por lo que aparecerán varias computadoras con la misma dirección que Internet. A la inversa, por ejemplo La dirección IP de los usuarios móviles puede cambiar a menudo, así que no asuma automáticamente "la misma dirección IP == mismo usuario, diferente dirección IP == usuario diferente".
Otras preocupaciones: IPv4 e IPv6 de doble pila, Extensiones de privacidad de IPv6, etc.