C’est le seul algorithme JWS que JWA marque comme obligatoire à implémenter (Required), et le choix par défaut de nombreux tutoriels et frameworks. Le tag de 32 octets est calculé sur header.payload avec le secret partagé ; la vérification le recalcule et le compare en temps constant.
Les secrets faibles sont le principal problème : la RFC 7518 exige des clés au moins aussi longues que le condensat (256 bits), mais les jetons signés avec des secrets courts ou issus d’un dictionnaire, comme secret, peuvent être cassés hors ligne à partir d’un seul jeton (hashcat en mode 16500, jwt_tool), après quoi l’attaquant crée des jetons arbitraires. Utilisez au moins 32 octets aléatoires, jamais un mot de passe, et vérifiez avec le vérificateur de secrets JWT.
HS256 convient lorsque le même service émet et vérifie les jetons. Pour des vérificateurs tiers, des microservices ou des clients publics, utilisez un algorithme asymétrique afin que les vérificateurs ne détiennent qu’une clé publique, et fixez l’algorithme pour chaque clé afin d’éviter toute confusion avec RS256.