๊ด€๋ฆฌ ๋ฉ”๋‰ด

Jin's Dev Story

[Spring Security] Access Token์„ ์ด์šฉํ•œ ์ธ์ฆ ๋ณธ๋ฌธ

Web & Android/Spring Security

[Spring Security] Access Token์„ ์ด์šฉํ•œ ์ธ์ฆ

woojin._. 2023. 10. 19. 09:55
๐Ÿ’ก Access Token์„ ์ด์šฉํ•œ ์ธ์ฆ

JWT

  • JSON Web Token์˜ ์•ฝ์ž
  • ์ธ์ฆ์— ํ•„์š”ํ•œ ์ •๋ณด๋“ค์„ ์•”ํ˜ธํ™”์‹œํ‚จ ํ† ํฐ์„ ๋งํ•˜๋ฉฐ Access Token์œผ๋กœ ์‚ฌ์šฉ๋จ
  • JWT๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด์„  Header, Payload, Verify Signature ๊ฐ์ฒด๋ฅผ ํ•„์š”๋กœ ํ•จ

Header

  • ํ† ํฐ์˜ ํƒ€์ž…์„ ๋‚˜ํƒ€๋‚ด๋Š” typ์™€ ์•”ํ˜ธํ™”ํ•  ๋ฐฉ์‹์„ ์ •ํ•˜๋Š” alg๋กœ ๊ตฌ์„ฑ๋จ
{
  'alg': 'HS256',
  'typ': 'JWT'
}

Paylod

  • ํ† ํฐ์— ๋‹ด์„ ์ •๋ณด๋ฅผ ํฌํ•จ
  • ํ•˜๋‚˜์˜ ์ •๋ณด ์กฐ๊ฐ์„ ํด๋ ˆ์ž„์ด๋ผ ๋ถ€๋ฆ„
  • ํด๋ ˆ์ž„์˜ ์ข…๋ฅ˜ → Registered, Public, Private 3๊ฐ€์ง€ ์กด์žฌ
  • ๋ณดํ†ต ๋งŒ๋ฃŒ ์ผ์‹œ, ๋ฐœ๊ธ‰ ์ผ์‹œ, ๋ฐœ๊ธ‰์ž, ๊ถŒํ•œ ์ •๋ณด ๋“ฑ์„ ํฌํ•จ
{
  'sub': '1234567890',
  'name': 'John Doe',
  'admin': true,
  'iat': 1516239022
}

Verify Signature

  • Paylod๊ฐ€ ์œ„๋ณ€์กฐ๋˜์ง€ ์•Š์•˜๋‹ค๋Š” ์‚ฌ์‹ค์„ ์ฆ๋ช…ํ•˜๋Š” ๋ฌธ์ž์—ด
  • Base64 ๋ฐฉ์‹์œผ๋กœ ์ธ์ฝ”๋”ฉํ•œ Header, Payload ๊ทธ๋ฆฌ๊ณ  Secret Key๋ฅผ ๋”ํ•œ ํ›„ ์„œ๋ช…๋จ
HMACSHA256 {
  base64UrlEncode(header) + '.' +
  base64UrlEncode(payload),
  your-256-bit-secret
}

์™„์„ฑ๋œ ํ† ํฐ

  • Header, Payload๋Š” ์ธ์ฝ”๋”ฉ๋  ๋ฟ, ๋”ฐ๋กœ ์•”ํ˜ธํ™”๋˜์ง€ ์•Š์Œ→ ํ•˜์ง€๋งŒ Verify Signature๋Š” Sercret Key๋ฅผ ์•Œ์ง€ ๋ชปํ•˜๋ฉด ๋ณตํ˜ธํ™”ํ•  ์ˆ˜ ์—†์Œ
  • → ๋”ฐ๋ผ์„œ Header, Payload๋Š” ๋ˆ„๊ตฌ๋‚˜ ๋””์ฝ”๋”ฉํ•˜์—ฌ ํ™•์ธํ•  ์ˆ˜ ์žˆ๊ธฐ์— ์ •๋ณด๊ฐ€ ์‰ฝ๊ฒŒ ๋…ธ์ถœ๋  ์ˆ˜ ์žˆ์Œ
  • ๋งŒ์•ฝ ํ—ค์ปค๊ฐ€ ์‚ฌ์šฉ์ž์˜ ํ† ํฐ์„ ํ›”์ณ Payload์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•˜์—ฌ ํ† ํฐ์„ ์„œ๋ฒ„๋กœ ๋ณด๋‚ธ๋‹ค๋ฉด, ์„œ๋ฒ„์—์„œ Verify Signature๋ฅผ ๊ฒ€์‚ฌํ•˜๊ฒŒ ๋จ→ ์ด๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž์˜ Sercret Key๋ฅผ ์•Œ์ง€ ๋ชปํ•˜๋ฉด ํ† ํฐ์„ ์กฐ์ž‘ํ•  ์ˆ˜ ์—†์Œ
  • → ์—ฌ๊ธฐ์„œ Verify Signature๋Š” ํ•ด์ปค์˜ ์ •๋ณด๊ฐ€ ์•„๋‹Œ ์‚ฌ์šฉ์ž์˜ ์ •๋ณด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์•”ํ˜ธํ™”๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ํ•ด์ปค๊ฐ€ ๋ณ€๊ฒฝํ•œ ์ •๋ณด๋กœ ๋ณด๋‚ธ ํ† ํฐ์€ ์œ ํšจํ•˜์ง€ ์•Š์€ ํ† ํฌ์œผ๋กœ ๊ฐ„์ฃผํ•จ

