HS256, HS384, HS512 (HMAC-SHA)
Symmetric: the same shared secret signs and verifies. Simple to deploy when one team owns both sides, but the verifier needs the signing key. Don't use HS* if any third party needs to verify your tokens — they'd need the secret too.
RS256, RS384, RS512 (RSA + SHA)
Asymmetric: issuer signs with a private key, anyone with the public key can verify. Standard for OIDC and public APIs because you can publish the public key via JWKS without leaking signing capability. Larger signatures than HMAC.
ES256, ES384, ES512 (ECDSA)
Asymmetric with elliptic curves. Smaller keys and signatures than RSA at equivalent security (ES256 ≈ RS3072). Increasingly the default for modern auth providers (Auth0, Firebase optionally).
EdDSA (Ed25519) — newest, fastest
Asymmetric. Modern curve, deterministic, immune to timing attacks. Use where supported.
alg: "none" — the trap
RFC 7519 allows an unsigned token where alg is the string "none" and the signature segment is empty. Libraries that accept this without explicit opt-in have a critical vulnerability: an attacker can forge any payload, set alg="none", and pass verification. Always pin the expected algorithm on the verifier; never trust the alg from the token header alone.