JWT

0taetaeยท2024๋…„ 10์›” 31์ผ
0
  • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์›น ์‚ฌ์ดํŠธ์— ์ ‘์†ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋Š” ๊ธฐ๋ก ํŒŒ์ผ (client์˜ browse์— ์ €์žฅ)
  • Key, Value ํ˜•์‹์˜ ๋ฌธ์ž์—ด ํ˜•ํƒœ๋กœ ์ €์žฅ

๐Ÿ’ก Session

  • ๋ฏผ๊ฐํ•œ ์ •๋ณด๋ฅผ ๋…ธ์ถœํ–ˆ์„ ๋•Œ์˜ ๋‹จ์ ์„ ๋ง‰๊ธฐ์œ„ํ•จ
  • ํด๋ผ์ด์–ธํŠธ์˜ ์ธ์ฆ ์ •๋ณด๋ฅผ Cookie๊ฐ€ ์•„๋‹Œ ์„œ๋ฒ„ ์ธก์— ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌ
  • session์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์„œ๋ฒ„ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•˜๋Š” ๋ถ€๋‹ด
  • ๋งค๋ฒˆ ์š”์ฒญ ์‹œ ์„ธ์…˜ ์ €์žฅ์†Œ๋ฅผ ์กฐํšŒํ•ด์•ผ ํ•œ๋‹ค.
  • scale out์‹œ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ ๋“ฑ ์šฐ๋ ค

๐Ÿ“™ Token์„ ํ™œ์šฉํ•œ ์ธ์ฆ

๐Ÿ’ก Token

  • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„์— ์ ‘์†ํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ธ์ฆ์„ ํ–ˆ์„ ๋•Œ โ€˜ํ† ํฐโ€™์„ ๋ฐœ๊ธ‰ํ•œ๋‹ค.
  • ์„œ๋ฒ„์— ์š”์ฒญ์„ ๋ณด๋‚ผ ๋•Œ ์š”์ฒญ์˜ ํ—ค๋”์— ํ† ํฐ์„ ๋„ฃ์–ด์„œ ๋ณด๋‚ธ๋‹ค.
  • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ณด๋‚ธ ํ† ํฐ์ด ์„œ๋ฒ„์—์„œ ๋ฐœ๊ธ‰ํ•œ ํ† ํฐ๊ณผ ๊ฐ™์€์ง€๋ฅผ ์ฒดํฌํ•˜์—ฌ ์ธ์ฆ ์ฒ˜๋ฆฌํ•œ๋‹ค.
  • ํ† ํฐ์€ ์•ฑ๊ณผ ์„œ๋ฒ„๊ฐ€ ํ†ต์‹  ๋ฐ ์ธ์ฆํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

๐Ÿ’ก ์„œ๋ฒ„(session)๊ธฐ๋ฐ˜ vs Token ๊ธฐ๋ฐ˜ ์ธ์ฆ

์„œ๋ฒ„ ๊ธฐ๋ฐ˜ํ† ํฐ ๊ธฐ๋ฐ˜
์„œ๋ฒ„์— ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๋ฅผ ๊ด€๋ฆฌํด๋ผ์ด์–ธํŠธ์— ํ† ํฐ ๋ฐœ๊ธ‰
ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ ์š”์ฒญ์„ ๋ฐ›์œผ๋ฉด ํด๋ผ์ด์–ธํŠธ์˜ ์ƒํƒœ๋ฅผ ๊ณ„์† ์œ ์ง€ (stateful)๋กœ๊ทธ์ธ์ด ํ•„์š”ํ•œ ์ž‘์—…์ผ ๊ฒฝ์šฐ ํ—ค๋”์— ํ† ํฐ์„ ์‚ฝ์ž…ํ•˜์—ฌ ๋ณด๋‚ด๊ณ  ์ธ์ฆ(stateless)
ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋งŽ์•„์ง€๋ฉด ์„ฑ๋Šฅ ๋ฌธ์ œ ๋ฐœ์ƒ

๐Ÿ’ก Token ๋‹จ์ 

  • ํ† ํฐ ์ž์ฒด์˜ ๋ฐ์ดํ„ฐ ๊ธธ์ด๊ฐ€ ๊ธธ๋‹ค
    โ†’ ์ธ์ฆ ์š”์ฒญ์ด ๋งŽ์•„์งˆ์ˆ˜๋ก ๋„คํŠธ์›Œํฌ ๋ถ€ํ•˜๊ฐ€ ์‹ฌํ•ด์งˆ ์ˆ˜ ์žˆ์Œ
  • Payload ์ž์ฒด๋Š” ์•”ํ˜ธํ™” ๋˜์ง€ X
    โ†’ ์ค‘์š” ์ •๋ณด ์ €์žฅ X
  • ๋„คํŠธ์›Œํฌ ์ „์†ก ๋ฐฉ์‹
    โ†’ ํ† ํฐ ํƒˆ์ทจ ์šฐ๋ ค

๐Ÿ“™ JWT

๐Ÿ’ก JWT์ด๋ž€?

  • ์ธ์ฆ์— ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ์•”ํ˜ธํ™”์‹œํ‚จ JSON ํ† ํฐ
  • JSON ๋ฐ์ดํ„ฐ๋ฅผ Base64 URL-safe-Encode๋ฅผ ํ†ตํ•ด ์ธ์ฝ”๋”ฉํ•˜์—ฌ ์ง๋ ฌํ™”
  • ํ† ํฐ ๋‚ด๋ถ€์— ์œ„/๋ณ€์กฐ ๋ฐฉ์ง€๋ฅผ ์œ„ํ•œ ๊ฐœ์ธํ‚ค๋ฅผ ํ†ตํ•œ ์ „์ž์„œ๋ช… ํฌํ•จ

