JWT(JSON Web Token)

JWT๋Š” ๋‘ ๊ฐœ์ฒด ๊ฐ„์— ์ •๋ณด๋ฅผ JSON ๊ฐ์ฒด๋กœ์„œ ์•ˆ์ „ํ•˜๊ฒŒ ์ „์†กํ•˜๊ธฐ ์œ„ํ•œ ์ปดํŒฉํŠธํ•˜๊ณ  ๋…๋ฆฝ์ ์ธ(self-contained) ๋ฐฉ์‹์˜ ๊ณต๊ฐœ ํ‘œ์ค€(RFC 7519)์ด๋‹ค.

  • ํ”ํžˆ ํ† ํฐ ๊ธฐ๋ฐ˜ ์ธ์ฆ์—์„œ ์‚ฌ์šฉ๋˜๋ฉฐ, ์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ์˜ ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜์ง€ ์•Š๋Š” Stateless ํ™˜๊ฒฝ์„ ๊ตฌ์ถ•ํ•˜๋Š” ๋ฐ ํ•ต์‹ฌ์ ์ธ ์—ญํ• 

  • OAuth 2.0์˜ Access Token์ด๋‚˜ OpenID Connect์˜ ID Token ๊ตฌํ˜„์ฒด๋กœ ๋„๋ฆฌ ํ™œ์šฉ

  • ํ† ํฐ ์ž์ฒด๊ฐ€ ์„œ๋ช…๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ, ์„œ๋ฒ„๋Š” ํ† ํฐ์˜ ์ •๋ณด๊ฐ€ ์œ„๋ณ€์กฐ๋˜์ง€ ์•Š์•˜์Œ์„ ๊ฒ€์ฆ ๊ฐ€๋Šฅ

JWT ๊ตฌ์กฐ - Header / Payload / Signature

JWT๋Š” ๋งˆ์นจํ‘œ(.)๋กœ ๊ตฌ๋ถ„๋˜๋Š” ์„ธ ๋ถ€๋ถ„์œผ๋กœ ๊ตฌ์„ฑ๋˜๋ฉฐ, ๊ฐ ๋ถ€๋ถ„์€ Base64Url๋กœ ์ธ์ฝ”๋”ฉ๋˜์–ด ์žˆ๋‹ค.

xxxxx.yyyyy.zzzzz
Header.Payload.Signature

1. Header (ํ—ค๋”)

ํ† ํฐ ์ž์ฒด์— ๋Œ€ํ•œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด๊ณ  ์žˆ์œผ๋ฉฐ, ๋‘ ๊ฐ€์ง€ ์ •๋ณด๋ฅผ ํ•„์ˆ˜๋กœ ํฌํ•จํ•œ๋‹ค.

  • typ (Type): ํ† ํฐ์˜ ํƒ€์ž…์„ ์ง€์ •(๋ณดํ†ต JWT๋กœ ๊ณ ์ •)

  • alg (Algorithm): ํ† ํฐ์„ ์„œ๋ช…(sign)ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ ์•”ํ˜ธํ™” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ง€์ •(์˜ˆ: HS256, RS256)

{
  "alg": "HS256",
  "typ": "JWT"
}

2. Payload (ํŽ˜์ด๋กœ๋“œ)

ํ† ํฐ์ด ์‹ค์ œ๋กœ ์ „๋‹ฌํ•˜๊ณ ์ž ํ•˜๋Š” ์ •๋ณด(ํด๋ ˆ์ž„)๋ฅผ ๋‹ด๊ณ  ์žˆ์œผ๋ฉฐ, ์‚ฌ์šฉ์ž์— ๋Œ€ํ•œ ์ •๋ณด๋‚˜ ํ† ํฐ ์ž์ฒด์— ๋Œ€ํ•œ ์„ค๋ช… ๋“ฑ์„ ๋‚˜ํƒ€๋‚ด๋Š” ํ‚ค-๊ฐ’ ์Œ์œผ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.

