๐Ÿ“š JWT(Json Web Token)

CodeByHanยท2025๋…„ 3์›” 25์ผ

์Šคํ”„๋ง

๋ชฉ๋ก ๋ณด๊ธฐ
15/33

์ธ์ฆ(Authentication)

  • ์‚ฌ์šฉ์ž์˜ ์‹ ์›์„ ํ™•์ธํ•˜๋Š” ๊ณผ์ •
  • ์˜ˆ์‹œ) ๋กœ๊ทธ์ธ ์‹œ ์•„์ด๋””์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•˜๊ฑฐ๋‚˜, ์ƒ์ฒด์ธ์‹(์ง€๋ฌธ, ์–ผ๊ตด ์ธ์‹)์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ
  • "๋ˆ„๊ตฌ์ธ๊ฐ€?"๋ฅผ ํ™•์ธ

์ธ๊ฐ€ (Authorization)

  • ์ธ์ฆ๋œ ์‚ฌ์šฉ์ž๊ฐ€ ์–ด๋–ค ๋ฆฌ์†Œ์Šค์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๊ถŒํ•œ์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ณผ์ •์ž…๋‹ˆ๋‹ค.
  • ์ฆ‰, ์‚ฌ์šฉ์ž๊ฐ€ ํŠน์ • ์ž‘์—…์ด๋‚˜ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š”์ง€๋ฅผ ๊ฒฐ์ •
  • ์˜ˆ์‹œ) ์€ํ–‰ ์•ฑ์—์„œ ๊ณ„์ขŒ ์กฐํšŒ๋Š” ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ๊ณ„์ขŒ๋Š” ๋ณผ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ
  • "๋ฌด์—‡์„ ํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€?"๋ฅผ ๊ฒฐ์ •

๐Ÿ“š JWT(Json Web Token)

์ธ์ฆ(Authentication) ๋ฐ ์ธ๊ฐ€(Authorization)์— ํ•„์š”ํ•œ ์ •๋ณด๋“ค์„ ์•”ํ˜ธํ™” ์‹œํ‚จ JSON ํ† ํฐ์„ ์˜๋ฏธํ•œ๋‹ค.

๐Ÿ“Œ JWT ๊ตฌ์กฐ

1) Header

{ 
 "typ": "JWT",
 "alg": "HS256"
}
  • typ : ํ† ํฐ ์œ ํ˜•
  • alg : ์„œ๋ช… ์•”ํ˜ธํ™” ์•Œ๊ณ ๋ฆฌ์ฆ˜(HMAC-SHA256,RSA)

2) Payload

ํด๋ ˆ์ž„(claims)์„ ํฌํ•จํ•œ๋‹ค. ํด๋ ˆ์ž„(claims)์€ key-value ํ˜•์‹์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ํ•œ ์Œ์˜ ์ •๋ณด

{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true
}

ํŽ˜์ด๋กœ๋“œ๋Š” ์ •ํ•ด์ง„ ๋ฐ์ดํ„ฐ ํƒ€์ž…์ด ์—†๋‹ค. ๋Œ€ํ‘œ์ ์œผ๋กœ ๋“ฑ๋ก๋œ ํด๋ ˆ์ž„, ๊ณต๊ฐœ ํด๋ ˆ์ž„, ๋น„๊ณต๊ฐœ ํด๋ ˆ์ž„ ์ด ์กด์žฌํ•œ๋‹ค.

Registed claims(๋“ฑ๋ก๋œ ํด๋ ˆ์ž„)

  • iss(issuer)(๋ฐœํ–‰์ž)
  • exp(expireation time)(๋งŒ๋ฃŒ ์‹œ๊ฐ„)
  • sub(subject)(์ œ๋ชฉ)
  • iat(issued At)(๋ฐœํ–‰ ์‹œ๊ฐ„)
  • jti(JWI ID)

Public claims(๊ณต๊ฐœ ํด๋ ˆ์ž„)

  • ์‚ฌ์šฉ์ž๊ฐ€ ์ •์˜ ๊ฐ€๋Šฅํ•œ ํด๋ ˆ์ž„ ๊ณต๊ฐœ์šฉ ์ •๋ณด ์ „๋‹ฌ์„ ์œ„ํ•ด ์‚ฌ์šฉ

