ðŸŽŦ
← āļāļĨāļąāļšāđ„āļ›āļ„āļđāđˆāļĄāļ·āļ­

JWT āļ„āļ·āļ­āļ­āļ°āđ„āļĢ? āļ„āļđāđˆāļĄāļ·āļ­āļ‰āļšāļąāļšāļŠāļĄāļšāļđāļĢāļ“āđŒāđ€āļāļĩāđˆāļĒāļ§āļāļąāļš JSON Web Tokens

· āđāļ—āđ‡āļ: what-is-jwt, jwt-authentication, jwt-guide, api-security, token-based-auth

JWT āļ„āļ·āļ­āļ­āļ°āđ„āļĢ?

JSON Web Token (JWT) āđ€āļ›āđ‡āļ™āļĄāļēāļ•āļĢāļāļēāļ™āđ€āļ›āļīāļ” (RFC 7519) āļ—āļĩāđˆāļāļģāļŦāļ™āļ”āļ§āļīāļ˜āļĩāļāļēāļĢāļ—āļĩāđˆāļāļ°āļ—āļąāļ”āļĢāļąāļ”āđāļĨāļ°āļ„āļĢāļšāļ–āđ‰āļ§āļ™āđƒāļ™āļ•āļąāļ§āđ€āļ­āļ‡āđƒāļ™āļāļēāļĢāļŠāđˆāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļĢāļ°āļŦāļ§āđˆāļēāļ‡āļāđˆāļēāļĒāļ•āđˆāļēāļ‡āđ† āļ­āļĒāđˆāļēāļ‡āļ›āļĨāļ­āļ”āļ āļąāļĒāđƒāļ™āļĢāļđāļ›āđāļšāļš JSON object JWT āđ€āļ›āđ‡āļ™āļĢāļđāļ›āđāļšāļšāđ‚āļ—āđ€āļ„āđ‡āļ™āļ—āļĩāđˆāđ‚āļ”āļ”āđ€āļ”āđˆāļ™āđƒāļ™āđ€āļ§āđ‡āļšāđāļ­āļ›āļžāļĨāļīāđ€āļ„āļŠāļąāļ™āļŠāļĄāļąāļĒāđƒāļŦāļĄāđˆ āđƒāļŠāđ‰āļŠāļģāļŦāļĢāļąāļšāļ—āļļāļāļ­āļĒāđˆāļēāļ‡āļ•āļąāđ‰āļ‡āđāļ•āđˆāļāļēāļĢāļĢāļąāļšāļĢāļ­āļ‡āļ„āļ§āļēāļĄāļ–āļđāļāļ•āđ‰āļ­āļ‡āļ‚āļ­āļ‡āļœāļđāđ‰āđƒāļŠāđ‰āđāļĨāļ°āļāļēāļĢāļ­āļ™āļļāļāļēāļ• API āđ„āļ›āļˆāļ™āļ–āļķāļ‡āļāļēāļĢāđāļĨāļāđ€āļ›āļĨāļĩāđˆāļĒāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāļ›āļĨāļ­āļ”āļ āļąāļĒāļĢāļ°āļŦāļ§āđˆāļēāļ‡āđ„āļĄāđ‚āļ„āļĢāđ€āļ‹āļ­āļĢāđŒāļ§āļīāļŠ

āļāļēāļĢāļĢāļąāļšāļĢāļ­āļ‡āļ„āļ§āļēāļĄāļ–āļđāļāļ•āđ‰āļ­āļ‡āļ”āđ‰āļ§āļĒ JWT āļ—āļģāļ‡āļēāļ™āļ­āļĒāđˆāļēāļ‡āđ„āļĢ

āļāļēāļĢāļĢāļąāļšāļĢāļ­āļ‡āļ„āļ§āļēāļĄāļ–āļđāļāļ•āđ‰āļ­āļ‡āļ”āđ‰āļ§āļĒ JWT āđƒāļŠāđ‰āļĢāļđāļ›āđāļšāļšāđ„āļĢāđ‰āļŠāļ–āļēāļ™āļ°āļ—āļĩāđˆāļĨāļ”āļ„āļ§āļēāļĄāļˆāļģāđ€āļ›āđ‡āļ™āđƒāļ™āļāļēāļĢāļˆāļąāļ”āđ€āļāđ‡āļšāđ€āļ‹āļŠāļŠāļąāļ™āļāļąāđˆāļ‡āđ€āļ‹āļīāļĢāđŒāļŸāđ€āļ§āļ­āļĢāđŒ āļāļēāļĢāđ€āļ‚āđ‰āļēāđƒāļˆāđ‚āļŸāļĨāļ§āđŒāļ™āļĩāđ‰āđ€āļ›āđ‡āļ™āļāļļāļāđāļˆāļŠāļģāļ„āļąāļāđƒāļ™āļāļēāļĢāđ€āļ‚āđ‰āļēāđƒāļˆāļ§āđˆāļēāļ—āļģāđ„āļĄ JWT āļˆāļķāļ‡āļāļĨāļēāļĒāđ€āļ›āđ‡āļ™āļ•āļąāļ§āđ€āļĨāļ·āļ­āļāđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āļŠāļģāļŦāļĢāļąāļšāļ„āļ§āļēāļĄāļ›āļĨāļ­āļ”āļ āļąāļĒāļ‚āļ­āļ‡ API āļŠāļĄāļąāļĒāđƒāļŦāļĄāđˆ

