Skip to content

JWT & AccessToken / RefreshToken โ€‹

๐Ÿ”‘ JWT ํ•œ ์ค„ ์ •๋ฆฌ

JWT๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๋ˆ„๊ตฌ์ธ์ง€(sub), ์–ด๋–ค ๊ถŒํ•œ(role)์„ ๊ฐ€์กŒ๋Š”์ง€ ๋‹ด๊ณ ,
์„œ๋ช…(signature)์œผ๋กœ ์œ„์กฐ ์—ฌ๋ถ€๋ฅผ ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ๋Š” Stateless ์ธ์ฆ ํ† ํฐ์ด๋‹ค.

๐Ÿงฉ Reference

  • JWT(Json Web Token) = ์ธ์ฆ/์ธ๊ฐ€ ์ •๋ณด๋ฅผ ๋‹ด์€ ์„œ๋ช… ๊ฐ€๋Šฅํ•œ ํ† ํฐ
  • JWT ๊ตฌ์กฐ: Header.Payload.Signature (base64url ์ธ์ฝ”๋”ฉ)
  • AccessToken = ์งง๊ฒŒ ์œ ์ง€๋˜๋Š” ์ธ์ฆ ํ† ํฐ (Authorization ํ—ค๋”๋กœ ์ „์†ก)
  • RefreshToken = ์ƒˆ๋กœ์šด AccessToken ๋ฐœ๊ธ‰์šฉ ์žฅ๊ธฐ ํ† ํฐ (httpOnly ์ฟ ํ‚ค๋กœ ์ „์†ก)
  • ์„œ๋ฒ„๋Š” ํ† ํฐ์˜ ์„œ๋ช…๊ณผ ๋งŒ๋ฃŒ ์‹œ๊ฐ„, ๋ฐœ๊ธ‰์ž ๋“ฑ์„ ๊ฒ€์ฆํ•ด์„œ
    ๋ณ„๋„์˜ ์„ธ์…˜ ์ €์žฅ์†Œ ์—†์ด๋„ ์‚ฌ์šฉ์ž ์‹ ์›์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Œ โ†’ Stateless ์ธ์ฆ

๐Ÿงฉ Point

  • AccessToken์€ ์งง๊ฒŒ ๋งŒ๋ฃŒ๋˜์–ด์•ผ ํƒˆ์ทจ ํ”ผํ•ด๊ฐ€ ์ตœ์†Œํ™”๋œ๋‹ค.
  • RefreshToken์€ js ์ ‘๊ทผ์ด ๋ถˆ๊ฐ€๋Šฅํ•œ httpOnly + Secure ์ฟ ํ‚ค๋กœ ๋ณดํ˜ธํ•ด์•ผ ํ•œ๋‹ค.
  • 401 Unauthorized๋Š” ํ˜„์žฌ ์ธ์ฆ ์ •๋ณด(AccessToken ๋“ฑ)์— ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๋Š” ์‹ ํ˜ธ๋‹ค.
    ๋งŽ์€ ์„œ๋น„์Šค์—์„œ AccessToken ๋งŒ๋ฃŒ ์ƒํ™ฉ์„ 401๋กœ ๋‚ด๋ ค์ฃผ๊ณ ,
    ์ด๋•Œ RefreshToken์œผ๋กœ ์žฌ๋ฐœ๊ธ‰์„ ์‹œ๋„ํ•˜๋„๋ก ์„ค๊ณ„ํ•œ๋‹ค.
  • ์ž๋™ ๋กœ๊ทธ์ธ์€ RefreshToken์ด ์ฟ ํ‚ค๋กœ ์ž๋™ ์ „์†ก๋˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€๋Šฅํ•œ ๊ตฌ์กฐ์ด๋‹ค.
  • JWT๋Š” payload๊ฐ€ ํด์ˆ˜๋ก ๋„คํŠธ์›Œํฌ ๋น„์šฉ ์ฆ๊ฐ€ โ†’ ํ•„์š”ํ•œ ์ตœ์†Œ ์ •๋ณด๋งŒ ๋„ฃ์–ด์•ผ ํ•œ๋‹ค.
  • HTTPS ์—†์œผ๋ฉด Authorization ํ—ค๋”์˜ JWT๋‚˜ ์ฟ ํ‚ค์— ๋‹ด๊ธด RefreshToken์ด ๊ทธ๋Œ€๋กœ ๋…ธ์ถœ๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ํ•„์ˆ˜๋‹ค.