Private claims(๋น„๊ณต๊ฐœ ํด๋ ˆ์ž„)

  • ํ•ด๋‹นํ•˜๋Š” ๋‹น์‚ฌ์ž๋“ค ๊ฐ„์— ์ •๋ณด๋ฅผ ๊ณต์œ ํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“ค์–ด์ง„ ์‚ฌ์šฉ์ž ์ง€์ • ํด๋ ˆ์ž„, ์™ธ๋ถ€์— ๊ณต๊ฐœ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ํ•ด๋‹น ์‚ฌ์šฉ์ž๋ฅผ ํŠน์ •ํ•  ์ˆ˜ ์žˆ๋Š” ์ •๋ณด๋ฅผ ๋‹ด์Œ

3) Signature

HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret)
  • Signature ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ํ—ค๋”์— ์ •์˜ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜(alg)๋ฅผ ํ™œ์šฉ
  • Signature์˜ ๊ตฌ์กฐ๋Š” (Header + payload) ์™€ ์„œ๋ฒ„๊ฐ€ ๊ฐ–๊ณ  ์žˆ๋Š” ์œ ์ผํ•œ ket(์‹œํฌ๋ฆฟ ํ‚ค)๊ฐ’์„ ํ•ฉ์นœ ๊ฒƒ์„ Header์—์„œ ์ •์˜ํ•œ alg ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ์•”ํ˜ธํ™” ํ•œ๋‹ค.
Signature = Base64Url(Header) +.+ Base64Url(Payload) + ์„œ๋ฒ„์˜ ์œ ์ผํ•œ ํ‚ค(Secret Key)

๐Ÿค” Header์™€ payload๋Š” ์ œ 3์ž๊ฐ€ ๋ณตํ˜ธํ™” ๋ฐ ์กฐ์ž‘ ๊ฐ€๋Šฅ์„ฑ ์žˆ์ง€๋งŒ Secret key๋ฅผ ๋ชจ๋ฅด๋ฉด ๋ณตํ˜ธํ™” ๋ฐ ์กฐ์ž‘์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. - > ๋”ฐ๋ผ์„œ Signature๋Š” ํ† ํฐ์˜ ์œ„๋ณ€์กฐ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜๋Š”๋ฐ ์‚ฌ์šฉ