āđ‚āļŸāļĨāļ§āđŒāļāļēāļĢāļĢāļąāļšāļĢāļ­āļ‡āļ„āļ§āļēāļĄāļ–āļđāļāļ•āđ‰āļ­āļ‡

  1. āļœāļđāđ‰āđƒāļŠāđ‰āđ€āļ‚āđ‰āļēāļŠāļđāđˆāļĢāļ°āļšāļš â€” āđ„āļ„āļĨāđ€āļ­āļ™āļ•āđŒāļŠāđˆāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļ›āļĢāļ°āļˆāļģāļ•āļąāļ§ (āļŠāļ·āđˆāļ­āļœāļđāđ‰āđƒāļŠāđ‰āđāļĨāļ°āļĢāļŦāļąāļŠāļœāđˆāļēāļ™) āđ„āļ›āļĒāļąāļ‡āđ€āļ‹āļīāļĢāđŒāļŸāđ€āļ§āļ­āļĢāđŒāļĢāļąāļšāļĢāļ­āļ‡āļ„āļ§āļēāļĄāļ–āļđāļāļ•āđ‰āļ­āļ‡
  2. āđ€āļ‹āļīāļĢāđŒāļŸāđ€āļ§āļ­āļĢāđŒāļŠāļĢāđ‰āļēāļ‡ JWT — āđ€āļ‹āļīāļĢāđŒāļŸāđ€āļ§āļ­āļĢāđŒāļ•āļĢāļ§āļˆāļŠāļ­āļšāļ‚āđ‰āļ­āļĄāļđāļĨāļ›āļĢāļ°āļˆāļģāļ•āļąāļ§ āļŠāļĢāđ‰āļēāļ‡ JWT āļ—āļĩāđˆāļĄāļĩāļ‚āđ‰āļ­āļĄāļđāļĨāļ›āļĢāļ°āļˆāļģāļ•āļąāļ§āđāļĨāļ°āļŠāļīāļ—āļ˜āļīāđŒāļ‚āļ­āļ‡āļœāļđāđ‰āđƒāļŠāđ‰ āļĨāļ‡āļ™āļēāļĄāļ”āđ‰āļ§āļĒ secret āļŦāļĢāļ·āļ­ private key āđāļĨāļ°āļŠāđˆāļ‡āļāļĨāļąāļšāđ„āļ›āļĒāļąāļ‡āđ„āļ„āļĨāđ€āļ­āļ™āļ•āđŒ
  3. āđ„āļ„āļĨāđ€āļ­āļ™āļ•āđŒāđ€āļāđ‡āļšāđ‚āļ—āđ€āļ„āđ‡āļ™ â€” āđ„āļ„āļĨāđ€āļ­āļ™āļ•āđŒāđ€āļāđ‡āļš JWT āđ‚āļ”āļĒāļ—āļąāđˆāļ§āđ„āļ›āđƒāļ™ localStorage, sessionStorage āļŦāļĢāļ·āļ­ HTTP-only cookie
  4. āđ„āļ„āļĨāđ€āļ­āļ™āļ•āđŒāļŠāđˆāļ‡āđ‚āļ—āđ€āļ„āđ‡āļ™āđ„āļ›āļāļąāļšāļ—āļļāļāļ„āļģāļ‚āļ­ â€” āļŠāļģāļŦāļĢāļąāļšāļ—āļļāļāļ„āļģāļ‚āļ­ API āļ—āļĩāđˆāļ•āļēāļĄāļĄāļē āđ„āļ„āļĨāđ€āļ­āļ™āļ•āđŒāļĢāļ§āļĄ JWT āđƒāļ™ header Authorization āđ‚āļ”āļĒāđƒāļŠāđ‰āļĢāļđāļ›āđāļšāļš Bearer: Authorization: Bearer <token>
  5. āđ€āļ‹āļīāļĢāđŒāļŸāđ€āļ§āļ­āļĢāđŒāļ•āļĢāļ§āļˆāļŠāļ­āļšāđ‚āļ—āđ€āļ„āđ‡āļ™ â€” āđ€āļ‹āļīāļĢāđŒāļŸāđ€āļ§āļ­āļĢāđŒāļ•āļĢāļ§āļˆāļŠāļ­āļšāļĨāļēāļĒāđ€āļ‹āđ‡āļ™ JWT āļ•āļĢāļ§āļˆāļŠāļ­āļšāđ€āļ§āļĨāļēāļŦāļĄāļ”āļ­āļēāļĒāļļ āđāļĨāļ°āđāļĒāļ claims āļœāļđāđ‰āđƒāļŠāđ‰āđ€āļžāļ·āđˆāļ­āļ­āļ™āļļāļāļēāļ•āļ„āļģāļ‚āļ­
  6. āđ„āļĄāđˆāļ•āđ‰āļ­āļ‡āļ„āđ‰āļ™āļŦāļēāđ€āļ‹āļŠāļŠāļąāļ™ â€” āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļ JWT āļĄāļĩāļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāļˆāļģāđ€āļ›āđ‡āļ™āļ—āļąāđ‰āļ‡āļŦāļĄāļ” āđ€āļ‹āļīāļĢāđŒāļŸāđ€āļ§āļ­āļĢāđŒāļˆāļķāļ‡āđ„āļĄāđˆāļ•āđ‰āļ­āļ‡āļŠāļ­āļšāļ–āļēāļĄāļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļŦāļĢāļ·āļ­āđāļ„āļŠāđ€āļžāļ·āđˆāļ­āļĢāļ°āļšāļļāļ•āļąāļ§āļœāļđāđ‰āđƒāļŠāđ‰

