Sessão guardada no cliente
Se o crachá fica no navegador e o servidor confia nele como veio, o cliente decide quem é.
Para lembrar quem você é entre as páginas, o servidor pode guardar a sua sessão de dois jeitos. No jeito seguro, ele guarda os seus dados do lado dele e entrega ao navegador só um identificador difícil de adivinhar, que aponta para essa sessão. No jeito perigoso, ele coloca os próprios dados dentro de um texto que fica no navegador (um cookie), e confia neles como vêm.
Quando esse texto é só um JSON em base64, sem assinatura, mudá-lo é trivial. Decodifique, troque "role":"viewer" por "role":"admin" ou "user_id":7 por "user_id":1, recodifique, e o servidor acredita. Não é nem preciso quebrar nada: o crachá é editável porque está na sua mão.
A regra é a mesma dos cookies em geral: o servidor nunca deve confiar num dado que o cliente pode editar para decidir identidade ou permissão. Ou a sessão fica do lado do servidor (e o cookie é só um ponteiro aleatório), ou o blob que vai ao cliente é assinado e a assinatura é conferida, como num JWT bem feito.