É o único algoritmo JWS que a JWA marca como de implementação obrigatória (Required), além de ser o padrão de muitos tutoriais e frameworks. A tag de 32 bytes é calculada sobre header.payload com o segredo compartilhado; a verificação a recalcula e a compara em tempo constante.
Segredos fracos são o principal problema: a RFC 7518 exige chaves com pelo menos o tamanho do hash (256 bits), mas tokens assinados com segredos curtos ou de dicionário, como secret, podem ser quebrados offline a partir de um único token (modo 16500 do hashcat, jwt_tool), e depois o atacante emite os tokens que quiser. Use 32 bytes aleatórios ou mais, nunca uma senha, e confira com o verificador de segredos JWT.
O HS256 é adequado quando o mesmo serviço emite e verifica os tokens. Para verificadores de terceiros, microsserviços ou clientes públicos, use um algoritmo assimétrico, para que os verificadores tenham só uma chave pública, e fixe o algoritmo por chave para evitar confusão com o RS256.