Access Token e Refresh Token: como manter o usuário logado com segurança

Programação

Access Token e Refresh Token: como manter o usuário logado com segurança

Um problema prático de usar apenas um token com tempo de vida curto é ter que pedir para o usuário fazer login de novo a cada poucos minutos. A solução adotada pela maioria dos aplicativos modernos é separar a autenticação em dois tokens com funções diferentes: o access token e o refresh token.

O access token tem vida curta, geralmente entre 5 e 30 minutos, e é usado em cada requisição para provar que o usuário está autenticado. O refresh token, por sua vez, tem vida bem mais longa (dias ou semanas) e serve unicamente para buscar um novo access token quando o antigo expira, sem precisar pedir senha novamente.

Veja um exemplo simples de emissão e renovação desses tokens em PHP:

<?php
function emitirTokens(int $usuarioId, string $chaveSecreta): array {
    $accessToken = gerarJwt($usuarioId, $chaveSecreta);

    $refreshToken = bin2hex(random_bytes(48));
    salvarRefreshToken($usuarioId, hash('sha256', $refreshToken), '+30 days');

    return ['access_token' => $accessToken, 'refresh_token' => $refreshToken];
}

// endpoint responsavel por renovar o access token
$refreshEnviado = $_POST['refresh_token'] ?? '';
$registro = buscarRefreshTokenValido(hash('sha256', $refreshEnviado));

if (!$registro || $registro['expira_em'] < time()) {
    http_response_code(401);
    exit(json_encode(['erro' => 'Refresh token invalido ou expirado']));
}

// boa pratica: invalidar o token antigo e emitir um novo par
revogarRefreshToken($registro['id']);
$novosTokens = emitirTokens($registro['usuario_id'], $chaveSecreta);
echo json_encode($novosTokens);

Um detalhe que faz muita diferença na segurança é a rotação do refresh token: a cada uso, o token antigo é invalidado e um novo é emitido. Se, por algum motivo, um refresh token roubado for usado depois do legítimo, o sistema consegue perceber essa reutilização indevida e revogar toda a cadeia de tokens daquele usuário.

Esse modelo é hoje o padrão em aplicativos mobile e single-page applications, porque equilibra bem dois objetivos que parecem opostos: manter o usuário logado por muito tempo, sem abrir mão de conseguir revogar o acesso rapidamente quando necessário.

Fonte
Equipe Suadica

Veja também

Mais Dicas