๐Ÿ“Œ JWT ์ž‘๋™ ๋ฐฉ์‹

  • Access Token : ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๊ฐ–๊ณ ์žˆ๋Š” ์‹ค์ œ๋กœ ์œ ์ €์˜ ์ •๋ณด๊ฐ€ ๋‹ด๊ธด ํ† ํฐ์œผ๋กœ, ํด๋ผ์ด์–ธํŠธ์—์„œ ์š”์ฒญ์ด ์˜ค๋ฉด ์„œ๋ฒ„์—์„œ ํ•ด๋‹น ํ† ํฐ์— ์žˆ๋Š” ์ •๋ณด๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ •๋ณด์— ๋งž๊ฒŒ ์‘๋‹ต์„ ์ง„ํ–‰
  • Refresh Token : ์ƒˆ๋กœ์šด Access Token์„ ๋ฐœ๊ธ‰ํ•ด์ฃผ๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ํ† ํฐ์œผ๋กœ ์งง์€ ์ˆ˜๋ช…์„ ๊ฐ€์ง€๋Š” Access Token์—๊ฒŒ ์ƒˆ๋กœ์šด ํ† ํฐ์„ ๋ฐœ๊ธ‰ํ•ด์ฃผ๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ, Access Token ๋ณด๋‹ค ๊ธด ์ˆ˜๋ช…์„ ๊ฐ€์ง€๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด ํŠน์ง•

  1. ์‚ฌ์šฉ์ž๊ฐ€ ID, PW๋ฅผ ์ž…๋ ฅํ•˜์—ฌ ์„œ๋ฒ„์— ๋กœ๊ทธ์ธ ์ธ์ฆ
  2. ์„œ๋ฒ„์—์„œ ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ ์ธ์ฆ ์š”์ฒญ์„ ๋ฐ›์œผ๋ฉด, Header, PayLoad, Signature๋ฅผ ์ •์˜
    -> Hedaer, PayLoad, Signature๋ฅผ ๊ฐ๊ฐ Base64๋กœ ํ•œ ๋ฒˆ ๋” ์•”ํ˜ธํ™”ํ•˜์—ฌ JWT๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ด๋ฅผ ์ฟ ํ‚ค์— ๋‹ด์•„ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋ฐœ๊ธ‰
  3. ํด๋ผ์ด์–ธํŠธ๋Š” ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ JWT๋ฅผ ๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€์— ์ €์žฅ(์ฟ ํ‚ค(Cookie)์—๋„ ๊ฐ€๋Šฅ)
    -> API๋ฅผ ์„œ๋ฒ„์— ์š”์ฒญํ• ๋•Œ Authorization header์— Access Token์„ ๋‹ด์•„์„œ ์š”์ฒญ
  4. ์„œ๋ฒ„๊ฐ€ ํ•  ์ผ์€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ Header์— ๋‹ด์•„์„œ ๋ณด๋‚ธ JWT๊ฐ€ ๋‚ด ์„œ๋ฒ„์—์„œ ๋ฐœํ–‰ํ•œ ํ† ํฐ์ธ์ง€ ์ผ์น˜ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜์—ฌ ์ผ์น˜ํ•œ๋‹ค๋ฉด ์ธ์ฆ์„ ํ†ต๊ณผ์‹œ์ผœ์ฃผ๊ณ  ์•„๋‹ˆ๋ผ๋ฉด ํ†ต๊ณผ์‹œํ‚ค์ง€ ์•Š์œผ๋ฉด ๋œ๋‹ค.
    -> ์ธ์ฆ์ด ํ†ต๊ณผ๋˜์—ˆ์œผ๋ฏ€๋กœ ํŽ˜์ด๋กœ๋“œ์— ๋“ค์–ด์žˆ๋Š” ์œ ์ €์˜ ์ •๋ณด๋“ค์„ ๊ณจ๋ผ์„œ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ค€๋‹ค.
  5. ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„์— ์š”์ฒญ์„ ํ–ˆ๋Š”๋ฐ, ๋งŒ์ผ ์•ก์„ธ์Šค ํ† ํฐ์˜ ์‹œ๊ฐ„์ด ๋งŒ๋ฃŒ๋˜๋ฉด ํด๋ผ์ด์–ธํŠธ๋Š” ๋ฆฌํ”„๋ž˜์‹œ ํ† ํฐ์„ ์ด์šฉ
  6. ๋ฆฌํ”„๋ ˆ์‹œ ํ† ํฐ์ด ์œ ํšจํ•˜๋ฉด ์„œ๋ฒ„๋Š” ์ƒˆ๋กœ์šด ์•ก์„ธ์Šค ํ† ํฐ ๋ฐœ๊ธ‰
  7. ๋‹ค์‹œ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์•ก์„ธ์Šค ํ† ํฐ ์ „๋‹ฌ

๐Ÿค” ์„œ๋ฒ„๋Š” ํ† ํฐ ์•ˆ์— ๋“ค์–ด์žˆ๋Š” ์ •๋ณด๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์•„๋Š”๊ฒŒ ์ค‘์š”ํ•œ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ํ•ด๋‹น ํ† ํฐ์ด ์œ ํšจํ•œ ํ† ํฐ์ธ์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ JWT์˜ ํ—ค๋”, ํŽ˜์ด๋กœ๋“œ๋ฅผ ์„œ๋ฒ„์˜ key๊ฐ’์„ ์ด์šฉํ•ด ์‹œ๊ทธ๋‹ˆ์ฒ˜๋ฅผ ๋‹ค์‹œ ๋งŒ๋“ค๊ณ  ์ด๋ฅผ ๋น„๊ตํ•˜๋ฉฐ ์ผ์น˜ํ–ˆ์„ ๊ฒฝ์šฐ ์ธ์ฆ์„ ํ†ต๊ณผ

