Assinatura presente mas não verificada
Uma assinatura só protege se alguém a conferir com uma chave secreta; presente e ignorada, não vale nada.
Para deixar um dado ir e voltar pelo cliente com segurança, assina-se: junto do payload vai um HMAC, uma marca calculada com uma chave secreta que só o servidor conhece. Ao receber, o servidor recalcula o HMAC e compara. Se bater, o payload não foi mexido; se não bater, recusa.
O erro comum não é a assinatura estar errada, é ela não ser conferida. O token chega como payload.assinatura, parece protegido, mas o código desserializa o payload e usa os campos sem nunca chamar a verificação. A marca vira enfeite. Como nada compara, você edita o payload e deixa a assinatura antiga (ou vazia): passa igual.
Duas variantes do mesmo buraco: chave fraca ou pública (o atacante assina o próprio payload) e verificação depois de já usar o dado. O certo é verificar antes de usar, com chave secreta forte, comparando em tempo constante (timingSafeEqual, ou hmac.compare_digest em Python) para não vazar o resultado pelo tempo.