๋‹ค์Œ์€ Registered, Public, Private ํด๋ ˆ์ž„์„ ๋ชจ๋‘ ํฌํ•จํ•˜๋Š” JWT ํŽ˜์ด๋กœ๋“œ์˜ ์˜ˆ์‹œ์ด๋‹ค.

  • Registered Claims(๋“ฑ๋ก๋œ ํด๋ ˆ์ž„): JWT ์‚ฌ์–‘์— ์ด๋ฏธ ์ •์˜๋œ ํด๋ ˆ์ž„๋“ค๋กœ, ํ•„์ˆ˜๋Š” ์•„๋‹ˆ์ง€๋งŒ ์ƒํ˜ธ ์šด์šฉ์„ฑ์„ ์œ„ํ•ด ์‚ฌ์šฉ ๊ถŒ์žฅ

    • iss(Issuer): ํ† ํฐ ๋ฐœ๊ธ‰์ž

    • sub(Subject): ํ† ํฐ์˜ ์ฃผ์ฒด(์˜ˆ: ์‚ฌ์šฉ์ž์˜ ๊ณ ์œ  ID)

    • aud(Audience): ํ† ํฐ์˜ ์ˆ˜์‹ ์ž(์ด ํ† ํฐ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ์„œ๋น„์Šค)

    • exp(Expiration Time): ํ† ํฐ์˜ ๋งŒ๋ฃŒ ์‹œ๊ฐ„

    • iat(Issued At): ํ† ํฐ์ด ๋ฐœ๊ธ‰๋œ ์‹œ๊ฐ„

  • Public Claims(๊ณต๊ฐœ ํด๋ ˆ์ž„): JWT๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์—ฌ๋Ÿฌ ์ฃผ์ฒด๋“ค์ด ๊ณตํ†ต์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๊ณต๊ฐœ์ ์œผ๋กœ ์ •์˜๋œ ํด๋ ˆ์ž„

    • ๊ณต๊ฐœ๋˜์–ด๋„ ์ข‹์€ ์ •๋ณด๊ฐ€ ์•„๋‹Œ, ํ‘œ์ค€์ฒ˜๋Ÿผ ๊ณต๊ฐœ์ ์œผ๋กœ ์ •์˜๋œ ๊ทœ์•ฝ์ด๋ผ๋Š” ์˜๋ฏธ

    • ์ด๋ฆ„ ์ถฉ๋Œ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด IANA JWT ํด๋ ˆ์ž„ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์— ๋“ฑ๋กํ•˜๊ฑฐ๋‚˜, URI ํ˜•์‹์œผ๋กœ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ๊ด€๋ฆฌ

  • Private Claims(๋น„๊ณต๊ฐœ ํด๋ ˆ์ž„): ํ† ํฐ์„ ๋ฐœ๊ธ‰ํ•˜๋Š” ์„œ๋ฒ„์™€ ํ† ํฐ์„ ์‚ฌ์šฉํ•˜๋Š” ์„œ๋ฒ„ ๊ฐ„์— ํ˜‘์˜ ํ•˜์— ์‚ฌ์šฉํ•˜๋Š” ๋น„๊ณต๊ฐœ์ ์ธ ํด๋ ˆ์ž„(์˜ˆ: role: "editor")

ํŽ˜์ด๋กœ๋“œ๋Š” ๋‹จ์ˆœํžˆ Base64Url๋กœ ์ธ์ฝ”๋”ฉ๋˜์—ˆ์„ ๋ฟ, ์•”ํ˜ธํ™”๋œ ๊ฒƒ์ด ์•„๋‹ˆ๋ฏ€๋กœ, ๋น„๋ฐ€๋ฒˆํ˜ธ์™€ ๊ฐ™์€ ๋ฏผ๊ฐํ•œ ์ •๋ณด๋Š” ์ ˆ๋Œ€ ํŽ˜์ด๋กœ๋“œ์— ๋‹ด์•„์„œ๋Š” ์•ˆ ๋œ๋‹ค.

3. Signature(์„œ๋ช…)

