Это единственный алгоритм JWS, помеченный в JWA как обязательный для реализации (Required), и алгоритм по умолчанию во многих руководствах и фреймворках. 32-байтовый тег вычисляется над header.payload с общим секретом; при проверке тег вычисляется заново и сравнивается за постоянное время.
Главная проблема — слабые секреты: RFC 7518 требует ключей не короче длины хеша (256 бит), но токены, подписанные коротким или словарным секретом вроде secret, можно взломать офлайн по одному-единственному токену (hashcat в режиме 16500, jwt_tool), после чего атакующий выпускает любые токены. Используйте 32 случайных байта или больше, но никогда не пароль, и проверяйте секрет инструментом проверки секретов JWT.
HS256 подходит, когда один и тот же сервис и выпускает, и проверяет токены. Для внешних проверяющих сторон, микросервисов или публичных клиентов используйте асимметричный алгоритм, чтобы у проверяющих сторон был только открытый ключ, и жёстко закрепите алгоритм за каждым ключом, чтобы избежать путаницы с RS256.