// eslint.config.jsimport jwt from'eslint-plugin-jwt';exportdefault[
jwt.configs.recommended,// or jwt.configs.strict for maximum security];
Custom Configuration
import jwt from'eslint-plugin-jwt';exportdefault[{plugins:{ jwt },rules:{// Critical - Algorithm attacks'jwt/no-algorithm-none':'error','jwt/no-algorithm-confusion':'error',// High - Verification and secrets'jwt/require-algorithm-whitelist':'warn','jwt/no-decode-without-verify':'warn','jwt/no-weak-secret':'error','jwt/no-hardcoded-secret':'error',// Medium - Best practices'jwt/require-expiration':'warn','jwt/require-issuer-validation':'warn','jwt/require-audience-validation':'warn',},},];
The no-algorithm-confusion rule detects when symmetric algorithms (HS256) are used with asymmetric keys (public keys).
// ❌ Vulnerable - Public key as HMAC secret
jwt.verify(token, publicKey,{algorithms:['HS256']});// ✅ Safe - Asymmetric algorithm with public key
jwt.verify(token, publicKey,{algorithms:['RS256']});
⚙️ Configuration Presets
Preset
Description
Rules
recommended
Balanced security
Critical=error, High=warn
strict
Maximum security (2025 research)
All 13 rules=error
legacy
Migration mode
Critical rules only
📚 Supported Libraries
Library
npm
Detection
jsonwebtoken
✅ Full
jose
✅ Full
express-jwt
✅ Full
@nestjs/jwt
✅ Full
jwks-rsa
✅ Full
jwt-decode
✅ Full
🤖 AI-Optimized Messages
Every rule uses formatLLMMessage for structured output:
🔒 CWE-347 OWASP:A02-Crypto CVSS:9.8 | Using alg:"none" bypasses signature verification
Fix: Remove "none" and use RS256, ES256, or other secure algorithms
https://nvd.nist.gov/vuln/detail/CVE-2022-23540