๐Ÿค” JWT์€ ์„œ๋ช…(์ธ์ฆ)์ด ๋ชฉ์ 

  • JWT๋Š” Base64๋กœ ์•”ํ˜ธํ™”๋ฅผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋””๋ฒ„๊ฑฐ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ธ์ฝ”๋”ฉ๋œ JWT๋ฅผ 1์ดˆ๋งŒ์— ๋ณตํ˜ธํ™” ๊ฐ€๋Šฅ
  • ๋ณตํ˜ธํ™” ํ•˜๋ฉด ์‚ฌ์šฉ์ž์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด์€ Payload ๋ถ€๋ถ„์ด ๊ทธ๋Œ€๋กœ ๋…ธ์ถœ -> ๊ทธ๋ž˜์„œ ํŽ˜์ด๋กœ๋“œ์—๋Š” ๋น„๋ฐ€๋ฒˆํ˜ธ์™€ ๊ฐ™์€ ๋ฏผ๊ฐํ•œ ์ •๋ณด๋Š” ๋„ฃ์ง€ ๋ง์ž

โ‰๏ธ JWT ์‚ฌ์šฉ ์ด์œ ?

  • Header์™€ Payload๋กœ Signature๋ฅผ ๋งŒ๋“œ๋ฏ€๋กœ ๋ฐ์ดํ„ฐ ์œ„๋ณ€์กฐ๋ฅผ ๋ง‰์„ ์ˆ˜ ์žˆ๋‹ค.
  • ์„œ๋ฒ„๊ฐ€ ๋ณ„๋„์˜ ์ €์žฅ์†Œ๊ฐ€ ํ•„์š”์—†๋‹ค.
  • ๋ฌด์ƒํƒœ(StateLess)
  • OAuth์˜ ๊ฒฝ์šฐ Facebook, Google ๋“ฑ ์†Œ์…œ ๊ณ„์ •์„ ์ด์šฉํ•˜์—ฌ ๋‹ค๋ฅธ ์›น์„œ๋น„์Šค์—์„œ๋„ ๋กœ๊ทธ์ธ ๊ฐ€๋Šฅ

์ƒํƒœ(Stateful)

  • ํด๋ผ์ด์–ธํŠธ์˜ ์ƒํƒœ ์ •๋ณด๋ฅผ ์„œ๋ฒ„์— ์ €์žฅํ•˜๊ณ  ์œ ์ง€
  • ์„œ๋ฒ„์ธก์—์„œ ํด๋ผ์ด์–ธํŠธ์˜ ์ƒํƒœ๋ฅผ ๊ณ„์† ์œ ์ง€ํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋งŽ์€ ๋ฉ”๋ชจ๋ฆฌ ์†Œ๋ชจ

๋ฌด์ƒํƒœ(Stateless)

  • ์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ์˜ ์ƒํƒœ๋ฅผ ๋ณด์กดํ•˜์ง€ ์•Š์Œ
  • ์„œ๋ฒ„๋Š” ๋‹จ์ˆœํžˆ ์š”์ฒญ์ด ์˜ค๋ฉด ์‘๋‹ต์„ ๋ณด๋‚ด๋Š” ์—ญํ• ๋งŒ ์ˆ˜ํ–‰
  • ์„œ๋ฒ„๋Š” ๋‹จ์ˆœํžˆ ๋ฐ›์•„์„œ ์‘๋‹ต๋งŒ ํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ์ƒํƒœ ์œ ์ง€์— ๋Œ€ํ•œ ๋ถ€ํ•˜ ๊ฐ์†Œ

๐Ÿ“Œ Jwt์˜ ์ธ์ฆ ๋ฐฉ์‹(์ฟ ํ‚ค(Cookie) vs ํ—ค๋”(Header))

JWT๋Š” ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๊ฐ„์— ์ธ์ฆ ์ •๋ณด๋ฅผ ์ „๋‹ฌํ•˜๋Š” ์ˆ˜๋‹จ์œผ๋กœ, ์ฟ ํ‚ค ๋ฐฉ์‹๊ณผ HTTP ํ—ค๋” ๋ฐฉ์‹(์ฃผ๋กœ Authorization ํ—ค๋”์˜ Bearer ์Šคํ‚ค๋งˆ ์‚ฌ์šฉ) ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.