JWT๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์ „์— ์ค‘์š”ํ•œ ์‚ฌ์‹ค โ€‹

JWT๋Š” ๋…๋ฆฝ์ ์œผ๋กœ ๋™์ž‘ํ•˜๋Š” ๊ธฐ์ˆ ์ด ์•„๋‹ˆ๋ผ,
HTTP + HTTPS + Cookie + Authorization Header ์œ„์—์„œ ๋Œ์•„๊ฐ€๋Š” ์ธ์ฆ ํ”„๋กœํ† ์ฝœ์ด๋‹ค.

์ฆ‰ ์ธ์ฆ์„ ๊ตฌํ˜„ํ•  ๋•Œ,

  • ํ† ํฐ โ†’ HTTP Authorization ํ—ค๋”๋กœ ๋ณด๋‚ด๊ณ 
  • RefreshToken โ†’ httpOnly ์ฟ ํ‚ค๋กœ ์ž๋™ ์ „์†ก๋˜๊ณ 
  • ํ† ํฐ ๋งŒ๋ฃŒ โ†’ HTTP 401 ์‘๋‹ต์œผ๋กœ ๊ฐ์ง€๋˜๊ณ 
  • ์ž๋™ ์žฌ๋ฐœ๊ธ‰ โ†’ Axios interceptor๋กœ ๊ตฌํ˜„๋˜๋Š” ๊ฒƒ

โ†’ ์ด ๋ชจ๋“  ๊ณผ์ •์ด HTTP ๊ทœ์•ฝ ์œ„์—์„œ ์ด๋ฃจ์–ด์ง„๋‹ค.
(๊ทธ๋ž˜์„œ HTTP/HTTPS, ์ฟ ํ‚ค ๋™์ž‘์„ ๋จผ์ € ์ดํ•ดํ•˜๋ฉด JWT๋ฅผ ํ›จ์”ฌ ์‰ฝ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค.)

๐Ÿงฉ Axios๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ?

๋ณธ๋ฌธ์—์„œ ์„ค๋ช…ํ•˜๋Š” ํ๋ฆ„์€ Axios ๊ธฐ์ค€์ด์ง€๋งŒ, JWT ์ธ์ฆ ์ž์ฒด๋Š” Axios ์˜์กด์ ์ธ ๊ธฐ์ˆ ์ด ์•„๋‹ˆ๋ผ HTTP ๊ทœ์•ฝ ์œ„์—์„œ ๋™์ž‘ํ•˜๋Š” ์ธ์ฆ ๋ฐฉ์‹์ด๋‹ค. ํ˜„์žฌ ์ง„ํ–‰ ์ค‘์ธ ํ”„๋กœ์ ํŠธ๊ฐ€ Axios๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์–ด ์ด๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ ์—ˆ๋‹ค!

  • AccessToken โ†’ Authorization ํ—ค๋”๋กœ ๋ณด๋‚ด๊ณ 
  • RefreshToken โ†’ httpOnly ์ฟ ํ‚ค๋กœ ์ž๋™ ์ „์†ก๋˜๊ณ 
  • AccessToken ๋งŒ๋ฃŒ โ†’ ์„œ๋ฒ„๊ฐ€ 401์„ ๋‚ด๋ ค์ฃผ๊ณ 
  • RefreshToken ์žฌ๋ฐœ๊ธ‰ โ†’ fetch๋กœ๋„ ๊ฐ€๋Šฅ

๋”ฐ๋ผ์„œ JWT ์ธ์ฆ์€ Axios ๊ธฐ๋Šฅ์ด ์•„๋‹ˆ๋ผ HTTP ๊ทœ์•ฝ ์œ„์—์„œ ๋™์ž‘ํ•˜๋Š” ์ธ์ฆ ๋ฐฉ์‹์ด๋‹ค. Axios๋ฅผ ์“ฐ์ง€ ์•Š๋Š”๋‹ค๋ฉด, interceptor ๋ถ€๋ถ„๋งŒ ์ง์ ‘ ํ•จ์ˆ˜๋กœ ๊ฐ์‹ธ์„œ ๊ตฌํ˜„ํ•˜๋ฉด ๋™์ผํ•˜๊ฒŒ ๋™์ž‘ํ•œ๋‹ค!


JWT๋ž€? โ€‹