āļ—āļģāđ„āļĄāļŠāļīāđˆāļ‡āļ™āļĩāđ‰āļˆāļķāļ‡āļŠāļģāļ„āļąāļ

āļāļēāļĢāļĢāļąāļšāļĢāļ­āļ‡āļ„āļ§āļēāļĄāļ–āļđāļāļ•āđ‰āļ­āļ‡āđāļšāļšāđƒāļŠāđ‰āđ€āļ‹āļŠāļŠāļąāļ™āļ”āļąāđ‰āļ‡āđ€āļ”āļīāļĄāđ€āļāđ‡āļš session ID āđƒāļ™āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļŦāļĢāļ·āļ­āļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļ‚āļ­āļ‡āđ€āļ‹āļīāļĢāđŒāļŸāđ€āļ§āļ­āļĢāđŒ āļ—āļļāļāļ„āļģāļ‚āļ­āļ—āļĩāđˆāļĢāļąāļšāļĢāļ­āļ‡āļ„āļ§āļēāļĄāļ–āļđāļāļ•āđ‰āļ­āļ‡āļ•āđ‰āļ­āļ‡āļĄāļĩāļāļēāļĢāļ„āđ‰āļ™āļŦāļē JWT āļ‚āļˆāļąāļ”āļāļēāļĢāļ„āđ‰āļ™āļŦāļēāļ™āļĩāđ‰ — āđ‚āļ—āđ€āļ„āđ‡āļ™āđ€āļ­āļ‡āļžāļīāļŠāļđāļˆāļ™āđŒāļ•āļąāļ§āļ•āļ™āļ‚āļ­āļ‡āļœāļđāđ‰āđƒāļŠāđ‰ āļŠāļīāđˆāļ‡āļ™āļĩāđ‰āļ—āļģāđƒāļŦāđ‰āļĢāļ°āļšāļšāļ—āļĩāđˆāđƒāļŠāđ‰ JWT āļŠāļēāļĄāļēāļĢāļ–āļ‚āļĒāļēāļĒāļ‚āļ™āļēāļ”āđ„āļ”āđ‰āđ‚āļ”āļĒāļ˜āļĢāļĢāļĄāļŠāļēāļ•āļīāđ€āļžāļĢāļēāļ°āđ€āļ‹āļīāļĢāđŒāļŸāđ€āļ§āļ­āļĢāđŒāđƒāļ”āđ† āđƒāļ™āļ„āļĨāļąāļŠāđ€āļ•āļ­āļĢāđŒāļŠāļēāļĄāļēāļĢāļ–āļ•āļĢāļ§āļˆāļŠāļ­āļšāđ‚āļ—āđ€āļ„āđ‡āļ™āđ„āļ”āđ‰āđ‚āļ”āļĒāđ„āļĄāđˆāļ•āđ‰āļ­āļ‡āļĄāļĩāļŠāļ–āļēāļ™āļ°āđ€āļ‹āļŠāļŠāļąāļ™āļĢāđˆāļ§āļĄāļāļąāļ™

JWT āđ€āļ—āļĩāļĒāļšāļāļąāļšāļāļēāļĢāļĢāļąāļšāļĢāļ­āļ‡āļ„āļ§āļēāļĄāļ–āļđāļāļ•āđ‰āļ­āļ‡āđāļšāļšāđƒāļŠāđ‰āđ€āļ‹āļŠāļŠāļąāļ™

