Es el único algoritmo JWS que JWA marca como obligatorio de implementar (Required), y el predeterminado de muchos tutoriales y frameworks. La etiqueta de 32 bytes se calcula sobre header.payload con el secreto compartido; la verificación la vuelve a calcular y la compara en tiempo constante.
El problema principal son los secretos débiles: el RFC 7518 exige claves de al menos la longitud del hash (256 bits), pero si un token se firma con un secreto corto o de diccionario, como secret, el secreto se puede averiguar sin conexión a partir de un solo token (modo 16500 de hashcat, jwt_tool), y después el atacante emite tokens arbitrarios. Usa 32 o más bytes aleatorios, nunca una contraseña, y compruébalo con el comprobador de secretos JWT.
HS256 encaja cuando el mismo servicio emite y verifica los tokens. Para verificadores externos, microservicios o clientes públicos, usa un algoritmo asimétrico para que los verificadores solo tengan una clave pública, y fija el algoritmo por clave para evitar la confusión con RS256.