JWT(Json Web Token)๋Š” ์ธ์ฆ์„ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ์„œ๋ช…๋œ ํ† ํฐ ํฌ๋งท์ด๋‹ค.
ํ† ํฐ ๋‚ด๋ถ€์— ์œ ์ € ID, ๊ถŒํ•œ, ๋งŒ๋ฃŒ ์‹œ๊ฐ„ ๋“ฑ ์ค‘์š”ํ•œ ์ •๋ณด๊ฐ€ ํฌํ•จ๋˜๋ฉฐ, ํ† ํฐ์ด ๋ณ€์กฐ๋˜์ง€ ์•Š์•˜๋Š”์ง€๋งŒ ์„œ๋ฒ„๊ฐ€ ๊ฒ€์ฆํ•˜๋ฉด ์š”์ฒญ์„ ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋‹ค.

JWT ๊ตฌ์กฐ๋Š” header.payload.signature ํ˜•ํƒœ์˜ ์„ธ ๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋ˆ„์–ด์ง„๋‹ค:

plaintext
Header.Payload.Signature
๋ถ€๋ถ„์„ค๋ช…
Headerํ† ํฐ ํ˜•์‹, ์„œ๋ช… ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ •๋ณด
Payload์‹ค์ œ ๋ฐ์ดํ„ฐ
sub: subject (์‚ฌ์šฉ์ž ๊ณ ์œ  ID)
role: ๊ถŒํ•œ ์ •๋ณด
iat: ๋ฐœ๊ธ‰ ์‹œ๊ฐ„ (Issued At)
exp: ๋งŒ๋ฃŒ ์‹œ๊ฐ„ (Expiration)
Signature๋น„๋ฐ€ํ‚ค๋กœ ์„œ๋ช…๋œ ๊ฐ’ โ†’ ์œ„์กฐ ๋ฐฉ์ง€

์„œ๋ฒ„๋Š” Signature๋ฅผ ๊ฒ€์ฆํ•ด ์ด ํ† ํฐ์ด ์šฐ๋ฆฌ ์„œ๋ฒ„์—์„œ ๋ฐœ๊ธ‰๋œ ํ† ํฐ์ธ์ง€?, Payload๊ฐ€ ์œ ํšจํ•œ์ง€?๋ฅผ ํŒ๋‹จํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ ์„ธ์…˜ ์ €์žฅ์†Œ ์—†์ด๋„ ์ธ์ฆ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. (stateless)

์™œ JWT๋Š” Stateless์ธ๊ฐ€?

์„ธ์…˜ ์ธ์ฆ๊ณผ ๋‹ค๋ฅด๊ฒŒ JWT ์ธ์ฆ์—์„œ๋Š”:

  • ์„œ๋ฒ„๊ฐ€ ์‚ฌ์šฉ์ž ์ƒํƒœ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•˜์ง€ ์•Š์Œ
  • DB์— ์„ธ์…˜ ๋ ˆ์ฝ”๋“œ๋„ ์—†์Œ
  • ์˜ค์ง ํ† ํฐ์˜ ์„œ๋ช…(signature)๋งŒ ๊ฒ€์ฆํ•˜๋ฉด ์‚ฌ์šฉ์ž๋ฅผ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ์Œ

์ฆ‰, ์„œ๋ฒ„๋Š” โ€œ์œ ์ € ์ •๋ณด๋ฅผ ๋“ค๊ณ  ์žˆ์ง€ ์•Š์•„๋„โ€ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. โ†’ ํ™•์žฅ์„ฑ์— ํŠนํžˆ ์œ ๋ฆฌํ•˜๋‹ค.


AccessToken & RefreshToken โ€‹

JWT ์ธ์ฆ์—์„œ๋Š” ๋ณดํ†ต ๋‘ ์ข…๋ฅ˜์˜ ํ† ํฐ์ด ํ•จ๊ป˜ ์‚ฌ์šฉ๋œ๋‹ค.

JWT๋Š” ์œ ํšจ๊ธฐ๊ฐ„์ด ์žˆ๋Š” ํ† ํฐ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์Œ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธด๋‹ค:

  • AccessToken์„ ๊ธธ๊ฒŒ ํ•˜๋ฉด โ†’ ํƒˆ์ทจ ์œ„ํ—˜ ์ฆ๊ฐ€
  • AccessToken์„ ์งง๊ฒŒ ํ•˜๋ฉด โ†’ ์‚ฌ์šฉ์ž๊ฐ€ ์ž์ฃผ ๋กœ๊ทธ์•„์›ƒ๋จ

