В jwt-либах ещё постоянно хрень находят.
Которая туда вписана по стандарту.
С JWT были по крайней мере такие проблемы:
1) Есть волшебный тип подписи none, который может быть указан в токене. Такие токены всегда валидны по спеке, и если тип подписи не проверять — будет ой. Это в либах пофиксили таким образом, что если при проверке указывается ключ — они на тип none ругаются.
2) JWT умеет в симметричное и асимметричное шифрование. Если используется асимметричное шифрование, при генерации используется приватный ключ, при проверке — публичный. Проверка ожидает асимметричного шифрования и в функцию проверки передают публичный ключ примерно так проверитьТокен(токен, публичный ключ). Веселье наступало когда кто-то левый тупо юзал этот известный публичный ключ в качестве psk и генерировал токен с симметричным шифрованием — он тоже проходил через эту проверку по очевидным причинам. Решилось изменением апишечек библиотек и требованием уазания допустимых методов при проверке.
3) Вот сейчас в либе от Cisco (node-jose) нашли такую штуку, что если хедер при асимметричном шифровании указывает свой публичный ключ (в JWT так можно), то токен проходит проверку несмотря на то, какой ключ указан в проверке ручками. То есть там jose.JWS.createVerify('какой угодно ключ', {}).verify('самоподписанный jwt') всегда проходит. Пофиксили со сломом обратной совместимости.