| āļ”āđ‰āļēāļ™ | āļāļēāļĢāļĢāļąāļšāļĢāļ­āļ‡āļ„āļ§āļēāļĄāļ–āļđāļāļ•āđ‰āļ­āļ‡āļ”āđ‰āļ§āļĒ JWT | āļāļēāļĢāļĢāļąāļšāļĢāļ­āļ‡āļ„āļ§āļēāļĄāļ–āļđāļāļ•āđ‰āļ­āļ‡āđāļšāļšāđƒāļŠāđ‰āđ€āļ‹āļŠāļŠāļąāļ™ | |--------|--------------------|------------------------------| | āļāļēāļĢāļˆāļąāļ”āđ€āļāđ‡āļš | āļāļąāđˆāļ‡āđ„āļ„āļĨāđ€āļ­āļ™āļ•āđŒ (āđƒāļ™āđ‚āļ—āđ€āļ„āđ‡āļ™) | āļāļąāđˆāļ‡āđ€āļ‹āļīāļĢāđŒāļŸāđ€āļ§āļ­āļĢāđŒ (āđƒāļ™āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļŦāļĢāļ·āļ­ DB) | | āļ„āļ§āļēāļĄāļŠāļēāļĄāļēāļĢāļ–āđƒāļ™āļāļēāļĢāļ‚āļĒāļēāļĒāļ‚āļ™āļēāļ” | āđ„āļĄāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāļ—āļĩāđˆāđ€āļāđ‡āļšāđ€āļ‹āļŠāļŠāļąāļ™āļĢāđˆāļ§āļĄāļāļąāļ™ | āļ•āđ‰āļ­āļ‡āļāļēāļĢāļ—āļĩāđˆāđ€āļāđ‡āļšāđ€āļ‹āļŠāļŠāļąāļ™āļĢāđˆāļ§āļĄāļāļąāļ™āļĢāļ°āļŦāļ§āđˆāļēāļ‡āļ­āļīāļ™āļŠāđāļ•āļ™āļ‹āđŒ | | āļ‚āđ‰āļēāļĄāđ‚āļ”āđ€āļĄāļ™ | āļ—āļģāļ‡āļēāļ™āļ‚āđ‰āļēāļĄāđ‚āļ”āđ€āļĄāļ™āđ„āļ”āđ‰āļ•āļēāļĄāļ˜āļĢāļĢāļĄāļŠāļēāļ•āļī | āļĒāļēāļāļ—āļĩāđˆāļˆāļ°āđāļŠāļĢāđŒāđ€āļ‹āļŠāļŠāļąāļ™ | | āđ€āļ›āđ‡āļ™āļĄāļīāļ•āļĢāļāļąāļšāļĄāļ·āļ­āļ–āļ·āļ­ | āđƒāļŠāđˆ (āđ„āļĄāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢ cookies) | āļ•āđ‰āļ­āļ‡āļāļēāļĢāļāļēāļĢāļŠāļ™āļąāļšāļŠāļ™āļļāļ™ cookie | | āļāļēāļĢāđ€āļžāļīāļāļ–āļ­āļ™ | āļĒāļēāļ (āļˆāļ™āļāļ§āđˆāļēāđ‚āļ—āđ€āļ„āđ‡āļ™āļˆāļ°āļŦāļĄāļ”āļ­āļēāļĒāļļ) | āļ‡āđˆāļēāļĒ (āļĨāļšāđ€āļ‹āļŠāļŠāļąāļ™āļˆāļēāļāļ—āļĩāđˆāđ€āļāđ‡āļš) | | āļ‚āļ™āļēāļ” payload | āđƒāļŦāļāđˆāļāļ§āđˆāļēāļ•āđˆāļ­āļ„āļģāļ‚āļ­ (āđ‚āļ—āđ€āļ„āđ‡āļ™āđƒāļ™ header) | āļ™āđ‰āļ­āļĒāļ—āļĩāđˆāļŠāļļāļ” (āđāļ„āđˆ session ID) |

āļ—āļģāđ„āļĄ JWT āļˆāļķāļ‡āđƒāļŠāđ‰āļŠāļģāļŦāļĢāļąāļšāļ„āļ§āļēāļĄāļ›āļĨāļ­āļ”āļ āļąāļĒāļ‚āļ­āļ‡ API

āļ„āļļāļ“āļĨāļąāļāļĐāļ“āļ°āļ—āļĩāđˆāļ—āļģāđƒāļŦāđ‰ JWT āđ€āļŦāļĄāļēāļ°āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļĢāļąāļšāļĢāļ­āļ‡āļ„āļ§āļēāļĄāļ–āļđāļāļ•āđ‰āļ­āļ‡āļĒāļąāļ‡āļ—āļģāđƒāļŦāđ‰āđ€āļŦāļĄāļēāļ°āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļĢāļąāļāļĐāļēāļ„āļ§āļēāļĄāļ›āļĨāļ­āļ”āļ āļąāļĒ API āļ­āļĩāļāļ”āđ‰āļ§āļĒ

āđ„āļĢāđ‰āļŠāļ–āļēāļ™āļ°āđāļĨāļ°āļ›āļĢāļąāļšāļ‚āļ™āļēāļ”āđ„āļ”āđ‰