๊ทธ๋ž˜์„œ ๋‚˜์˜จ ๊ตฌ์กฐ๊ฐ€ AccessToken (์งง๊ฒŒ) + RefreshToken (๊ธธ๊ฒŒ)์ด๋‹ค.
๋‘ ๊ฐœ๊ฐ€ ํ•ฉ์ณ์ ธ์„œ ๋ณด์•ˆ + ์œ ์ € ๊ฒฝํ—˜ ๋‘˜ ๋‹ค ์žก๋Š” ๊ตฌ์กฐ๊ฐ€ ๋œ๋‹ค.

์ข…๋ฅ˜์ €์žฅ ์œ„์น˜๋งŒ๋ฃŒ์—ญํ• 
AccessToken๋ฉ”๋ชจ๋ฆฌ/Zustand/localStorage15๋ถ„~1์‹œ๊ฐ„์š”์ฒญ ์ธ์ฆ
RefreshTokenhttpOnly ์ฟ ํ‚ค(๋ธŒ๋ผ์šฐ์ € ์ž๋™ ๊ด€๋ฆฌ)2์ฃผ~1๋‹ฌAccessToken ์žฌ๋ฐœ๊ธ‰

AccessToken (AT) โ€‹

์—ญํ•  โ€‹

  • ์‚ฌ์šฉ์ž๊ฐ€ ๋ˆ„๊ตฌ์ธ์ง€ ์ธ์ฆํ•˜๋Š” ์ •๋ณด
  • ์š”์ฒญ์„ ๋ณด๋‚ผ ๋•Œ Authorization ํ—ค๋”์— ๋‹ด์•„ ์ „๋‹ฌ

ํŠน์ง• โ€‹

  • ๋งŒ๋ฃŒ ์‹œ๊ฐ„์ด ๋งค์šฐ ์งง๋‹ค (5๋ถ„ ~ 30๋ถ„)
  • ํƒˆ์ทจ๋˜๋ฉด ๊ณง ๋งŒ๋ฃŒ๋˜๋ฏ€๋กœ ํ”ผํ•ด๊ฐ€ ์ œํ•œ์ 
  • ํ”„๋ก ํŠธ์—์„œ๋Š” ๋ณด์•ˆ์ƒ ๋ฉ”๋ชจ๋ฆฌ(Zustand ๋“ฑ)์— ๋‘๋Š” ๊ฒƒ์„ ์šฐ์„ ์œผ๋กœ ํ•˜๊ณ ,
    ํ•„์š”์— ๋”ฐ๋ผ LocalStorage์— ์ €์žฅํ•˜๋Š” ๋ฐฉ์‹๋„ ์‚ฌ์šฉ๋œ๋‹ค. (XSS ์ทจ์•ฝ์„ฑ ๊ณ ๋ ค ํ•„์š”)

์š”์ฒญ ์˜ˆ์‹œ โ€‹

http
Authorization: Bearer <access_token>

RefreshToken (RT) โ€‹

์—ญํ•  โ€‹

  • AccessToken์ด ๋งŒ๋ฃŒ๋˜์—ˆ์„ ๋•Œ ์ƒˆ ํ† ํฐ์„ ๋ฐœ๊ธ‰๋ฐ›๊ธฐ ์œ„ํ•œ ์žฅ๊ธฐ ํ† ํฐ

ํŠน์ง• โ€‹

  • ์ˆ˜๋ช…์ด ๊น€ (7์ผ ~)
  • ํƒˆ์ทจ๋˜๋ฉด ๊ณ„์ •์ด ์œ„ํ˜‘๋ฐ›์Œ โ†’ ๊ฐ€์žฅ ๋ฏผ๊ฐํ•œ ํ† ํฐ
  • JS ์ ‘๊ทผ์ด ๋ถˆ๊ฐ€ํ•œ httpOnly + Secure ์ฟ ํ‚ค๋กœ ์ €์žฅ
  • ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ž๋™์œผ๋กœ ์ „์†ก

์„œ๋ฒ„๊ฐ€ RefreshToken์„ ์ฟ ํ‚ค๋กœ ์ฃผ๋Š” ์˜ˆ์‹œ โ€‹

http
Set-Cookie: refresh_token=abc123; HttpOnly; Secure; SameSite=Strict; Path=/auth

ํ”„๋ก ํŠธ์—์„œ๋Š” RT๋ฅผ ์ฝ์„ ์ˆ˜ ์—†๋‹ค โ€‹