1) ์ฟ ํ‚ค(Cookie)

  • ์„œ๋ฒ„๊ฐ€ JWT ํ† ํฐ์„ ์ฟ ํ‚ค์— ์ €์žฅํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ์— ์ „์†กํ•˜๊ณ , ํด๋ผ์ด์–ธํŠธ๋Š” ์ž๋™์œผ๋กœ ์ฟ ํ‚ค๋ฅผ ํฌํ•จํ•˜์—ฌ ์š”์ฒญํ•œ๋‹ค.
  • HttpOnly, Secure, SameSite ๋“ฑ์˜ ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ ‘๊ทผ์„ ์ฐจ๋‹จํ•˜๊ณ  ๋ณด์•ˆ์„ ๊ฐ•ํ™” ๊ฐ€๋Šฅ
  • ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ž๋™์œผ๋กœ ์ฟ ํ‚ค๋ฅผ ํฌํ•จํ•ด ์ „์†กํ•˜๋ฏ€๋กœ, CSRF(์‚ฌ์ดํŠธ ๊ฐ„ ์š”์ฒญ ์œ„์กฐ) ๊ณต๊ฒฉ์— ์ทจ์•ฝ
Cookie cookie = new Cookie("accessToken", jwt);
cookie.setHttpOnly(true); // ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ ‘๊ทผ ๋ถˆ๊ฐ€
ookie.setSecure(true);   // HTTPS ํ™˜๊ฒฝ์—์„œ๋งŒ ์ „์†ก (๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ๋Š” false๋กœ ์„ค์ • ๊ฐ€๋Šฅ)
cookie.setPath("/");
cookie.setMaxAge(3600);   // 1์‹œ๊ฐ„ (์ดˆ ๋‹จ์œ„)
response.addCookie(cookie);

2) ํ—ค๋”(Header)

  • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ง์ ‘ ํ† ํฐ์„ ๊ด€๋ฆฌํ•˜์—ฌ ํ•„์š”ํ•œ ์š”์ฒญ์—๋งŒ ๋ช…์‹œ์ ์œผ๋กœ ์ฒจ๋ถ€ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, CSRF ๊ณต๊ฒฉ ์œ„ํ—˜ ๊ฐ์†Œ
  • ํ† ํฐ์„ ๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€๋‚˜ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•˜๋Š” ๊ฒฝ์šฐ, XSS(์‚ฌ์ดํŠธ ๊ฐ„ ์Šคํฌ๋ฆฝํŒ…) ๊ณต๊ฒฉ์— ๋…ธ์ถœ๋  ์œ„ํ—˜ ๊ฐ€๋Šฅ

๐Ÿ“Œ JWT BlackList(๋ธ”๋ž™๋ฆฌ์ŠคํŠธ)