āļ—āļļāļ JWT āļ™āļģāļžāļēāļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļąāđ‰āļ‡āļŦāļĄāļ”āļ—āļĩāđˆāđ€āļ‹āļīāļĢāđŒāļŸāđ€āļ§āļ­āļĢāđŒāļ•āđ‰āļ­āļ‡āļāļēāļĢāđ€āļžāļ·āđˆāļ­āļ­āļ™āļļāļāļēāļ•āļ„āļģāļ‚āļ­ āđ„āļĄāđˆāļĄāļĩāļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāđ€āļ‹āļŠāļŠāļąāļ™āđƒāļŦāđ‰āļŠāļ­āļšāļ–āļēāļĄ āđ„āļĄāđˆāļĄāļĩāđāļ„āļŠāđƒāļŦāđ‰āļ•āļĢāļ§āļˆāļŠāļ­āļš āđ„āļĄāđˆāļĄāļĩāļŠāļ–āļēāļ™āļ°āđƒāļŦāđ‰āļ‹āļīāļ‡āđ‚āļ„āļĢāđ„āļ™āļ‹āđŒāļ‚āđ‰āļēāļĄāđ€āļ‹āļīāļĢāđŒāļŸāđ€āļ§āļ­āļĢāđŒ load balancer āļŠāļēāļĄāļēāļĢāļ–āļŠāđˆāļ‡āļ„āļģāļ‚āļ­āđ„āļ›āļĒāļąāļ‡āļ­āļīāļ™āļŠāđāļ•āļ™āļ‹āđŒāđ€āļ‹āļīāļĢāđŒāļŸāđ€āļ§āļ­āļĢāđŒāđƒāļ”āđ† āđ„āļ”āđ‰āđ‚āļ”āļĒāđ„āļĄāđˆāļ•āđ‰āļ­āļ‡āļ›āļĢāļ°āļŠāļēāļ™āļ‡āļēāļ™

āļ‚āđ‰āļēāļĄāđ‚āļ”āđ€āļĄāļ™āđāļĨāļ°āļ‚āđ‰āļēāļĄāļ•āđ‰āļ™āļ—āļēāļ‡

JWT āļ—āļģāļ‡āļēāļ™āļ‚āđ‰āļēāļĄāđ‚āļ”āđ€āļĄāļ™āđāļĨāļ°āļ•āđ‰āļ™āļ—āļēāļ‡āļ—āļĩāđˆāđāļ•āļāļ•āđˆāļēāļ‡āļāļąāļ™āđ„āļ”āđ‰āļ•āļēāļĄāļ˜āļĢāļĢāļĄāļŠāļēāļ•āļī āđ‚āļ—āđ€āļ„āđ‡āļ™āļ—āļĩāđˆāļ­āļ­āļāđ‚āļ”āļĒ auth.example.com āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āđ€āļ‚āđ‰āļēāļ–āļķāļ‡ api.example.com āđāļĨāļ° admin.example.com āļŠāļīāđˆāļ‡āļ™āļĩāđ‰āļ—āļģāđƒāļŦāđ‰ JWT āđ€āļ›āđ‡āļ™āļĢāļēāļāļāļēāļ™āļ‚āļ­āļ‡āļĢāļ°āļšāļš single sign-on (SSO)

āļāļēāļĢāļ­āļ™āļļāļāļēāļ•āđāļšāļšāļĨāļ°āđ€āļ­āļĩāļĒāļ”

payload āļ‚āļ­āļ‡ JWT āļŠāļēāļĄāļēāļĢāļ–āļĢāļ§āļĄ claims āļ—āļĩāđˆāļāļģāļŦāļ™āļ”āđ€āļ­āļ‡āļŠāļģāļŦāļĢāļąāļšāļšāļ—āļšāļēāļ— āļŠāļīāļ—āļ˜āļīāđŒ āđāļĨāļ°āļāļēāļĢāđ€āļ›āđ‡āļ™āļŠāļĄāļēāļŠāļīāļāļ­āļ‡āļ„āđŒāļāļĢ:

{
  "sub": "user_abc123",
  "role": "admin",
  "permissions": ["read:users", "write:users", "delete:users"],
  "org_id": "org_xyz789",
  "iat": 1516239022,
  "exp": 1516325422
}

āđ€āļ‹āļīāļĢāđŒāļŸāđ€āļ§āļ­āļĢāđŒ API āļ­āđˆāļēāļ™ claims āđ€āļŦāļĨāđˆāļēāļ™āļĩāđ‰āđ‚āļ”āļĒāļ•āļĢāļ‡āļˆāļēāļāđ‚āļ—āđ€āļ„āđ‡āļ™āđ‚āļ”āļĒāđ„āļĄāđˆāļ•āđ‰āļ­āļ‡āļ„āđ‰āļ™āļŦāļēāđ€āļžāļīāđˆāļĄāđ€āļ•āļīāļĄ

JWT āļŠāļģāļŦāļĢāļąāļš Single Sign-On (SSO)