js
console.log(document.cookie); // refresh_token ๋ณด์ด์ง€ ์•Š์Œ

โ†’ ์ด ํŠน์„ฑ์ด XSS ๊ณต๊ฒฉ์œผ๋กœ๋ถ€ํ„ฐ ํ† ํฐ์„ ๋ณดํ˜ธํ•œ๋‹ค.


RefreshToken์ด ์ฟ ํ‚ค์—ฌ์•ผ ํ•˜๋Š” ์ด์œ  โ€‹

RefreshToken์€ ํด๋ผ์ด์–ธํŠธ์˜ ์‹ ์›(Identity)์„ ์ฆ๋ช…ํ•˜๋Š” ๋ฐ์ดํ„ฐ์ด๊ธฐ ๋•Œ๋ฌธ์— ํ”„๋ก ํŠธ๊ฐ€ ์ง์ ‘ ์ €์žฅํ•˜๊ฑฐ๋‚˜ ๊ด€๋ฆฌํ•˜๋ฉด ์•ˆ ๋œ๋‹ค. ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ž๋™์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š” httpOnly ์ฟ ํ‚ค์—ฌ์•ผ ํ•œ๋‹ค.

1. RefreshToken์€ ์„œ๋ฒ„๊ฐ€ ์‹ ์›์„ ํŒ๋‹จํ•˜๋Š” ์ธ์ฆ ์ฑ„๋„์ด์–ด์•ผ ํ•œ๋‹ค. โ€‹

  • ์„œ๋ฒ„๊ฐ€ RT๋ฅผ ํ†ตํ•ด โ€œ์ด ์žฌ๋ฐœ๊ธ‰ ์š”์ฒญ์ด ์ง„์งœ ์šฐ๋ฆฌ ์‚ฌ์šฉ์ž๊ฐ€ ๋ณด๋‚ธ ์š”์ฒญ์ธ์ง€โ€ ํŒ๋‹จํ•œ๋‹ค.

์ฟ ํ‚ค๋Š” ์„œ๋ฒ„๊ฐ€ Set-Cookie๋กœ ๋‚ด๋ ค์ฃผ๋ฉด ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ž๋™ ์ €์žฅ + ์ž๋™ ์ „์†กํ•ด์ฃผ๋ฏ€๋กœ ํ”„๋ก ํŠธ ์ฝ”๋“œ ๊ฐœ์ž… ์—†์ด ์•ˆ์ •์ ์ธ ์ธ์ฆ ์ฑ„๋„์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.

2. RefreshToken์€ JS์—์„œ ์ฝํžˆ๋ฉด ์•ˆ ๋œ๋‹ค. โ€‹

RT๋ฅผ localStorage ๊ฐ™์€ ๊ณณ์— ์ €์žฅํ•˜๋ฉด ์•…์„ฑ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์‚ฝ์ž…๋˜๋Š” ์ˆœ๊ฐ„ ๋ฐ”๋กœ ํ„ธ๋ฆฐ๋‹ค. httpOnly ์ฟ ํ‚ค๋Š” JS๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— XSS ๊ณต๊ฒฉ์œผ๋กœ๋ถ€ํ„ฐ RefreshToken์„ ๋ณดํ˜ธํ•˜๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์ด๋‹ค.

3. RT๋Š” ์žฌ๋ฐœ๊ธ‰ ์šฉ๋„๋ผ ๋…ธ์ถœ๋˜๋ฉด ์„ธ์…˜์ด ์˜๊ตฌ ํƒˆ์ทจ๋œ๋‹ค. โ€‹

  • AccessToken์€ ์งง์•„์„œ ํ”ผํ•ด๊ฐ€ ์ œํ•œ์ ์ด๋‹ค.
  • RefreshToken์€ ๊ธธ์–ด์„œ ํ„ธ๋ฆฌ๋ฉด ์น˜๋ช…์ ์ด๋ฏ€๋กœ ๋ฌด์กฐ๊ฑด ๋ณดํ˜ธํ•ด์•ผ ํ•œ๋‹ค.

๊ทธ๋ž˜์„œ RT๋Š” ์‹ค๋ฌด์—์„œ ๋ณดํ†ต
httpOnly + Secure + SameSite=strict(or lax) ์กฐํ•ฉ์˜ ์ฟ ํ‚ค๋กœ ์ €์žฅํ•œ๋‹ค.
SameSite ์„ค์ •์€ CSRF ๊ณต๊ฒฉ์„ ์–ผ๋งˆ๋‚˜ ํ—ˆ์šฉ/์ฐจ๋‹จํ• ์ง€ ์ •์ฑ…์— ๋”ฐ๋ผ ์กฐ์ •ํ•œ๋‹ค.