์‚ฌ์‹ค ์˜ค๋Š˜ jwt๋ฅผ ์ •๋ฆฌํ•œ ์ด์œ ๊ฐ€ ์ด๊ฒƒ ๋•Œ๋ฌธ์ด๋‹ค.AccessToken์€ ์œ ํšจ๊ธฐ๊ฐ„์ด ์งง์•„ ๊ดœ์ฐฎ๋‹ค๊ณ  ํ•ด๋„ ๋งŒ์•ฝ refreshToken์ด ๋กœ๊ทธ์•„์›ƒ ์ด์ „ ์‹œ์ ์— ํƒˆ์ทจ๋ฅผ ๋‹นํ•˜๋ฉด, ์•…์˜์ ์ธ ์‚ฌ์šฉ์ž๊ฐ€ ์„œ๋ฒ„์—๊ฒŒ ํƒˆ์ทจํ•œ refreshToken์„ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ƒ๊ฐํ•œ ๊ฒƒ์ด ๋ธ”๋ž™๋ฆฌ์ŠคํŠธ๊ธฐ๋ฒ•์ด๋‹ค.

  • ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์•„์›ƒ์„ ์š”์ฒญ ํ•˜๋ฉด, ํด๋ผ์ด์–ธํŠธ๋Š” ์ฟ ํ‚ค๋‚˜ localstorage ์—์„œ jwt๋ฅผ ์ œ๊ฑฐํ•˜๋ฉด ๋˜์ง€๋งŒ ์„œ๋ฒ„๋Š” jwt๋ฅผ ๋ฌด๋ ฅํ™” ํ•  ๋ฐฉ๋ฒ•์ด ์—†๋‹ค. ๋”ฐ๋ผ์„œ ์„œ๋ฒ„์—์„œ Jwt์— ๋Œ€ํ•œ ๋ธ”๋ž™๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค์–ด Jwt์˜ ์œ ํšจ ๊ธฐ๊ฐ„์ด ๋งŒ๋ฃŒ ๋  ๋•Œ๊นŒ์ง€ DB์—์„œ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์„ ๋ธ”๋ž™๋ฆฌ์ŠคํŠธ ๊ธฐ๋ฒ•์ด๋ผ๊ณ  ํ•œ๋‹ค.
  • ๋งŒ์•ฝ ๋กœ๊ทธ์ธ ์‹œ์— ๋ธ”๋ž™๋ฆฌ์ŠคํŠธ์— ์žˆ๋Š” Jwt ํ† ํฐ์ด ๋“ค์–ด์˜ค๋ฉด ๊ฑฐ๋ถ€๋ฅผ ํ•˜๋ฉด ๋œ๋‹ค.

๐Ÿค” ๊ทธ๋Ÿฌ๋ฉด Jwt๋ฅผ DB์— ์ €์žฅํ•˜๋ฉด Statefulํ•ด์ง€๋Š”๊ฒŒ ์•„๋‹๊นŒ?

๋‚ด๊ฐ€ ์ด ๊ธฐ๋ฒ•์„ ์ฐพ์•„๋ณด๋ฉด์„œ ์ƒ๊ฒผ๋˜ ์˜๋ฌธ์ ์ด๋‹ค. ๊ทธ๋ž˜์„œ ๊ฐ€๋” ์‚ฌ์šฉํ•˜๋Š” ๊ฐœ๋ฐœ์ž ์ปค๋ฎค๋‹ˆํ‹ฐ์— ๋‚ด ์˜๋ฌธ์ ์„ ์งˆ๋ฌธํ•˜์˜€๋‹ค. JWT์—์„œ ๋ธ”๋ž™๋ฆฌ์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๊ฐ€ ์ž˜ ์ดํ•ด๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. jwt๋Š” Stateless ์žฅ์ ์ด์žˆ๋Š”๋ฐ ์™œ Redis ๊ฐ™์€ ์ €์žฅ์†Œ๋ฅผ ์จ์„œ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๋‚˜์š”?

๊ฒฐ๋ก 

๊ฒฐ๊ตญ์€ ๊ด€์ ์˜ ์ฐจ์ด์˜€๋‹ค. ์‹ค์ œ๋กœ ๋ธ”๋ž™๋ฆฌ์ŠคํŠธ ๊ธฐ์—…์€ ์‹ค๋ฌด์—์„œ๋„ ๋งŽ์ด ์“ฐ๊ณ  Redis๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์†๋„๋„ ๋น ๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ๊ดœ์ฐฎ์„ ๊ฒƒ ๊ฐ™๊ณ  ๋ชจ๋“ ์ง€ ๊ธฐ์ˆ ์ด ์™„๋ฒฝํ•  ์ˆ˜๋Š” ์—†๊ณ  ๊ทธ ๋ฐฉ๋ฒ•์„ ์–ด๋–ป๊ฒŒ ์ž˜ ํ•ด๊ฒฐํ•˜๊ณ  ์ž˜ ์„ค๊ณ„ํ•˜๋Š”๊ฒƒ์ด ๊ฐœ๋ฐœ์ž์˜ ๋ชซ์ธ๊ฒƒ ๊ฐ™๋‹ค.

์ฐธ๊ณ  :

profile
๋…ธ๋ ฅ์€ ๋ฐฐ์‹ ํ•˜์ง€ ์•Š์•„ ๐Ÿ”ฅ

0๊ฐœ์˜ ๋Œ“๊ธ€