์ธ์ฆ ์ˆœ์„œ

  1. ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธ์„ ํ•จ
  2. ์„œ๋ฒ„์—์„œ๋Š” ๊ณ„์ • ์ •๋ณด๋ฅผ ์ฝ์–ด ์‚ฌ์šฉ์ž ํ™•์ธ ํ›„, ์‚ฌ์šฉ์ž์˜ ๊ณ ์œ ํ•œ ID๊ฐ’์„ ๋ถ€์—ฌํ•˜๊ณ  Payload์— ์ •๋ณด๋ฅผ ๋„ฃ์Œ
  3. JWT ํ† ํฐ์˜ ์œ ํšจ๊ธฐ๊ฐ„ ์„ค์ •
  4. Sercret Key๋ฅผ ํ†ตํ•ด ์•”ํ˜ธํ™”๋œ Access Token์„ HTTP ์‘๋‹ต ํ—ค๋”์— ์‹ค์–ด ๋ณด๋ƒ„
  5. ์‚ฌ์šฉ์ž๋Š” Access Token์„ ๋ฐ›์•„ ์ €์žฅ ํ›„, ์ธ์ฆ์ด ํ•„์š”ํ•œ ์š”์ฒญ๋งˆ๋‹ค ํ† ํฐ์„ HTTP ์š”์ฒญ ํ—ค๋”์— ์‹ค์–ด ๋ณด๋ƒ„
  6. ์„œ๋ฒ„์—์„œ๋Š” ํ•ด๋‹น ํ† ํฐ์˜ Verify Signature๋ฅผ Sercret Key๋กœ ๋ณตํ˜ธํ™”ํ•œ ํ›„, ์กฐ์ž‘ ์—ฌ๋ถ€, ์œ ํšจ ๊ธฐ๊ฐ„์„ ํ™•์ธ
  7. ๊ฒ€์ฆ์ด ์™„๋ฃŒ๋œ๋‹ค๋ฉด, Payload๋ฅผ ๋””์ฝ”๋”ฉํ•˜์—ฌ ์‚ฌ์šฉ์ž์˜ ID์— ๋งž๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ด

์žฅ์ 

  • ๊ฐ„ํŽธํ•จ
  • ์„ธ์…˜๊ณผ ์ฟ ํ‚ค๋ฅผ ์ด์šฉํ•œ ์ธ์ฆ์€ ๋ณ„๋„์˜ ์„ธ์…˜ ์ €์žฅ์†Œ์˜ ๊ด€๋ฆฌ๊ฐ€ ํ•„์š”ํ•จ. ๊ทธ๋Ÿฌ๋‚˜ JWT๋Š” ๋ฐœ๊ธ‰ ํ›„ ๊ฒ€์ฆ๋งŒ ๊ฑฐ์น˜๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ถ”๊ฐ€ ์ €์žฅ์†Œ๊ฐ€ ํ•„์š”์—†์Œ
  • ํ™•์žฅ์„ฑ์ด ๋›ฐ์–ด๋‚จ. ํ† ํฐ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ๋‹ค๋ฅธ ์ธ์ฆ ์‹œ์Šคํ…œ์— ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•จ

๋‹จ์ 

  • JWT๋Š” ํ•œ ๋ฒˆ ๋ฐœ๊ธ‰๋˜๋ฉด ์œ ํšจ๊ธฐ๊ฐ„์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€๋Š” ๊ณ„์† ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ ์ค‘๊ฐ„์— ์‚ญ์ œ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅ⇒ ํ•ด๊ฒฐ์ฑ… : Refresh Token์„ ์ถ”๊ฐ€์ ์œผ๋กœ ๋ฐœ๊ธ‰ํ•˜์—ฌ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ์‹
  • → ๋”ฐ๋ผ์„œ ํ•ด์ปค์— ์˜ํ•ด ์ •๋ณด๊ฐ€ ํ„ธ๋ฆฐ๋‹ค๋ฉด ๋Œ€์ฒ˜ ๋ฐฉ๋ฒ• ์—†์Œ
  • Payload ์ •๋ณด๊ฐ€ ๋””์ฝ”๋”ฉํ•˜๋ฉด ๋ˆ„๊ตฌ๋‚˜ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ธฐ์— ์ค‘์š”ํ•œ ์ •๋ณด๋“ค์„ ๋ณด๊ด€ํ•  ์ˆ˜ ์—†์Œ
  • JWT์˜ ๊ธธ์ด๊ฐ€ ๊ธธ๊ธฐ ๋•Œ๋ฌธ์— ์ธ์ฆ ์š”์ฒญ์ด ๋งŽ์•„์ง€๋ฉด ์„œ๋ฒ„์˜ ์ž์›๋‚ญ๋น„๊ฐ€ ๋ฐœ์ƒ