JWT์˜ ์žฅ์ ๊ณผ ๋‹จ์  โ€‹

์žฅ์  โ€‹

  • ํ™•์žฅ์„ฑ ๋›ฐ์–ด๋‚จ (์„œ๋ฒ„๊ฐ€ ์ƒํƒœ๋ฅผ ๋“ค๊ณ  ์žˆ์ง€ ์•Š์•„๋„ ๋จ)
  • ์„œ๋ฒ„๊ฐ€ ์—ฌ๋Ÿฌ ๋Œ€์—ฌ๋„ ๋ฌธ์ œ ์—†์Œ (Load Balancing ์™„๋ฒฝ)
  • bearer token ํ‘œ์ค€ ๋ฐฉ์‹
  • ๋กœ๊ทธ์ธ ์ƒํƒœ ์œ ์ง€๊ฐ€ ๊ฐ„๋‹จ

๋‹จ์  โ€‹

  • ํ† ํฐ ํฌ๊ธฐ๊ฐ€ ํผ โ†’ Network ๋น„์šฉ ์ฆ๊ฐ€
  • ํ† ํฐ ํƒˆ์ทจ๋˜๋ฉด ๋งŒ๋ฃŒ๋˜๊ธฐ ์ „๊นŒ์ง€ ๋ฌด์กฐ๊ฑด ์œ ํšจ
  • ํ† ํฐ ๊ฐ•์ œ ๋ฌดํšจํ™”(revoke)๊ฐ€ ์–ด๋ ค์›€ โ†’ ๋ธ”๋ž™๋ฆฌ์ŠคํŠธ DB ํ•„์š”
  • ์ฟ ํ‚ค 4KB ์ œํ•œ์œผ๋กœ payload๋ฅผ ๋งŽ์ด ๋„ฃ์„ ์ˆ˜ ์—†์Œ

์ •๋ฆฌ โ€‹

๐Ÿ’ก

  • JWT ์ธ์ฆ์€ HTTP/HTTPS + Authorization ํ—ค๋” + Cookie ์œ„์—์„œ ๋™์ž‘ํ•œ๋‹ค.
  • AccessToken์€ ์š”์ฒญ ์ธ์ฆ์šฉ์ด๋ฉฐ, ๋ณด์•ˆ์„ ์œ„ํ•ด ์งง๊ฒŒ ์œ ์ง€ํ•ด์•ผ ํ•œ๋‹ค.
  • RefreshToken์€ ์žฌ๋ฐœ๊ธ‰์šฉ์ด๋ฉฐ, httpOnly ์ฟ ํ‚ค๋กœ ๋ฐ˜๋“œ์‹œ ๋ณดํ˜ธํ•ด์•ผ ํ•œ๋‹ค.
  • AccessToken์ด ๋งŒ๋ฃŒ๋˜๋ฉด ์„œ๋ฒ„๋Š” 401 Unauthorized๋ฅผ ๋‚ด๋ ค ์‹ ํ˜ธ๋ฅผ ๋ณด๋‚ธ๋‹ค.
  • ์ด ์‹ ํ˜ธ๋ฅผ ๋ฐ›์•„ RefreshToken์œผ๋กœ ์žฌ๋ฐœ๊ธ‰ โ†’ ์š”์ฒญ ์žฌ์‹œ๋„ ํ๋ฆ„์ด ์‹œ์ž‘๋œ๋‹ค.
  • Axios๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ, interceptor๊ฐ€ ์ด ์žฌ๋ฐœ๊ธ‰ ๊ณผ์ •์„ ์ž๋™ํ™”ํ•˜๋Š” ๋„๊ตฌ๊ฐ€ ๋œ๋‹ค.
  • ํ•ต์‹ฌ์€ Axios๊ฐ€ ์•„๋‹ˆ๋ผ โ€œHTTP ์‘๋‹ต(401) โ†’ ํ† ํฐ ์žฌ๋ฐœ๊ธ‰ โ†’ ์š”์ฒญ ์žฌ์‹œ๋„โ€๋ผ๋Š” ํ๋ฆ„ ์ž์ฒด!