๐Ÿ’ก JWT ๊ตฌ์„ฑ

  • Header
    • JWT์—์„œ ์‚ฌ์šฉํ•  ํ† ํฐ์˜ ํƒ€์ž…๊ณผ ์•”ํ˜ธํ™” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ •๋ณด๋กœ ๊ตฌ์„ฑ
    • key - value ํ˜•ํƒœ๋กœ ๊ตฌ์„ฑ
  • Payload
    • ์„œ๋ฒ„๋กœ ๋ณด๋‚ผ ์‚ฌ์šฉ์ž ๊ถŒํ•œ ์ •๋ณด์™€ ๋ฐ์ดํ„ฐ๋กœ ๊ตฌ์„ฑ (key - value ํ˜•ํƒœ)
    • ํ† ํฐ์— ๋‹ด์„ ํด๋ ˆ์ž„ ์ •๋ณด ํฌํ•จ
      โœ”๏ธ Claim์ด๋ž€โ“
      • payload์— ๋‹ด๋Š” ์ •๋ณด์˜ ํ•œ ์กฐ๊ฐ
      • key-value ํ˜•์‹์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ํ•œ ์Œ์˜ ๋ฐ์ดํ„ฐ
    • ํ† ํฐ์—๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ claim์„ ๋„ฃ์„ ์ˆ˜ ์žˆ๋‹ค.
    • payload์—๋Š” ๋ฏผ๊ฐํ•œ ์ •๋ณด๋ฅผ ๋„ฃ์œผ๋ฉด ์•ˆ๋œ๋‹ค. (์•”ํ˜ธํ™” X)
  • Signature
    • Secret Key(์„œ๋ฒ„์˜ ๊ฐœ์ธ๊ธฐ)๋ฅผ ํฌํ•จํ•˜์—ฌ ์•”ํ˜ธํ™”
    • ํ† ํฐ์˜ ์œ ํšจ์„ฑ์„ ๊ฒ€์ฆํ•˜๊ธฐ ์œ„ํ•œ ๋ฌธ์ž์—ด๋กœ ๊ตฌ์„ฑ

๐Ÿ’ก Refresh Token

  • AccessToken์„ ํƒˆ์ทจ ๋‹นํ–ˆ์„ ๊ฒฝ์šฐ์— ๋Œ€ํ•œ ์ตœ์†Œํ•œ์˜ ๋Œ€๋น„
  • AccessToken์˜ ์œ ํšจ๊ธฐ๊ฐ„์„ ์งง๊ฒŒ ์„ค์ •ํ•˜์—ฌ ํƒˆ์ทจ ๋˜์–ด๋„ ์‚ฌ์šฉ๊ธฐ๊ฐ„์„ ์ค„์ด๋Š” ํšจ๊ณผ
  • RefreshToken์„ ํ†ตํ•ด ๋‹ค์‹œ AccessToken์„ ๋ฐœ๊ธ‰๋ฐ›์•„ ์‚ฌ์šฉํ•œ๋‹ค.
  • ์ธ์ฆ ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ์ง€ ์•Š๊ณ , AccessToken ์žฌ๋ฐœ๊ธ‰ ์šฉ๋„๋กœ๋งŒ ์‚ฌ์šฉํ•œ๋‹ค.

๐Ÿ’กAccessToken & Refresh Token ์‚ฌ์šฉํ•œ Login Process

  1. ํด๋ผ์ด์–ธํŠธ๊ฐ€ ID, PW๋กœ ์„œ๋ฒ„์—๊ฒŒ ์ธ์ฆ์„ ์š”์ฒญํ•˜๊ณ  ์„œ๋ฒ„๋Š” ์ด๋ฅผ ํ™•์ธํ•˜์—ฌ AccessToken๊ณผ RefreshToken์„ ๋ฐœ๊ธ‰
  2. ํด๋ผ์ด์–ธํŠธ๋Š” ์ด๋ฅผ ๋ฐ›์•„ RefreshToken์„ ์ €์žฅํ•˜๊ณ  AccessToken์„ ๊ฐ€์ง€๊ณ  ์„œ๋ฒ„์— ์ž์œ ๋กญ๊ฒŒ ์š”์ฒญ
  3. ์š”์ฒญ์„ ํ•˜๋˜ ๋„์ค‘ AccessToken์ด ๋งŒ๋ฃŒ๋˜์–ด ๋” ์ด์ƒ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค๋Š” ์˜ค๋ฅ˜๋ฅผ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์ „๋‹ฌ๋ฐ›์Œ
  4. ํด๋ผ์ด์–ธํŠธ๋Š” ๋ณธ์ธ์ด ์‚ฌ์šฉํ•œ AccessToken์ด ๋งŒ๋ฃŒ๋˜์—ˆ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์ธ์ง€ํ•˜๊ณ  ๋ณธ์ธ์ด ๊ฐ€์ง€๊ณ  ์žˆ๋˜ RefreshToken์„ ์„œ๋ฒ„๋กœ ์ „์†กํ•˜์—ฌ ์ƒˆ๋กœ์šด AccessToken์˜ ๋ฐœ๊ธ‰์„ ์š”์ฒญ
  5. ์„œ๋ฒ„๋Š” RefreshToken์„ ๋ฐ›์•„ ์„œ๋ฒ„์˜ RefreshToken Storage์— ํ•ด๋‹น ํ† ํฐ์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ , ์žˆ๋‹ค๋ฉด AccessToken์„ ์ƒ์„ฑํ•˜์—ฌ ์ „๋‹ฌ

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