Session Management and HTTP Cookies
O que é?
- O gerenciamento de sessão permite que você não precise ficar relogando nos sites ao fechar uma aba.
- É o processo que permite ao servidor lidar com múltiplas requisições de um mesmo usuário sem a necessidade de login constante.
- Websites mantêm uma sessão para cada usuário logado e criam uma nova sessão a cada login.
Funcionamento
- O servidor designa um session ID para o navegador para provar a identidade do usuário.
- A maioria dos websites utiliza cookies para comunicar essa informação de sessão nas requisições HTTP.
- O navegador armazena o cookie e o inclui em toda requisição para o mesmo servidor.
- Ao efetuar o log out, o servidor invalida o cookie de sessão, impedindo seu reuso.
Token-Based Authentication
- Diferente do gerenciamento de sessão tradicional, o sistema armazena a informação diretamente em um token.
- Permite que os servidores deduzam a identidade decodificando o token, sem precisar manter a sessão no lado do servidor.
Riscos e Proteção
- Risco: Possibilidade de modificar informações no token para logar como outra pessoa.
- Prevenção: Aplicações podem encriptar ou encodar tokens para que sejam lidos apenas pela aplicação ou terceiros autorizados.
- Integridade: Uso de assinaturas (signatures), que são strings geradas por uma chave secreta (secret key) conhecida apenas pelo servidor.
JSON Web Tokens (JWT)
Possui três componentes principais:
- Header: Identifica o algoritmo de assinatura (codificado em base64url-encoded).
- Payload: Contém informações sobre a identidade do usuário (codificado em base64url-encoded).
- Signature: Valida que o usuário não adulterou o token. É calculada concatenando header e payload, assinando-os com o algoritmo e a secret key.
Ataques e Vulnerabilidades
- Bypass de Assinatura: Algumas aplicações falham ao verificar a assinatura, permitindo assinaturas inválidas ou vazias.
- Manipulação do campo
alg:
- Atacantes podem especificar qual algoritmo usar se a aplicação não restringir o tipo.
- O suporte à opção
nonepermite que tokens com assinatura vazia sejam considerados válidos. - Troca de algoritmos (ex: mudar de RSA para HMAC para usar a chave pública como chave secreta).
- Brute-Forcing the Key: É possível tentar “chutar” a chave se ela não for complexa o suficiente, usando o algoritmo, payload e a assinatura resultante.
- Vazamento de Chave: Pode ocorrer através de outras vulnerabilidades como XXE ou SSRF.
- Leitura de Informações Sensíveis: Se o token não for encriptado, qualquer pessoa pode decodificar a base64 e ler o payload. O JWT oferece integridade, mas não necessariamente confidencialidade.