Single sign-on āđ€āļ›āđ‡āļ™āļŦāļ™āļķāđˆāļ‡āđƒāļ™āļāļĢāļ“āļĩāļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™ JWT āļ—āļĩāđˆāļžāļšāļšāđˆāļ­āļĒāļ—āļĩāđˆāļŠāļļāļ” āđƒāļ™āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄ SSO āļ—āļąāđˆāļ§āđ„āļ›:

  1. āļœāļđāđ‰āđƒāļŠāđ‰āđ€āļ‚āđ‰āļēāļŠāļđāđˆāļĢāļ°āļšāļš identity provider (IdP) — āđ€āļŠāđˆāļ™ Auth0, Okta āļŦāļĢāļ·āļ­ Keycloak
  2. IdP āļ­āļ­āļ JWT āļ—āļĩāđˆāļĨāļ‡āļ™āļēāļĄāļ”āđ‰āļ§āļĒ private key āļ‚āļ­āļ‡āļ•āļ™
  3. āļœāļđāđ‰āđƒāļŠāđ‰āđāļŠāļ”āļ‡ JWT āļ™āļĩāđ‰āļ•āđˆāļ­āđāļ­āļ›āļžāļĨāļīāđ€āļ„āļŠāļąāļ™āļŦāļĨāļēāļĒāļ•āļąāļ§
  4. āđāļ•āđˆāļĨāļ°āđāļ­āļ›āļžāļĨāļīāđ€āļ„āļŠāļąāļ™āļ•āļĢāļ§āļˆāļŠāļ­āļšāļĨāļēāļĒāđ€āļ‹āđ‡āļ™āđ‚āļ”āļĒāđƒāļŠāđ‰ public key āļ‚āļ­āļ‡ IdP
  5. āđāļ•āđˆāļĨāļ°āđāļ­āļ›āļžāļĨāļīāđ€āļ„āļŠāļąāļ™āđ€āļŠāļ·āđˆāļ­āļ–āļ·āļ­āđ‚āļ—āđ€āļ„āđ‡āļ™āđ‚āļ”āļĒāđ„āļĄāđˆāļ•āđ‰āļ­āļ‡āļŠāļ·āđˆāļ­āļŠāļēāļĢāļāļąāļš IdP āđƒāļ™āļ—āļļāļāļ„āļģāļ‚āļ­

āļĢāļđāļ›āđāļšāļšāļ™āļĩāđ‰āļ—āļģāđƒāļŦāđ‰āļāļēāļĢāđ€āļ‚āđ‰āļēāļŠāļđāđˆāļĢāļ°āļšāļšāļ„āļĢāļąāđ‰āļ‡āđ€āļ”āļĩāļĒāļ§āļŠāļēāļĄāļēāļĢāļ–āđƒāļŦāđ‰āļŠāļīāļ—āļ˜āļīāđŒāļāļēāļĢāđ€āļ‚āđ‰āļēāļ–āļķāļ‡āļšāļĢāļīāļāļēāļĢāļĄāļēāļāļĄāļēāļĒ â€” āļ­āļĩāđ€āļĄāļĨ, āļ—āļĩāđˆāđ€āļāđ‡āļšāđ„āļŸāļĨāđŒ, āļāļēāļĢāļˆāļąāļ”āļāļēāļĢāđ‚āļ„āļĢāļ‡āļāļēāļĢ, āļĢāļ°āļšāļš HR — āđ‚āļ”āļĒāđ„āļĄāđˆāļ•āđ‰āļ­āļ‡āđƒāļŦāđ‰āđāļ•āđˆāļĨāļ°āļšāļĢāļīāļāļēāļĢāđƒāļŠāđ‰āđ‚āļŸāļĨāļ§āđŒāļāļēāļĢāđ€āļ‚āđ‰āļēāļŠāļđāđˆāļĢāļ°āļšāļšāļ‚āļ­āļ‡āļ•āļąāļ§āđ€āļ­āļ‡

āđāļ™āļ§āļ›āļāļīāļšāļąāļ•āļīāļ—āļĩāđˆāļ”āļĩāļ—āļĩāđˆāļŠāļļāļ”āļ”āđ‰āļēāļ™āļ„āļ§āļēāļĄāļ›āļĨāļ­āļ”āļ āļąāļĒāļ‚āļ­āļ‡ JWT

āđāļĄāđ‰āļ§āđˆāļē JWT āļˆāļ°āđƒāļŦāđ‰āļĢāļēāļāļāļēāļ™āļ—āļĩāđˆāđāļ‚āđ‡āļ‡āđāļāļĢāđˆāļ‡āļŠāļģāļŦāļĢāļąāļšāļ„āļ§āļēāļĄāļ›āļĨāļ­āļ”āļ āļąāļĒāļ‚āļ­āļ‡ API āđāļ•āđˆāļāļēāļĢāļ™āļģāđ„āļ›āđƒāļŠāđ‰āļ­āļĒāđˆāļēāļ‡āļ–āļđāļāļ•āđ‰āļ­āļ‡āđ€āļ›āđ‡āļ™āļŠāļīāđˆāļ‡āļˆāļģāđ€āļ›āđ‡āļ™

āđ€āļāđ‡āļšāđ‚āļ—āđ€āļ„āđ‡āļ™āđƒāļŦāđ‰āļĄāļĩāļ­āļēāļĒāļļāļŠāļąāđ‰āļ™

āļ•āļąāđ‰āļ‡āļ„āđˆāļē claim exp (āļāļēāļĢāļŦāļĄāļ”āļ­āļēāļĒāļļ) āđƒāļŦāđ‰āļĄāļĩāļĢāļ°āļĒāļ°āđ€āļ§āļĨāļēāļŠāļąāđ‰āļ™ â€” 15 āļ™āļēāļ—āļĩāļ–āļķāļ‡ 1 āļŠāļąāđˆāļ§āđ‚āļĄāļ‡āļŠāļģāļŦāļĢāļąāļš access token āđƒāļŠāđ‰ refresh token āļ—āļĩāđˆāļĄāļĩāļ­āļēāļĒāļļāļĒāļēāļ§āļ™āļēāļ™āļāļ§āđˆāļē (āļ§āļąāļ™āļŦāļĢāļ·āļ­āļŠāļąāļ›āļ”āļēāļŦāđŒ) āđ€āļžāļ·āđˆāļ­āļ‚āļ­ access token āđƒāļŦāļĄāđˆāđ‚āļ”āļĒāđ„āļĄāđˆāļ•āđ‰āļ­āļ‡āđƒāļŦāđ‰āļœāļđāđ‰āđƒāļŠāđ‰āļĢāļąāļšāļĢāļ­āļ‡āļ„āļ§āļēāļĄāļ–āļđāļāļ•āđ‰āļ­āļ‡āđƒāļŦāļĄāđˆ

