[JS] ์ฟ ํ‚ค/ ์„ธ์…˜/ JWT / Access Token, Refresh Token ์ธ์ฆ ๋ฐฉ์‹

1) ์ฟ ํ‚ค ์ธ์ฆ ๋ฐฉ์‹

๋ธŒ๋ผ์šฐ์ €์— ์ฟ ํ‚ค๋ฅผ ์ €์žฅํ•˜๊ณ , ์š”์ฒญ๋งˆ๋‹ค ๊ทธ ์ฟ ํ‚ค๋ฅผ ์„œ๋ฒ„๋กœ ์ž๋™ ์ „์†กํ•ด์„œ ์ธ์ฆํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

1. ๋กœ๊ทธ์ธ ์„ฑ๊ณต
2. ์„œ๋ฒ„๊ฐ€ ์ฟ ํ‚ค๋ฅผ ๋‚ด๋ ค์คŒ
3. ์ดํ›„ ์š”์ฒญ๋งˆ๋‹ค ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ž๋™์œผ๋กœ ์ฟ ํ‚ค๋ฅผ ํฌํ•จ
4. ์„œ๋ฒ„๊ฐ€ ์ฟ ํ‚ค ๊ฐ’์„ ๊ธฐ์ค€์œผ๋กœ ์‚ฌ์šฉ์ž ์ธ์ฆ
  • ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ž๋™ ์ „์†ก
  • HttpOnly, Secure, SameSite๋กœ ๋ณด์•ˆ ์ œ์–ด ๊ฐ€๋Šฅ
  • CSRF ๋ฐฉ์–ด๊ฐ€ ํ•„์š”

๐Ÿ‘‰ ์ฟ ํ‚ค๋Š” “์ „์†ก ์ˆ˜๋‹จ”์ด์ง€ ์ธ์ฆ ๋กœ์ง ๊ทธ ์ž์ฒด๋Š” ์•„๋‹˜

 


2) ์„ธ์…˜ ์ธ์ฆ ๋ฐฉ์‹

์‚ฌ์šฉ์ž ์ธ์ฆ ์ƒํƒœ๋ฅผ ์„œ๋ฒ„๊ฐ€ ์„ธ์…˜์œผ๋กœ ์ €์žฅํ•˜๊ณ  ํด๋ผ์ด์–ธํŠธ๋Š” ์„ธ์…˜ ID๋งŒ ์ฟ ํ‚ค๋กœ ๋“ค๊ณ  ์žˆ๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

1. ๋กœ๊ทธ์ธ ์„ฑ๊ณต
2. ์„œ๋ฒ„๊ฐ€ ์„ธ์…˜ ์ƒ์„ฑ
3. ์„ธ์…˜ ID๋ฅผ ์ฟ ํ‚ค๋กœ ๋‚ด๋ ค์คŒ
4. ์š”์ฒญ ์‹œ ์ฟ ํ‚ค์˜ ์„ธ์…˜ ID๋กœ ์„œ๋ฒ„๊ฐ€ ์‚ฌ์šฉ์ž ์กฐํšŒ
  • ์ธ์ฆ ์ •๋ณด๋Š” ์„œ๋ฒ„์—๋งŒ ์กด์žฌ
  • ๋ณด์•ˆ์— ์œ ๋ฆฌ
  • ์„œ๋ฒ„ ์ž์› ์‚ฌ์šฉ / ํ™•์žฅ ์‹œ ์„ธ์…˜ ๊ณต์œ  ํ•„์š”

๐Ÿ‘‰ “์ฟ ํ‚ค + ์„ธ์…˜”์ด ์ „ํ†ต์ ์ธ ์ธ์ฆ ๋ฐฉ์‹


3) JWT ์ธ์ฆ ๋ฐฉ์‹

์‚ฌ์šฉ์ž ์ •๋ณด์™€ ๋งŒ๋ฃŒ ์‹œ๊ฐ„ ๋“ฑ์„ ์„œ๋ช…๋œ ํ† ํฐ ํ˜•ํƒœ๋กœ ๋‹ด์€ ์ธ์ฆ ํ† ํฐ์ž…๋‹ˆ๋‹ค.

1. ๋กœ๊ทธ์ธ ์„ฑ๊ณต → ์„œ๋ฒ„๊ฐ€ JWT ๋ฐœ๊ธ‰
2. ํด๋ผ์ด์–ธํŠธ๊ฐ€ JWT ์ €์žฅ
3. ์š”์ฒญ ์‹œ JWT๋ฅผ ์ „์†ก
4. ์„œ๋ฒ„๋Š” ํ† ํฐ ์„œ๋ช…/๋งŒ๋ฃŒ๋งŒ ๊ฒ€์ฆ (์„ธ์…˜ ์กฐํšŒ ์—†์Œ)
  • ๋ฌด์ƒํƒœ(stateless) → ์„œ๋ฒ„ ํ™•์žฅ์— ์œ ๋ฆฌ
  • ํ† ํฐ ํƒˆ์ทจ ์‹œ ์ฆ‰์‹œ ์œ„ํ—˜
  • ํ† ํฐ ์ €์žฅ ์œ„์น˜๊ฐ€ ๋งค์šฐ ์ค‘์š”