์„œ๋ช…์€ ํ† ํฐ์˜ ๋ฌด๊ฒฐ์„ฑ(Integrity)๊ณผ ๋ฐœ๊ธ‰์ž์˜ ์‹ ์›(Authenticity)์„ ๋ณด์žฅํ•˜๋Š” ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์ด๋‹ค.

  • ์„œ๋ช…์€ ์ธ์ฝ”๋”ฉ๋œ Header์™€ Payload๋ฅผ ํ•ฉ์น˜๊ณ , ์ง€์ •๋œ ๋น„๋ฐ€ ํ‚ค(Secret) ๋˜๋Š” ๊ฐœ์ธ ํ‚ค(Private Key)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ alg์— ๋ช…์‹œ๋œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ์•”ํ˜ธํ™”ํ•˜์—ฌ ์ƒ์„ฑ

  • ์ˆ˜์‹  ์ธก์€ ์ด ์„œ๋ช…์„ ๊ฒ€์ฆํ•จ์œผ๋กœ์จ, ํ† ํฐ์ด ์ค‘๊ฐ„์— ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜์œผ๋ฉฐ ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐœ๊ธ‰์ž์— ์˜ํ•ด ๋ฐœ๊ธ‰๋˜์—ˆ์Œ์„ ํ™•์ธ

์„œ๋ช… ์•Œ๊ณ ๋ฆฌ์ฆ˜

JWT ์„œ๋ช… ๋ฐฉ์‹์€ ๋Œ€์นญํ‚ค์™€ ๋น„๋Œ€์นญํ‚ค ๋ฐฉ์‹์œผ๋กœ ๋‚˜๋‰œ๋‹ค.

  • HS256(HMAC with SHA-256): ๋Œ€์นญํ‚ค ์•Œ๊ณ ๋ฆฌ์ฆ˜

    • ํ•˜๋‚˜์˜ ๋น„๋ฐ€ ํ‚ค(Secret)๋ฅผ ์„œ๋ช…๊ณผ ๊ฒ€์ฆ์— ๋ชจ๋‘ ์‚ฌ์šฉ

    • ์„œ๋ฒ„ ๋‚ด์—์„œ ํ† ํฐ์„ ์ƒ์„ฑํ•˜๊ณ  ๊ฒ€์ฆํ•˜๋Š” ๋“ฑ, ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ๋‹จ์ผ ์‹œ์Šคํ…œ ํ˜น์€ ์†Œ์ˆ˜์˜ ์‹œ์Šคํ…œ ํ™˜๊ฒฝ์— ์ ํ•ฉ

    • ๋‹จ์ : ์„œ๋ช…์„ ๊ฒ€์ฆํ•ด์•ผ ํ•˜๋Š” ๋ชจ๋“  ์ฃผ์ฒด๊ฐ€ ๋™์ผํ•œ ๋น„๋ฐ€ ํ‚ค๋ฅผ ๊ณต์œ ํ•ด์•ผ ํ•˜๋ฏ€๋กœ, ํ‚ค๊ฐ€ ์œ ์ถœ๋  ๊ฒฝ์šฐ ๋ˆ„๊ตฌ๋‚˜ ์œ ํšจํ•œ ํ† ํฐ์„ ์ƒ์„ฑ ๊ฐ€๋Šฅ ์œ„ํ—˜ ์กด์žฌ

  • RS256(RSA Signature with SHA-256): ๋น„๋Œ€์นญํ‚ค ์•Œ๊ณ ๋ฆฌ์ฆ˜

    • ๊ฐœ์ธ ํ‚ค(Private Key)๋กœ ์„œ๋ช…ํ•˜๊ณ , ์Œ์„ ์ด๋ฃจ๋Š” ๊ณต๊ฐœ ํ‚ค(Public Key)๋กœ ๊ฒ€์ฆ

    • ํ† ํฐ ๋ฐœ๊ธ‰์ž(์˜ˆ: ์ธ์ฆ ์„œ๋ฒ„)๋งŒ์ด ๊ฐœ์ธ ํ‚ค๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ๋ณด๊ด€ํ•˜๊ณ , ํ† ํฐ ๊ฒ€์ฆ์ž(์˜ˆ: ๋ฆฌ์†Œ์Šค ์„œ๋ฒ„๋“ค)๋Š” ๊ณต๊ฐœ ํ‚ค๋งŒ ์†Œ์ง€ํ•˜์—ฌ ๊ฒ€์ฆ

    • MSA(Microservice Architecture)์™€ ๊ฐ™์ด ์—ฌ๋Ÿฌ ์„œ๋น„์Šค์—์„œ ํ† ํฐ์„ ๊ฒ€์ฆํ•ด์•ผ ํ•˜๋Š” ๋ถ„์‚ฐ ํ™˜๊ฒฝ์— ์ ํ•ฉํ•˜๋ฉฐ, ํ˜„์žฌ ๊ฐ€์žฅ ๋„๋ฆฌ ๊ถŒ์žฅ๋˜๋Š” ๋ฐฉ์‹