āđƒāļŠāđ‰ HTTPS āđ€āļŠāļĄāļ­

JWT āđ„āļĄāđˆāđ„āļ”āđ‰āđ€āļ‚āđ‰āļēāļĢāļŦāļąāļŠ payload āļ‚āļ­āļ‡āļĄāļąāļ™ āđƒāļ„āļĢāļāđ‡āļ•āļēāļĄāļ—āļĩāđˆāļ”āļąāļāļˆāļąāļšāđ‚āļ—āđ€āļ„āđ‡āļ™āļŠāļēāļĄāļēāļĢāļ–āļ–āļ­āļ”āļĢāļŦāļąāļŠāđāļĨāļ°āļ­āđˆāļēāļ™āđ€āļ™āļ·āđ‰āļ­āļŦāļēāđ„āļ”āđ‰ āļŠāđˆāļ‡ JWT āļœāđˆāļēāļ™ HTTPS āđ€āļŠāļĄāļ­āđ€āļžāļ·āđˆāļ­āļ›āđ‰āļ­āļ‡āļāļąāļ™āļāļēāļĢāļ”āļąāļāļˆāļąāļš

āļ•āļĢāļ§āļˆāļŠāļ­āļšāļ—āļļāļāļ­āļĒāđˆāļēāļ‡

āļ•āļĢāļ§āļˆāļŠāļ­āļšāļĨāļēāļĒāđ€āļ‹āđ‡āļ™āđ€āļŠāļĄāļ­ āļ•āļĢāļ§āļˆāļŠāļ­āļšāļ§āđˆāļēāđ‚āļ—āđ€āļ„āđ‡āļ™āļĒāļąāļ‡āđ„āļĄāđˆāļŦāļĄāļ”āļ­āļēāļĒāļļ āļĒāļ·āļ™āļĒāļąāļ™āļ§āđˆāļē aud (āļœāļđāđ‰āļĢāļąāļš) āļ•āļĢāļ‡āļāļąāļšāđāļ­āļ›āļžāļĨāļīāđ€āļ„āļŠāļąāļ™āļ‚āļ­āļ‡āļ„āļļāļ“ āđāļĨāļ°āļ›āļāļīāđ€āļŠāļ˜āđ‚āļ—āđ€āļ„āđ‡āļ™āļ—āļĩāđˆāļĄāļĩāļ­āļąāļĨāļāļ­āļĢāļīāļ—āļķāļĄāļ—āļĩāđˆāđ„āļĄāđˆāļ„āļēāļ”āļ„āļīāļ”

āđ€āļāđ‡āļšāđ‚āļ—āđ€āļ„āđ‡āļ™āļ­āļĒāđˆāļēāļ‡āļ›āļĨāļ­āļ”āļ āļąāļĒ

āļāļąāđˆāļ‡āđ„āļ„āļĨāđ€āļ­āļ™āļ•āđŒ āđ€āļāđ‡āļš JWT āđƒāļ™ HTTP-only cookies āđ€āļĄāļ·āđˆāļ­āđ€āļ›āđ‡āļ™āđ„āļ›āđ„āļ”āđ‰ āļŦāļĢāļ·āļ­āđƒāļ™āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļŠāļģāļŦāļĢāļąāļš single-page applications āļŦāļĨāļĩāļāđ€āļĨāļĩāđˆāļĒāļ‡ localStorage āļŠāļģāļŦāļĢāļąāļšāđ‚āļ—āđ€āļ„āđ‡āļ™āļ—āļĩāđˆāđƒāļŦāđ‰āļāļēāļĢāđ€āļ‚āđ‰āļēāļ–āļķāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ­āđˆāļ­āļ™

āļ„āļ§āļēāļĄāđ€āļ‚āđ‰āļēāđƒāļˆāļœāļīāļ”āļ—āļąāđˆāļ§āđ„āļ›āđ€āļāļĩāđˆāļĒāļ§āļāļąāļš JWT