๐Ÿ‘‰ JWT๋Š” ๋ณดํ†ต Authorization ํ—ค๋” + Bearer ํ† ํฐ์œผ๋กœ ์ „์†ก


4) Access Token / Refresh Token

1. ๋กœ๊ทธ์ธ ์„ฑ๊ณต
   → Access Token + Refresh Token ๋ฐœ๊ธ‰

2. ํด๋ผ์ด์–ธํŠธ๊ฐ€ Access Token์œผ๋กœ API ์š”์ฒญ

3. Access Token ๋งŒ๋ฃŒ
   → API 401 ์‘๋‹ต

4. Refresh Token์œผ๋กœ /refresh ์š”์ฒญ
   → ์ƒˆ๋กœ์šด Access Token ๋ฐœ๊ธ‰

5. ๊ธฐ์กด ์š”์ฒญ ์žฌ์‹œ๋„

 

1๏ธโƒฃ Access Token - ์‚ฌ์šฉ์ž๊ฐ€ ์ธ์ฆ๋˜์—ˆ์Œ์„ ์ฆ๋ช…ํ•˜๊ณ , API ์š”์ฒญ ์‹œ ๊ถŒํ•œ์„ ํ™•์ธํ•˜๋Š” ํ† ํฐ

ํŠน์ง•

  • ์œ ํšจ ๊ธฐ๊ฐ„์ด ์งง์Œ (๋ณดํ†ต ์ˆ˜ ๋ถ„ ~ 1์‹œ๊ฐ„)
  • ๋งค API ์š”์ฒญ๋งˆ๋‹ค Authorization: Bearer <token> ํ˜•ํƒœ๋กœ ์ „๋‹ฌ
  • ํƒˆ์ทจ๋˜๋ฉด ์œ„ํ—˜ → ์งง์€ ์ˆ˜๋ช…์œผ๋กœ ํ”ผํ•ด ์ตœ์†Œํ™”

์—ญํ• 

  • “์ด ์š”์ฒญ์€ ๋กœ๊ทธ์ธํ•œ ์‚ฌ์šฉ์ž ์š”์ฒญ์ด ๋งž๋‹ค”๋ฅผ ์ฆ๋ช…
  • ์„œ๋ฒ„๋Š” ํ† ํฐ๋งŒ ๋ณด๊ณ  ๊ถŒํ•œ ํŒ๋‹จ (์„ธ์…˜ ์กฐํšŒ ๋ถˆํ•„์š”)

 

2๏ธโƒฃ Refresh Token - ๋งŒ๋ฃŒ๋œ Access Token์„ ๋‹ค์‹œ ๋ฐœ๊ธ‰๋ฐ›๊ธฐ ์œ„ํ•œ ํ† ํฐ

ํŠน์ง•

  • ์œ ํšจ ๊ธฐ๊ฐ„์ด ๊น€ (๋ณดํ†ต ๋ฉฐ์น  ~ ๋ช‡ ์ฃผ)
  • API ์š”์ฒญ์—๋Š” ์‚ฌ์šฉ โŒ
  • ๋ณดํ†ต ์„œ๋ฒ„์— ์ €์žฅ (DB/Redis ๋“ฑ)

์—ญํ• 

  • Access Token์ด ๋งŒ๋ฃŒ๋˜๋ฉด Refresh Token์œผ๋กœ ์ƒˆ Access Token ๋ฐœ๊ธ‰

 

3๏ธโƒฃ ์™œ ๋‘ ๊ฐœ๋ฅผ ๋‚˜๋ˆ  ์“ฐ๋‚˜?

โŒ  Access Token๋งŒ ์“ฐ๋ฉด

  • ์œ ํšจ ๊ธฐ๊ฐ„์„ ๊ธธ๊ฒŒ ์žก์•„์•ผ ํ•จ
  • ํƒˆ์ทจ ์‹œ ์žฅ์‹œ๊ฐ„ ์•…์šฉ ๊ฐ€๋Šฅ

โŒ Refresh Token๋งŒ ์“ฐ๋ฉด

  • ๋งค ์š”์ฒญ๋งˆ๋‹ค ์„œ๋ฒ„ ํ™•์ธ ํ•„์š”
  • ์„ฑ๋Šฅ·ํ™•์žฅ์„ฑ ๋–จ์–ด์ง

โœ… ๋‘˜์„ ๋‚˜๋ˆ„๋ฉด

  • Access Token: ๋น ๋ฅธ ์ธ์ฆ + ์งง์€ ์ˆ˜๋ช…
  • Refresh Token: ๋ณด์•ˆ ์œ ์ง€ + ์žฌ์ธ์ฆ ์—ญํ• 
 

'โ˜€๏ธFront-End > ๐Ÿ“—JavaScript' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[JS] Callback, Promise, Async/await  (0) 2026.01.07
[JS] OffscreenCanvas  (0) 2024.12.26
[JS] ResizeObserver  (0) 2024.12.09
[JS] Web Worker  (0) 2024.11.18
[JS] var, let, const  (0) 2024.02.22