spinner

JWT ๋ณด์•ˆ ๋ฐ ์ฃผ์˜์‚ฌํ•ญ

JWT๋Š” ํŽธ๋ฆฌํ•˜์ง€๋งŒ, ์ž˜๋ชป ์‚ฌ์šฉํ•˜๋ฉด ์‹ฌ๊ฐํ•œ ๋ณด์•ˆ ์ทจ์•ฝ์ ์œผ๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค.

  • alg: none ์ทจ์•ฝ์ 

    • ๊ณผ๊ฑฐ ์ผ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ alg ํ—ค๋”๋ฅผ none์œผ๋กœ ์„ค์ •ํ•˜๋ฉด ์„œ๋ช… ๊ฒ€์ฆ์„ ๊ฑด๋„ˆ๋›ฐ๋Š” ์ทจ์•ฝ์  ์กด์žฌ

    • ๊ณต๊ฒฉ์ž๋Š” ์„œ๋ช…์„ ์ œ๊ฑฐํ•˜๊ณ  alg๋ฅผ none์œผ๋กœ ์กฐ์ž‘ํ•˜์—ฌ ์œ ํšจํ•œ ํ† ํฐ์ธ ๊ฒƒ์ฒ˜๋Ÿผ ์œ„์žฅ ๊ฐ€๋Šฅ

    • ํ•ด๊ฒฐ์ฑ…: ์„œ๋ฒ„๋Š” ๋ฐ˜๋“œ์‹œ alg: none์„ ๊ฑฐ๋ถ€ํ•˜๊ณ , ํ—ˆ์šฉํ•  ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ชฉ๋ก(Whitelist)์„ ๋ช…์‹œ์ ์œผ๋กœ ๊ด€๋ฆฌ

  • ํ† ํฐ ์ €์žฅ ์œ„์น˜(localStorage vs HttpOnly Cookie)

    • localStorage: JavaScript๋กœ ์ ‘๊ทผ์ด ์‰ฌ์›Œ ์‚ฌ์šฉ์ด ํŽธ๋ฆฌํ•˜์ง€๋งŒ, XSS(Cross-Site Scripting) ๊ณต๊ฒฉ์— ์ทจ์•ฝ

      • ์•…์„ฑ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ฃผ์ž…๋˜๋ฉด ํ† ํฐ ํƒˆ์ทจ ๊ฐ€๋Šฅ์„ฑ ์กด์žฌ

    • HttpOnly Cookie: JavaScript ์ ‘๊ทผ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜์—ฌ XSS ๊ณต๊ฒฉ์œผ๋กœ๋ถ€ํ„ฐ ํ† ํฐ์„ ๋ณดํ˜ธ ๊ฐ€๋Šฅ

      • ํ•˜์ง€๋งŒ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋ชจ๋“  ์š”์ฒญ์— ์ž๋™์œผ๋กœ ์ฟ ํ‚ค๋ฅผ ํฌํ•จ์‹œํ‚ค๋ฏ€๋กœ CSRF(Cross-Site Request Forgery) ๊ณต๊ฒฉ์— ์ทจ์•ฝ(SameSite ์†์„ฑ์œผ๋กœ ์™„ํ™” ๊ฐ€๋Šฅ)

  • Stateless์™€ ํ† ํฐ ํ๊ธฐ์˜ ์–ด๋ ค์›€

    • JWT๋Š” ์„œ๋ฒ„๊ฐ€ ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜์ง€ ์•Š๋Š” Statelessํ•˜๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์ง€๋งŒ, ์ด๋Š” ๊ณง ํ•œ ๋ฒˆ ๋ฐœ๊ธ‰๋œ ํ† ํฐ์„ ๋งŒ๋ฃŒ ์ „์˜ ํ๊ธฐ ์–ด๋ ค์›€ ์กด์žฌ

    • ํ•ด๊ฒฐ์ฑ…

      1. ์งง์€ ๋งŒ๋ฃŒ ์‹œ๊ฐ„: Access Token์˜ ๋งŒ๋ฃŒ ์‹œ๊ฐ„์„ ๋งค์šฐ ์งง๊ฒŒ(์˜ˆ: 5~15๋ถ„) ์„ค์ •ํ•˜์—ฌ ํƒˆ์ทจ๋˜๋”๋ผ๋„ ์œ„ํ—˜์„ ์ตœ์†Œํ™”

      2. ํ† ํฐ ํ๊ธฐ ๋ชฉ๋ก(Blacklist) ์œ ์ง€: ํ๊ธฐ๋œ ํ† ํฐ ID๋ฅผ ๋ณ„๋„์˜ ์ €์žฅ์†Œ(์˜ˆ: Redis)์— ๋ชฉ๋ก์œผ๋กœ ๊ด€๋ฆฌ(JWT์˜ Stateless ์žฅ์ ์„ ์ผ๋ถ€ ํฌ์ƒํ•˜๋Š” ๋ฐฉ๋ฒ•)

