āļ§āļīāļāļĩāļāļĢāļ§āļāļŠāļāļāļĨāļēāļĒāđāļāđāļ JWT: HS256, RS256 āđāļĨāļ° ES256
āļ§āļīāļāļĩāļāļĢāļ§āļāļŠāļāļāļĨāļēāļĒāđāļāđāļ JWT
JWT āļāļģāļāļē claims āđāļāļĢāļđāļāđāļāļāļāđāļāļāļ§āļēāļĄāļāļĢāļĢāļĄāļāļē āļŠāļīāđāļāđāļāļĩāļĒāļ§āļāļĩāđāļāđāļāļāļāļąāļāļāļēāļĢāļāļĨāļāļĄāđāļāļĨāļāļāļ·āļāļĨāļēāļĒāđāļāđāļ āļŦāļēāļāđāļĄāđāļĄāļĩāļāļēāļĢāļāļĢāļ§āļāļŠāļāļ āļāļđāđāđāļāļĄāļāļĩāļŠāļēāļĄāļēāļĢāļāļŠāļĢāđāļēāļāđāļāđāļāđāļāļāļēāļĄāļāļģāđāļ āļāđāļāđāļĨāļ°āļāļĨāļāļĄāļāļąāļ§āđāļāđāļāļāļđāđāđāļāđāđāļāđ āđāļāđ āļāļđāđāļĄāļ·āļāļāļĩāđāļāļĢāļāļāļāļĨāļļāļĄāļāļąāļĨāļāļāļĢāļīāļāļķāļĄāļāļēāļĢāļĨāļāļāļēāļĄ JWT āļāļĩāđāļāļāļāđāļāļĒāļāļĩāđāļŠāļļāļāļŠāļēāļĄāđāļāļāđāļĨāļ°āļ§āļīāļāļĩāļāļēāļĢāļāļĢāļ§āļāļŠāļāļāđāļāđāļĨāļ°āđāļāļ
āļāļĢāļ°āļāļ§āļāļāļēāļĢāļāļĢāļ§āļāļŠāļāļ
āđāļĄāđāļ§āđāļēāļāļ°āđāļāđāļāļāļąāļĨāļāļāļĢāļīāļāļķāļĄāđāļ āļāļēāļĢāļāļĢāļ§āļāļŠāļāļāļĨāļēāļĒāđāļāđāļ JWT āļāļ°āļāļģāļāļēāļĄāļāļąāđāļāļāļāļāđāļāļĩāļĒāļ§āļāļąāļ:
- āđāļĒāļāđāļāđāļāđāļāļāļĩāđāļāļļāļ
.āđāļāļ·āđāļāđāļĒāļ header, payload āđāļĨāļ° signature - āļāļāļāļĢāļŦāļąāļŠ header āļāđāļ§āļĒ base64url āđāļāļ·āđāļāļāđāļēāļāļāļīāļĨāļāđ
alg - āļāļģāļāļ§āļāļĨāļēāļĒāđāļāđāļāđāļŦāļĄāđāļāļēāļ header āđāļĨāļ° payload āđāļāļĒāđāļāđāļāļąāļĨāļāļāļĢāļīāļāļķāļĄāđāļĨāļ° key
- āđāļāļĢāļĩāļĒāļāđāļāļĩāļĒāļāļĨāļēāļĒāđāļāđāļāļāļĩāđāļāļģāļāļ§āļāđāļŦāļĄāđāļāļąāļāļĨāļēāļĒāđāļāđāļāļāļāļāđāļāđāļāđāļ
- āļŦāļēāļāļāļĢāļāļāļąāļ āđāļŠāļāļāļ§āđāļēāđāļāđāļāđāļāđāļāđāļāļāļāļāđāļāđ
HS256 (HMAC-SHA256)
HS256 āđāļāđāļāļāļąāļĨāļāļāļĢāļīāļāļķāļĄāđāļāļāļŠāļĄāļĄāļēāļāļĢ â secret key āđāļāļĩāļĒāļ§āļāļąāļāđāļāđāļāļąāđāļāļŠāļĢāđāļēāļāđāļĨāļ°āļāļĢāļ§āļāļŠāļāļāļĨāļēāļĒāđāļāđāļ
signature = HMACSHA256(
base64urlEncode(header) + "." + base64urlEncode(payload),
secret
)
āđāļāļāļēāļĢāļāļĢāļ§āļāļŠāļāļ āļāļģāļāļ§āļ HMAC āđāļŦāļĄāđāļāđāļ§āļĒ shared secret āđāļĨāļ°āđāļāļĢāļĩāļĒāļāđāļāļĩāļĒāļ:
Token: header.payload.sig
Secret: "my-shared-secret"
1. āļāļģāļāļ§āļ: HMACSHA256("header.payload", "my-shared-secret")
2. āđāļāļĢāļĩāļĒāļāđāļāļĩāļĒāļ: computedSignature === sig
āļāđāļāļāļ§āļĢāļāļīāļāļēāļĢāļāļēāļāđāļēāļāļāļ§āļēāļĄāļāļĨāļāļāļ āļąāļĒ: secret āļāđāļāļāđāļāđāļāļāļ§āļēāļĄāļĨāļąāļ āļŦāļĄāļļāļāđāļ§āļĩāļĒāļāđāļāđāļāļĢāļ°āļĒāļ° āđāļĨāļ°āļĄāļĩāđāļāļāđāļāļĢāļāļĩāļāļĒāđāļēāļāļāđāļāļĒ 256 āļāļīāļ HS256 āđāļĄāđāđāļŦāļĄāļēāļ°āļŠāļģāļŦāļĢāļąāļāļŠāļāļēāļāļąāļāļĒāļāļĢāļĢāļĄāđāļĄāđāļāļĢāđāļāļāļĢāđāļ§āļīāļŠāļāļĩāđāļāļĢāļīāļāļēāļĢāļāļģāļāļ§āļāļĄāļēāļāļāđāļāļāļāļēāļĢ shared secret
RS256 (RSA-SHA256)
RS256 āđāļāđāļāđāļāļāļāļŠāļĄāļĄāļēāļāļĢ āļāļđāđāļāļāļāļĨāļāļāļēāļĄāļāđāļ§āļĒ private key; āļāļđāđāļāļĢāļ§āļāļŠāļāļāļāļĢāļ§āļāļŠāļāļāļāđāļ§āļĒ public key āļāļĩāđāđāļāļĩāđāļĒāļ§āļāđāļāļ
signature = RSASHA256(
base64urlEncode(header) + "." + base64urlEncode(payload),
privateKey
)
āđāļāļāļēāļĢāļāļĢāļ§āļāļŠāļāļ āđāļāđ public key:
Token: header.payload.sig
Public: "-----BEGIN PUBLIC KEY-----..."
1. āđāļŦāļĨāļ RSA public key
2. āļāļĢāļ§āļāļŠāļāļ: RSA_SHA256_verify("header.payload", sig, publicKey)
āļāđāļāļāļĩ: āļāļĩāļĒāđāļāļēāļĢāļĨāļāļāļēāļĄāđāļĨāļ°āļāļēāļĢāļāļĢāļ§āļāļŠāļāļāđāļĒāļāļāļēāļāļāļąāļ āļāļĢāļīāļāļēāļĢāđāļāđ āļŠāļēāļĄāļēāļĢāļāļāļĢāļ§āļāļŠāļāļāđāļāđāđāļāļĒāđāļĄāđāļāđāļāļāļāļ·āļ secret public key āļŠāļēāļĄāļēāļĢāļāđāļŦāđāļāļĢāļīāļāļēāļĢāļāļēāļ endpoint JWKS āđāļāļ·āđāļāļāļēāļĢāļŦāļĄāļļāļāđāļ§āļĩāļĒāļāļāļĩāđāļāđāļēāļĒ
ES256 (ECDSA-SHA256)
ES256 āđāļāđ ECDSA āļāļąāļāđāļŠāđāļāđāļāđāļ P-256 āđāļāđāļāđāļāļĩāļĒāļ§āļāļąāļ RS256 āđāļāđāļāđāļāļāļāļŠāļĄāļĄāļēāļāļĢ
signature = ECDSA_SHA256(
base64urlEncode(header) + "." + base64urlEncode(payload),
privateKey
)
āļāļēāļĢāļāļĢāļ§āļāļŠāļāļāđāļāđ ECDSA P-256 public key ES256 āļŠāļĢāđāļēāļāļĨāļēāļĒāđāļāđāļāļāļĩāđāđāļĨāđāļāļāļ§āđāļēāļĄāļēāļ (64 āđāļāļāđ āđāļāļĩāļĒāļāļāļąāļ 256 āđāļāļāđāļŠāļģāļŦāļĢāļąāļ RSA-2048) āđāļĨāļ°āđāļŦāđāļāļēāļĢāļāļĢāļ§āļāļŠāļāļāļāļĩāđāđāļĢāđāļ§āļāļ§āđāļē
āļāļēāļĢāđāļāļĢāļĩāļĒāļāđāļāļĩāļĒāļāļāļąāļĨāļāļāļĢāļīāļāļķāļĄ
| āļāļļāļāļŠāļĄāļāļąāļāļī | HS256 | RS256 | ES256 | |----------|-------|-------|-------| | āļāļĢāļ°āđāļ āļāļāļĩāļĒāđ | āļŠāļĄāļĄāļēāļāļĢ (shared secret) | āļāļŠāļĄāļĄāļēāļāļĢ (āļāļđāđ RSA) | āļāļŠāļĄāļĄāļēāļāļĢ (āļāļđāđ EC) | | āļāļāļēāļāļĨāļēāļĒāđāļāđāļ | 32 āđāļāļāđ | 256 āđāļāļāđ | 64 āđāļāļāđ | | āļāļēāļĢāđāļāļāļāđāļēāļĒāļāļĩāļĒāđ | āđāļāļĢāđāļāļĒāđāļēāļāļĨāļąāļāđ | public key āđāļāđāļāļŠāļēāļāļēāļĢāļāļ° | public key āđāļāđāļāļŠāļēāļāļēāļĢāļāļ° | | āļāļēāļĢāļŦāļĄāļļāļāđāļ§āļĩāļĒāļ | āļāļēāļāļāļĨāļēāļ | āļāđāļēāļĒ (JWKS) | āļāđāļēāļĒ (JWKS) | | āļāļĢāļāļĩāļāļēāļĢāđāļāđāļāļēāļ | āļĢāļ°āļāļāļ āļēāļĒāđāļāļāļĩāđāđāļāļ·āđāļāļāļ·āļāđāļāđ | API āđāļāļāļāļĢāļ°āļāļēāļĒ | āļĄāļ·āļāļāļ·āļ, IoT |
āļāđāļāļāļīāļāļāļĨāļēāļāđāļāļāļēāļĢāļāļĢāļ§āļāļŠāļāļāļāļĩāđāļāļāļāđāļāļĒ
- āļāļēāļĢāđāļāļĄāļāļĩāļŠāļąāļāļŠāļāļāļąāļĨāļāļāļĢāļīāļāļķāļĄ āļŦāļēāļāļĢāļŦāļąāļŠāļāļāļāļāļļāļāļāđāļēāļ
algāļāļēāļāđāļāđāļāđāļāđāļāļĒāđāļĄāđāļāļąāļāļāļąāļāđāļāđ āļāļđāđāđāļāļĄāļāļĩāļŠāļēāļĄāļēāļĢāļāđāļāļĨāļĩāđāļĒāļāļāļąāļĨāļāļāļĢāļīāļāļķāļĄāđāļāđ āļāļĢāļ§āļāļŠāļāļāđāļŠāļĄāļāļ§āđāļēāļāļąāļĨāļāļāļĢāļīāļāļķāļĄāļāļĢāļāļāļąāļāļāđāļēāļāļĩāđāļāļēāļāļŦāļ§āļąāļ - āļāļēāļĢāļĒāļāļĄāļĢāļąāļ
alg: "none"āđāļĨāļāļĢāļēāļĢāļĩāļāļēāļāļāļąāļ§āļĒāļāļĄāļĢāļąāļāđāļāđāļāđāļāļāļĩāđāđāļĄāđāđāļāđāļĨāļāļāļēāļĄ āļāļāļīāđāļŠāļalg: "none"āļāļĒāđāļēāļāļāļąāļāđāļāļ - āļāļēāļĢāļāļąāļāļāļāļāļĨāļēāļĒāđāļāđāļ āļāļēāļĢāđāļāļĢāļĩāļĒāļāđāļāļĩāļĒāļāđāļāļāđāļĄāđāđāļāđāđāļ§āļĨāļēāļāļāļāļĩāđāļŠāļēāļĄāļēāļĢāļāļĢāļąāđāļ§āđāļŦāļĨāļāđāļāļĄāļđāļĨāļāđāļēāļ timing attacks āđāļāđāļāļēāļĢāđāļāļĢāļĩāļĒāļāđāļāļĩāļĒāļāđāļāļāļąāļ§āļāļāļāđāļĨāļāļĢāļēāļĢāļĩ JWT āļāļāļāļāļļāļ
āļāļĢāļ§āļāļŠāļāļāđāļāđāļāđāļ JWT āļāļāļāđāļĨāļāđ
āđāļāđāđāļāļĢāļ·āđāļāļāļĄāļ·āļāļāļāļāļĢāļŦāļąāļŠ JWT āđāļāļ·āđāļāļāļāļāļĢāļŦāļąāļŠāđāļĨāļ°āļāļĢāļ§āļāļŠāļāļāđāļāđāļāđāļāđāļāđ āļ§āļēāļāđāļāđāļāđāļ āļāļđ header āđāļĨāļ° payload āđāļĨāļ°āļāļĢāļ§āļāļŠāļāļāļĨāļēāļĒāđāļāđāļāđāļāļĒāļĢāļ°āļāļļ secret āļŦāļĢāļ·āļ public key āļāļĩāđāđāļŦāļĄāļēāļ°āļŠāļĄ āļāļēāļĢāļāļĢāļ°āļĄāļ§āļĨāļāļĨāļāļąāđāļāļŦāļĄāļāđāļāļīāļāļāļķāđāļāđāļāđāļāļĢāļēāļ§āđāđāļāļāļĢāđāļāļāļāļāļļāļ