"JWT āļ–āļđāļāđ€āļ‚āđ‰āļēāļĢāļŦāļąāļŠ" — āđ„āļĄāđˆāđƒāļŠāđˆ JWT āļ–āļđāļāļĨāļ‡āļ™āļēāļĄ āđ„āļĄāđˆāđ„āļ”āđ‰āļ–āļđāļāđ€āļ‚āđ‰āļēāļĢāļŦāļąāļŠ payload āļ–āļđāļāđ€āļ‚āđ‰āļēāļĢāļŦāļąāļŠāđāļšāļš base64url āļ‹āļķāđˆāļ‡āļŠāļēāļĄāļēāļĢāļ–āļĒāđ‰āļ­āļ™āļāļĨāļąāļšāđ„āļ”āđ‰ JWE (JSON Web Encryption) āđƒāļŦāđ‰āļāļēāļĢāđ€āļ‚āđ‰āļēāļĢāļŦāļąāļŠ āđāļ•āđˆāļĄāļąāļ™āđ€āļ›āđ‡āļ™āļ‚āđ‰āļ­āļāļģāļŦāļ™āļ”āđāļĒāļāļ•āđˆāļēāļ‡āļŦāļēāļāļ—āļĩāđˆāđ„āļĄāđˆāđ„āļ”āđ‰āļ„āļĢāļ­āļšāļ„āļĨāļļāļĄāđ‚āļ”āļĒ JWT āļĄāļēāļ•āļĢāļāļēāļ™

"JWT āļ›āđ‰āļ­āļ‡āļāļąāļ™ CSRF" — āđ„āļĄāđˆāđƒāļŠāđˆāđ‚āļ”āļĒāļ•āļąāļ§āļĄāļąāļ™āđ€āļ­āļ‡ JWT āđƒāļ™ Authorization header āļŠāđˆāļ§āļĒāđ„āļ”āđ‰ āđāļ•āđˆāļŦāļēāļāđ‚āļ—āđ€āļ„āđ‡āļ™āļ­āļĒāļđāđˆāđƒāļ™ cookie āļāđ‡āļĒāļąāļ‡āļ•āđ‰āļ­āļ‡āļāļēāļĢāļāļēāļĢāļ›āđ‰āļ­āļ‡āļāļąāļ™ CSRF

"JWT āđƒāļŠāđ‰āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļĢāļąāļšāļĢāļ­āļ‡āļ„āļ§āļēāļĄāļ–āļđāļāļ•āđ‰āļ­āļ‡āđ€āļ—āđˆāļēāļ™āļąāđ‰āļ™" — JWT āđƒāļŠāđ‰āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļĢāļąāļšāļĢāļ­āļ‡āļ„āļ§āļēāļĄāļ–āļđāļāļ•āđ‰āļ­āļ‡ āđāļ•āđˆāļĒāļąāļ‡āđƒāļŠāđ‰āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāđāļĨāļāđ€āļ›āļĨāļĩāđˆāļĒāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļāļēāļĢāļ­āļ™āļļāļāļēāļ• āđ€āļ‹āļŠāļŠāļąāļ™āđ„āļĢāđ‰āļŠāļ–āļēāļ™āļ° āđāļĨāļ°āļāļēāļĢāđāļŠāļĢāđŒāļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāļ›āļĨāļ­āļ”āļ āļąāļĒāļĢāļ°āļŦāļ§āđˆāļēāļ‡āļšāļĢāļīāļāļēāļĢ

āļ–āļ­āļ”āļĢāļŦāļąāļŠāđāļĨāļ°āļŠāļģāļĢāļ§āļˆ JWT āļ­āļ­āļ™āđ„āļĨāļ™āđŒ

āđƒāļŠāđ‰āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļ–āļ­āļ”āļĢāļŦāļąāļŠ JWT āđ€āļžāļ·āđˆāļ­āļ•āļĢāļ§āļˆāļŠāļ­āļš JSON Web Token āđƒāļ”āđ† āļ§āļēāļ‡āđ‚āļ—āđ€āļ„āđ‡āļ™āļ‚āļ­āļ‡āļ„āļļāļ“āđāļĨāļ°āļ”āļđ header, payload āđāļĨāļ°āļ­āļąāļĨāļāļ­āļĢāļīāļ—āļķāļĄāļĨāļēāļĒāđ€āļ‹āđ‡āļ™āļ—āļĩāđˆāļ–āļ­āļ”āļĢāļŦāļąāļŠāđāļĨāđ‰āļ§āļ—āļąāļ™āļ—āļĩ āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļŠāđˆāļ§āļĒāđƒāļŦāđ‰āļ„āļļāļ“āđ€āļ‚āđ‰āļēāđƒāļˆāļ§āđˆāļēāļ‚āđ‰āļ­āļĄāļđāļĨāđƒāļ”āļ—āļĩāđˆāđ‚āļ—āđ€āļ„āđ‡āļ™āļ‚āļ­āļ‡āļ„āļļāļ“āļ™āļģāļžāļēāđāļĨāļ°āļ•āļĢāļ§āļˆāļŠāļ­āļšāļ§āđˆāļēāļĄāļĩāđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āļ—āļĩāđˆāļ–āļđāļāļ•āđ‰āļ­āļ‡

JWT āļ„āļ·āļ­āļ­āļ°āđ„āļĢ? āļ„āļđāđˆāļĄāļ·āļ­āļ‰āļšāļąāļšāļŠāļĄāļšāļđāļĢāļ“āđŒāđ€āļāļĩāđˆāļĒāļ§āļāļąāļš JSON Web Tokens - CoolTool