Refresh Token ์ „๋žต

Access Token ๋‹จ๋… ์‚ฌ์šฉ์˜ ํ•œ๊ณ„

JWT๋ฅผ Access Token ํ•˜๋‚˜๋กœ๋งŒ ์šด์šฉํ•  ๊ฒฝ์šฐ, Stateless ํŠน์„ฑ์ด ์˜คํžˆ๋ ค ๋ณด์•ˆ์ƒ ํ˜น์€ ํŽธ์˜์ƒ ์•ฝ์ ์œผ๋กœ ์ž‘์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ์ œ์–ด๊ถŒ ์ƒ์‹ค: ํ† ํฐ์ด ํƒˆ์ทจ๋˜์–ด๋„ ์„œ๋ฒ„์—์„œ ๊ฐ•์ œ๋กœ ๋กœ๊ทธ์•„์›ƒ(๋ฌดํšจํ™”)์‹œํ‚ฌ ๋ฐฉ๋ฒ• ์—†์Œ

  • ์œ ํšจ๊ธฐ๊ฐ„ ๋”œ๋ ˆ๋งˆ: ๋ณด์•ˆ์„ ์œ„ํ•ด ๊ธฐ๊ฐ„์„ ์งง๊ฒŒ ์žก์œผ๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ๋„ˆ๋ฌด ์ž์ฃผ ๋กœ๊ทธ์ธํ•ด์•ผ ํ•˜๊ณ , ๊ธธ๊ฒŒ ์žก์œผ๋ฉด ํƒˆ์ทจ ์‹œ ํ”ผํ•ด ํ™•๋Œ€ ๊ฐ€๋Šฅ์„ฑ ์กด์žฌ

๋‘ ํ† ํฐ์˜ ์—ญํ•  ๋ถ„๋‹ด

๊ตฌ๋ถ„
Access Token
Refresh Token

๋ชฉ์ 

๋ฆฌ์†Œ์Šค ์ ‘๊ทผ ์Šน์ธ

์ƒˆ๋กœ์šด Access Token ๋ฐœ๊ธ‰

์œ ํšจ ๊ธฐ๊ฐ„

๋งค์šฐ ์งง์Œ

์ƒ๋Œ€์ ์œผ๋กœ ๊น€

์ €์žฅ์†Œ

ํด๋ผ์ด์–ธํŠธ ๋ฉ”๋ชจ๋ฆฌ(๋ณ€์ˆ˜) ๋“ฑ

์„œ๋ฒ„ DB / Redis ๋ฐ ํด๋ผ์ด์–ธํŠธ(HttpOnly Cookie)

์ธ์ฆ ์‹œ๋‚˜๋ฆฌ์˜ค(Flow)

