$_SESSION es un array especial que se utiliza para almacenar información a través de los pedidos de páginas que realiza un usuario durante su visita a nuestra página o aplicación web. Mientras que la aplicación no se cierre, si existe un valor dentro de la sesión, el mismo persistirá entre las páginas que visite el usuario.
Aunque puede haber muchos usuarios en nuestra página al mismo tiempo, cada uno posee su propia sesión; esto se logra ya que PHP otorga a cada sesión un ID único que permite que cada visitante pueda acceder únicamente a la sesión que le fue asignada.
Los valores de sesión se almacenan en el servidor, en vez de la computadora del usuario, lo cual hace que esos datos sean más seguros que los que podemos obtener de una cookie por ejemplo.
Hay que tener en cuenta que las variables se sesión se encuentran en casi todos los lenguajes actuales, por lo que todo lo que leeran en este post puede ser usado en cualquier otro lenguaje, no solo PHP
Usando sesiones

Antes de poder almacenar datos en la sesión, es necesario inicializar el manejo de sesiones. Esto se realiza al comienzo del código PHP y debe ser declarado antes que cualquier texto, código HTML o JavaScript. Para inicializar la sesión se llama a la función session_start().
session_start() inicia la sesión entre el usuario y el servidor y permite que los valores que sean almacenados estén accesibles en próximos scripts. Por ejemplo, en el siguiente código, vamos a obtener el valor que fue guardado en la sesión, con la clave “usuario”.
Este es un ejemplo muy básico que demuestra cómo almacenar y obtener los valores de la sesión. Creamos una clave en el arreglo de sesión y luego podemos acceder al valor que hemos almacenado allí. Todo esto se podrá lograr, mientras la sesión del usuario permanezca activa.
Finalizando una sesión
Tan importante como inicializar una sesión, es terminarla. Incluso teniendo en cuenta que la sesión es una forma de almacenar datos de manera temporal, es muy importante limpiar los datos de sesión para maximizar la seguridad (sobre todo cuando se trabaja con datos sensibles). También es importante tener en cuenta que el limpiar una sesión alivia la carga en el servidor.
Para limpiar un dato de una sesión se utiliza la función unset().
También es posible eliminar todos los datos de la sesión al mismo tiempo, utilizando la función session_unset()
Ambas funciones afectan a los datos de sesión, pero no a la sesión misma. La sesión sigue abierta y podemos agregarle nuevos datos a ella. Si lo que queremos es cerrar definitivamente una sesión (cuando por ejemplo, un usuario hace “log off”), tenemos que usar la función session_destroy().
Es altamente recomendable destruir la sesión cuando sabemos que la misma no va a ser utilizada más, en lugar de limpiar los datos con session_unset(). Si sólo eliminamos los datos, la sesión permanece activa y código malicioso podría inyectarle datos a la misma.
Seguridad
A pesar de lo simples que son las sesiones, existen formas de utilizarlas que nos pueden traer problemas. Vamos a ver unos ejemplos de como evitarlos:
Time-outs
Los time-outs (o tiempos de espera) son muy importantes si tus usuarios se autentican en tu aplicación. Por ejemplo, un usuario inicia sesión en una computadora pública (un ciber café) y luego se va sin cerrar la sesión. ¿Cómo hacer para que el próximo usuario de esa computadora no acceda a la cuenta del usuario anterior?
Para resolver el problema, podemos utilizar el siguiente código:
El código verifica que si no hubo actividad por más de 600 segundos (10 minutos), el pedido se redireccione a la página logout.php.
Regenerar el ID de sesión
La función session_regenerate_id() crea un nuevo ID único para la sesión del usuario actual. Esto se utiliza cuando ocurren acciones importantes de autenticación (como el inicio de sesión o la modificación de datos del usuario). Indicar un nuevo ID de la sesión hace a la aplicación más segura, reduciendo el riesgo de ataques llamados “Session Hijacking”.
Utilizar un almacenamiento permanente
Las sesiones son un almacenamiento temporal, se pueden cerrar y al hacerlo los datos se pierden. Es necesario, utilizar bases de datos, para todo lo que sabemos que vamos a necesitar más adelante.