JWT Não foi feito pra login
JWT não pode ser alterado nem revogado depois de ser emitido. Ele foi criado com a intenção de "prova de vida", apenas comprovar que você é você. Onde ele brilha? em autenticação entre serviços.
Qual o ideal para autenticação?
Sempre uso nos meus projetos o conceito de cookie de sessão. A maioria dos frameworks já oferece isso por padrão. No laravel não precisa ser configurado nada, no .NET é possível pelo services.ConfigureApplicationCookie(options).
Pedindo para o GPT como implementar em python ele deu 2 alternativas: com flask usando flask-session e com o django que já suporta no framework base.
Quais as melhores práticas?
O cookie deve ter somente um identificador (não devemos confiar nos dados que o usuário pode modificar) e persistir os dados via servidor.
O cookie deve ser HttpOnly e Secure=true. Uma configuração ideal seria assim:
Set-Cookie: session_id=RANDOM_STRONG_SESSION_TOKEN;
Domain=projeto.com;
Path=/;
Max-Age=64800; ou Expires=(timestamp);
HttpOnly;
Secure;
SameSite=Lax;
Mantenha a expiração o mais curta possível a menos que o usuário utilize o remember-me, eu gosto de configurar para 16 horas sem remember-me e 30 dias com.