spinner
  1. ๋กœ๊ทธ์ธ ์„ฑ๊ณต: ์„œ๋ฒ„๋Š” Access Token(AT)๊ณผ Refresh Token(RT)์„ ๋ชจ๋‘ ๋ฐœ๊ธ‰

    • ์ด๋•Œ RT๋Š” ์„œ๋ฒ„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋‚˜ Redis์— ์ €์žฅํ•˜์—ฌ ์ถ”์  ๊ฐ€๋Šฅํ•˜๊ฒŒ ๊ด€๋ฆฌ

  2. API ์š”์ฒญ: ํด๋ผ์ด์–ธํŠธ๋Š” AT๋ฅผ ํ—ค๋”์— ๋‹ด์•„ ์š”์ฒญ ์ „์†ก

    • ์„œ๋ฒ„๋Š” AT์˜ ์„œ๋ช…์„ ๊ฒ€์ฆํ•˜๊ณ  ์‘๋‹ต

  3. AT ๋งŒ๋ฃŒ: AT๊ฐ€ ๋งŒ๋ฃŒ๋˜๋ฉด ์„œ๋ฒ„๋Š” 401 Unauthorized ์—๋Ÿฌ๋ฅผ ๋ฐ˜ํ™˜

  4. ํ† ํฐ ๊ฐฑ์‹ : ํด๋ผ์ด์–ธํŠธ๋Š” ์ €์žฅํ•ด๋‘” RT๋ฅผ ์„œ๋ฒ„์˜ ๋ณ„๋„ ๊ฐฑ์‹  ์—”๋“œํฌ์ธํŠธ๋กœ ์ „์†กํ•˜์—ฌ ์ƒˆ๋กœ์šด AT ์š”์ฒญ

  5. ๊ฒ€์ฆ ๋ฐ ์žฌ๋ฐœ๊ธ‰: ์„œ๋ฒ„๋Š” RT์˜ ์œ ํšจ์„ฑ์„ DB์™€ ๋Œ€์กฐํ•˜์—ฌ ํ™•์ธํ•œ ํ›„, ์ƒˆ๋กœ์šด AT๋ฅผ ๋ฐœ๊ธ‰

๋ณด์•ˆ ๊ฐ•ํ™” ๊ธฐ๋ฒ• - Refresh Token Rotation

RT๋Š” ์ˆ˜๋ช…์ด ๊ธธ๊ธฐ ๋•Œ๋ฌธ์— ์ด ํ† ํฐ ์ž์ฒด๊ฐ€ ํƒˆ์ทจ๋˜๋ฉด ๊ณต๊ฒฉ์ž๊ฐ€ ์ง€์†์ ์œผ๋กœ AT๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ์œ„ํ—˜์ด ์žˆ์–ด, ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด Refresh Token Rotation ๊ธฐ๋ฒ•์„ ๊ถŒ์žฅํ•œ๋‹ค.

  • ๋™์ž‘ ๋ฐฉ์‹: ํด๋ผ์ด์–ธํŠธ๊ฐ€ RT๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ AT๋ฅผ ๊ฐฑ์‹ ํ•  ๋•Œ, ๊ธฐ์กด์˜ RT๋ฅผ ๋ฌดํšจํ™”ํ•˜๊ณ  ์ƒˆ๋กœ์šด RT๋„ ํ•จ๊ป˜ ๋ฐœ๊ธ‰

  • ํšจ๊ณผ

    • ๋งŒ์•ฝ ๊ณต๊ฒฉ์ž๊ฐ€ RT๋ฅผ ํƒˆ์ทจํ•ด ๋จผ์ € ์‚ฌ์šฉํ–ˆ๋‹ค๋ฉด, ์ดํ›„ ์ •๋‹นํ•œ ์‚ฌ์šฉ์ž๊ฐ€ ๋™์ผํ•œ RT๋กœ ๊ฐฑ์‹ ์„ ์‹œ๋„ํ•  ๋•Œ ์„œ๋ฒ„๋Š” ์ด๋ฏธ ์‚ฌ์šฉ๋œ RT์ž„์„ ๊ฐ์ง€

    • ์ด ๊ฒฝ์šฐ ํ•ด๋‹น ์‚ฌ์šฉ์ž์™€ ๊ด€๋ จ๋œ ๋ชจ๋“  ํ† ํฐ์„ ์ฆ‰์‹œ ๋ฌดํšจํ™”ํ•˜์—ฌ ํ”ผํ•ด ์ตœ์†Œํ™”

๋•Œ๋ฌธ์— Refresh Token์„ ์„œ๋ฒ„ side(์˜ˆ: Redis)์—์„œ ๊ด€๋ฆฌํ•˜๊ฒŒ ๋˜๋ฉด ์™„์ „ํ•œ Stateless๋Š” ๊นจ์ง€๊ฒŒ ๋˜์ง€๋งŒ, ์‹ค๋ฌด์—์„œ๋Š” ๋ณด์•ˆ์ƒ์˜ ์ด์œ ๋กœ ์ด๋Ÿฌํ•œ Hybrid ๋ฐฉ์‹์„ ํ‘œ์ค€์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•œ๋‹ค.

Last updated