๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
    <
Computer Science

JWT(JSON Web Token) ์ •๋ฆฌ

by yeeeh 2022. 8. 29.

๐Ÿ’ก ์„œ๋ฒ„(์„ธ์…˜) ๊ธฐ๋ฐ˜์˜ ์ธ์ฆ ์‹œ์Šคํ…œ

์„œ๋ฒ„(์„ธ์…˜)๊ธฐ๋ฐ˜์˜ ์ธ์ฆ ์‹œ์Šคํ…œ์ด๋ž€?

์„œ๋ฒ„ ๊ธฐ๋ฐ˜์˜ ์ธ์ฆ ๋ฐฉ์‹์œผ๋กœ, ์„œ๋ฒ„ ์ธก์—์„œ ์‚ฌ์šฉ์ž๋“ค์˜ ์ •๋ณด๋ฅผ ๊ธฐ์–ตํ•˜๋Š” ๋ฐฉ์‹.
์‚ฌ์šฉ์ž๋“ค์˜ ์ •๋ณด๋ฅผ ๊ธฐ์–ตํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์„ธ์…˜์„ ์œ ์ง€ํ•ด์•ผ ํ•˜๋Š”๋ฐ, ๋ฉ”๋ชจ๋ฆฌ๋‚˜ ๋””์Šคํฌ ๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋“ฑ์„ ํ†ตํ•ด ๊ด€๋ฆฌํ•œ๋‹ค.

stateful ์„œ๋ฒ„

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

ํ๋ฆ„

๋ฌธ์ œ์ 

1. ๋ฉ”๋ชจ๋ฆฌ ๊ณผ๋ถ€ํ•˜

์‚ฌ์šฉ์ž๊ฐ€ ์ธ์ฆ์„ ํ•  ๋•Œ, ์„œ๋ฒ„๋Š” ์ด๋Ÿฌํ•œ ์ •๋ณด๋ฅผ ์ €์žฅํ•ด์•ผ ํ•˜๊ณ  ์ด๋ฅผ ์„ธ์…˜(Session)์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.
์„ธ์…˜์„ ๋ฉ”๋ชจ๋ฆฌ๋‚˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅํ•˜๋Š”๋ฐ, ๋กœ๊ทธ์ธ ์ค‘์ธ ์‚ฌ์šฉ์ž๊ฐ€ ๋Š˜์–ด๋‚  ๊ฒฝ์šฐ์—๋Š” ์„œ๋ฒ„์˜ RAM์— ๋ถ€ํ•˜๊ฐ€ ๊ฑธ๋ฆฌ๊ฑฐ๋‚˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋ฌด๋ฆฌ๋ฅผ ์ค„ ์ˆ˜ ์žˆ๋‹ค

 

2. ํ™•์žฅ์„ฑ

์‚ฌ์šฉ์ž๊ฐ€ ๋Š˜์–ด๋‚˜๊ฒŒ ๋˜๋ฉด ๋” ๋งŽ์€ ํŠธ๋ž˜ํ”ฝ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์„œ๋ฒ„๋ฅผ ํ™•์žฅํ•ด์•ผ ํ•œ๋‹ค.
์„ธ์…˜์„ ์‚ฌ์šฉ์‹œ, ์„ธ์…˜์„ ๋ถ„์‚ฐ์‹œํ‚ค๋Š” ์‹œ์Šคํ…œ์„ ์„ค๊ณ„ํ•ด์•ผ ํ•˜์ง€๋งŒ ๊ทธ ๊ณผ์ •์ด ๋งค์šฐ ์–ด๋ ต๊ณ  ๋ณต์žกํ•˜๋‹ค.

 

3. CORS(Cross-Origin Resource Sharing)

์„ธ์…˜์„ ๊ด€๋ฆฌํ•  ๋•Œ ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ์ฟ ํ‚ค๋Š” ๋‹จ์ผ ๋„๋ฉ”์ธ ๋ฐ ์„œ๋ธŒ ๋„๋ฉ”์ธ์—์„œ๋งŒ ์ž‘๋™ํ•˜๋„๋ก ์„ค๊ณ„๋˜์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ฟ ํ‚ค๋ฅผ ์—ฌ๋Ÿฌ ๋„๋ฉ”์ธ์—์„œ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์€ ๋ฒˆ๊ฑฐ๋กญ๋‹ค.

ํ† ํฐ ๊ธฐ๋ฐ˜์˜ ์ธ์ฆ ์‹œ์Šคํ…œ

ํ† ํฐ ๊ธฐ๋ฐ˜ ์ธ์ฆ ์‹œ์Šคํ…œ์ด๋ž€?

์ธ์ฆ๋ฐ›์€ ์‚ฌ์šฉ์ž๋“ค์—๊ฒŒ ํ† ํฐ์„ ๋ฐœ๊ธ‰ํ•˜๊ณ , ์„œ๋ฒ„์— ์š”์ฒญ์„ ํ•  ๋•Œ ํ—ค๋”์— ํ† ํฐ์„ ํ•จ๊ป˜ ๋ณด๋‚ด๋„๋ก ํ•˜์—ฌ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ํ•˜๋Š” ๋ฐฉ๋ฒ•.

stateless ๊ตฌ์กฐ

์‚ฌ์šฉ์ž์˜ ์ธ์ฆ์ •๋ณด๋ฅผ ์„œ๋ฒ„๋‚˜ ์„ธ์…˜์— ์œ ์ง€ํ•˜์ง€ ์•Š๊ณ , ํด๋ผ์ด์–ธํŠธ ์ธก์—์„œ ๋“ค์–ด์˜ค๋Š” ์š”์ฒญ๋งŒ์œผ๋กœ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•œ๋‹ค.

ํ๋ฆ„

  1. ์‚ฌ์šฉ์ž๊ฐ€ ์•„์ด๋””์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ๋กœ ๋กœ๊ทธ์ธ์„ ํ•œ๋‹ค.
  2. ์„œ๋ฒ„ ์ธก์—์„œ ํ•ด๋‹น ์ •๋ณด๋ฅผ ๊ฒ€์ฆํ•œ๋‹ค.
  3. ์ •๋ณด๊ฐ€ ์ •ํ™•ํ•˜๋‹ค๋ฉด, ์„œ๋ฒ„ ์ธก์—์„œ ์‚ฌ์šฉ์ž์—๊ฒŒ signed ํ† ํฐ์„ ๋ฐœ๊ธ‰ํ•œ๋‹ค.
  4. ํด๋ผ์ด์–ธํŠธ ์ธก์—์„œ ์ „๋‹ฌ๋ฐ›์€ ํ† ํฐ์„ ์ €์žฅํ•ด๋‘๊ณ , ์„œ๋ฒ„์— ์š”์ฒญ์„ ํ•  ๋•Œ๋งˆ๋‹ค ํ•ด๋‹น ํ† ํฐ์„ ์„œ๋ฒ„์— ํ•จ๊ป˜ ์ „๋‹ฌํ•œ๋‹ค.(Http ์š”์ฒญ ํ—ค๋”์— ํ† ํฐ์„ ํฌํ•จ)
  5. ์„œ๋ฒ„๋Š” ํ† ํฐ์„ ๊ฒ€์ฆํ•˜๊ณ , ์š”์ฒญ์— ์‘๋‹ตํ•œ๋‹ค.

์žฅ์ 

  1. ๋ฌด์ƒํƒœ์„ฑ(Stateless) & ํ™•์žฅ์„ฑ(Scalability)
    ํ† ํฐ์€ ํด๋ผ์ด์–ธํŠธ ์ธก์— ์ €์žฅ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋ฒ„๋Š” ์™„์ „ํžˆ Statelessํ•˜๋ฉฐ, ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„์˜ ์—ฐ๊ฒฐ๊ณ ๋ฆฌ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ํ™•์žฅํ•˜๊ธฐ์— ๋งค์šฐ ์ ํ•ฉํ•˜๋‹ค.
    ๋งŒ์•ฝ ์‚ฌ์šฉ์ž ์ •๋ณด๊ฐ€ ์„œ๋ฒ„ ์ธก ์„ธ์…˜์— ์ €์žฅ๋œ ๊ฒฝ์šฐ์— ์„œ๋ฒ„๋ฅผ ํ™•์žฅํ•˜์—ฌ ๋ถ„์‚ฐ์ฒ˜๋ฆฌ ํ•œ๋‹ค๋ฉด, ํ•ด๋‹น ์‚ฌ์šฉ์ž๋Š” ์ฒ˜์Œ ๋กœ๊ทธ์ธ ํ–ˆ์—ˆ๋˜ ์„œ๋ฒ„์—๋งŒ ์š”์ฒญ์„ ๋ฐ›๋„๋ก ์„ค์ •์„ ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.
    ํ•˜์ง€๋งŒ ํ† ํฐ์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์–ด๋– ํ•œ ์„œ๋ฒ„๋กœ ์š”์ฒญ์ด ์™€๋„ ์ƒ๊ด€์ด ์—†๋‹ค.
  2. ํ™•์žฅ์„ฑ(Extensibility)
    ์‹œ์Šคํ…œ์˜ ํ™•์žฅ์„ฑ์„ ์˜๋ฏธํ•˜๋Š” Scalability์™€ ๋‹ฌ๋ฆฌ Extensibility๋Š” ๋กœ๊ทธ์ธ ์ •๋ณด๊ฐ€ ์‚ฌ์šฉ๋˜๋Š” ๋ถ„์•ผ์˜ ํ™•์ •์„ ์˜๋ฏธํ•œ๋‹ค. ํ† ํฐ ๊ธฐ๋ฐ˜์˜ ์ธ์ฆ ์‹œ์Šคํ…œ์—์„œ๋Š” ํ† ํฐ์— ์„ ํƒ์ ์ธ ๊ถŒํ•œ๋งŒ ๋ถ€์—ฌํ•˜์—ฌ ๋ฐœ๊ธ‰ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ OAuth์˜ ๊ฒฝ์šฐ Facebook, Google ๋“ฑ๊ณผ ๊ฐ™์€ ์†Œ์…œ ๊ณ„์ •์„ ์ด์šฉํ•˜์—ฌ ๋‹ค๋ฅธ ์›น์„œ๋น„์Šค์—์„œ๋„ ๋กœ๊ทธ์ธ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.
  3. ์—ฌ๋Ÿฌ ํ”Œ๋žซํผ ๋ฐ ๋„๋ฉ”์ธ
    ์„œ๋ฒ„ ๊ธฐ๋ฐ˜ ์ธ์ฆ ์‹œ์Šคํ…œ์˜ ๋ฌธ์ œ์  ์ค‘ ํ•˜๋‚˜์ธ CORS๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.
    ํ† ํฐ์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์–ด๋–ค ๋””๋ฐ”์ด์Šค, ์–ด๋–ค ๋„๋ฉ”์ธ์—์„œ๋„ ํ† ํฐ์˜ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ์ง„ํ–‰ํ•œ ํ›„์— ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

JWT(JSON Web Token)

JWT ์ด๋ž€?

  • Json ํฌ๋งท์„ ์ด์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” Claim ๊ธฐ๋ฐ˜์˜ ์›น ํ† ํฐ์ด๋‹ค.
  • ํ† ํฐ ์ž์ฒด์— ์ •๋ณด๊ฐ€ ์ €์žฅ๋˜๋Š” Self-Contained ๋ฐฉ์‹์œผ๋กœ ์ •๋ณด๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์ „๋‹ฌํ•œ๋‹ค.
  • ์ฃผ๋กœ ํšŒ์› ์ธ์ฆ์ด๋‚˜ ์ •๋ณด ์ „๋‹ฌ์— ์‚ฌ์šฉ๋œ๋‹ค.

๋กœ์ง

  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹คํ–‰๋  ๋•Œ, JWT๋ฅผ static ๋ณ€์ˆ˜์™€ ๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€์— ์ €์žฅํ•œ๋‹ค.

static ๋ณ€์ˆ˜์— ์ €์žฅ๋˜๋Š” ์ด์œ ๋Š” HTTP ํ†ต์‹ ์„ ํ•  ๋•Œ๋งˆ๋‹ค JWT๋ฅผ HTTP ํ—ค๋”์— ๋‹ด์•„์„œ ๋ณด๋‚ด์•ผ ํ•˜๋Š”๋ฐ, ์ด๋ฅผ ๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€์—์„œ ๊ณ„์† ๋ถˆ๋Ÿฌ์˜ค๋ฉด ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

  • ํด๋ผ์ด์–ธํŠธ์—์„œ JWT๋ฅผ ํฌํ•จํ•ด ์š”์ฒญ์„ ๋ณด๋‚ด๋ฉด ์„œ๋ฒ„๋Š” ํ—ˆ๊ฐ€๋œ JWT์ธ์ง€๋ฅผ ๊ฒ€์‚ฌํ•œ๋‹ค. ๋˜ํ•œ ๋กœ๊ทธ์•„์›ƒ์„ ํ•  ๊ฒฝ์šฐ ๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€์— ์ €์žฅ๋œ JWT ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ฑฐํ•œ๋‹ค. (์‹ค์ œ ์„œ๋น„์Šค์˜ ๊ฒฝ์šฐ์—๋Š” ๋กœ๊ทธ์•„์›ƒ ์‹œ, ์‚ฌ์šฉํ–ˆ๋˜ ํ† ํฐ์„ blacklist๋ผ๋Š” DB ํ…Œ์ด๋ธ”์— ๋„ฃ์–ด ํ•ด๋‹น ํ† ํฐ์˜ ์ ‘๊ทผ์„ ๋ง‰๋Š” ์ž‘์—…์„ ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.)

JWT ๊ตฌ์กฐ

  • Header, Payload, Signature์˜ 3๋ถ€๋ถ„์œผ๋กœ ์ด๋ฃจ์–ด์ง„๋‹ค.
  • JSON ํ˜•ํƒœ์ธ ๊ฐ ๋ถ€๋ถ„์€ Base64Url๋กœ ์ธ์ฝ”๋”ฉ ๋˜์–ด ํ‘œํ˜„๋œ๋‹ค.
  • ํ† ํฐ์˜ ๊ฐ ๋ถ€๋ถ„์€ .์„ ๊ตฌ๋ถ„์ž๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

Header(ํ—ค๋”)

  • typ๊ณผ alg ๋‘ ๊ฐ€์ง€ ์ •๋ณด๋กœ ๊ตฌ์„ฑ๋œ๋‹ค. alg๋Š” ํ—ค๋”(Header)๋ฅผ ์•”ํ˜ธํ™” ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๊ณ , Signature๋ฅผ ํ•ด์‹ฑํ•˜๊ธฐ ์œ„ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
  • typ: ํ† ํฐ์˜ ํƒ€์ž…์„ ์ง€์ •.
  • alg: ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฐฉ์‹์„ ์ง€์ •ํ•˜๋ฉฐ, ์„œ๋ช…(Signature) ๋ฐ ํ† ํฐ ๊ฒ€์ฆ์— ์‚ฌ์šฉ
{
    "alg": "HS256",
    "typ": JWT
}

Payload(ํŽ˜์ด๋กœ๋“œ)

ํ† ํฐ์—์„œ ์‚ฌ์šฉํ•  ์ •๋ณด์˜ ์กฐ๊ฐ๋“ค์ธ ํด๋ ˆ์ž„(Claim)์ด ๋‹ด๊ฒจ ์žˆ๋‹ค.

Claim์˜ ๊ฒฝ์šฐ ์ด 3๊ฐ€์ง€๋กœ ๋‚˜๋‰œ๋‹ค.

  • Registered Claim(๋“ฑ๋ก๋œ ํด๋ ˆ์ž„)
    ๋ฏธ๋ฆฌ ์ •ํ•ด์ ธ์žˆ๋Š” ํ‚ค๋กœ ๊ตฌ์„ฑ๋œ ๋ฐ์ดํ„ฐ๋“ค๋กœ ๊ฐ ํ‚ค์— ํ•ด๋‹นํ•˜๋Š” ๋ฐ์ดํ„ฐ๋Š” ์„ ํƒ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
iss(ํ† ํฐ ๋ฐœ๊ธ‰์ž), sub(ํ† ํฐ ์ œ๋ชฉ, uniqueํ•œ ๊ฐ’์„ ์‚ฌ์šฉ), aud(ํ† ํฐ ๋Œ€์ƒ), exp(ํ† ํฐ ๋งŒ๋ฃŒ์‹œ๊ฐ„, NumericDate ํ˜•์‹), nbf(ํ† ํฐ ํ™œ์„ฑํ™” ์‹œ๊ฐ„, ์ด ๋‚ ์ด ์ง€๋‚˜๊ธฐ ์ „์˜ ํ† ํฐ์€ ํ™œ์„ฑํ™” ๋˜์ง€ ์•Š์Œ), iat(ํ† ํฐ ๋ฐœ๊ธ‰์‹œ๊ฐ„, ํ† ํฐ ๋ฐœ๊ธ‰ ์ดํ›„์˜ ๊ฒฝ๊ณผ ์‹œ๊ฐ„์„ ์•Œ ์ˆ˜ ์žˆ์Œ), jti(ํ† ํฐ ๊ณ ์œ  ์‹๋ณ„์ž, ์ค‘๋ณต ๋ฐฉ์ง€๋ฅผ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋ฉฐ ์ผํšŒ์šฉ ํ† ํฐ(Access Token) ๋“ฑ์— ์‚ฌ์šฉ)
  • Public Claim(๊ณต๊ฐœ ํด๋ ˆ์ž„)
    ์‚ฌ์šฉ์ž ์ •์˜ ํด๋ ˆ์ž„์œผ๋กœ ๊ณต๊ฐœ์šฉ ์ •๋ณด๋ฅผ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค. ์ถฉ๋Œ ๋ฐฉ์ง€๋ฅผ ์œ„ํ•ด์„œ URI ํฌ๋งท์„ ์‚ฌ์šฉํ•œ๋‹ค.
ex)
{
    "https://yeeeh.tistory.com": true
}
  • Private Claim(๋น„๊ณต๊ฐœ ํด๋ ˆ์ž„)
    ์‚ฌ์šฉ์ž ์ •์˜ ํด๋ ˆ์ž„์œผ๋กœ, ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด์— ์ž„์˜๋กœ ์ง€์ •ํ•œ ์ •๋ณด๋ฅผ ์ €์žฅํ•œ๋‹ค.
    ๊ณต๊ฐœ ํด๋ ˆ์ž„๊ณผ๋Š” ๋‹ค๋ฅด๊ฒŒ ์ผ๋ฐ˜์ ์ธ Key:Value ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ์ถฉ๋Œ ๊ฐ€๋Šฅ์„ฑ์ด ์กด์žฌํ•˜์—ฌ ์‚ฌ์šฉ์— ์œ ์˜ํ•ด์•ผ ํ•œ๋‹ค.
    ์‚ฌ์šฉ์ž ์ธ์ฆ์— ์‚ฌ์šฉ๋˜๋Š” ํ† ํฐ์˜ ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž ํŠน์ •์„ ์œ„ํ•œ ์‹ค์งˆ์ ์ธ ์ •๋ณด๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.
    Header์™€ ๊ฐ™์ด ์•”ํ˜ธํ™”๊ฐ€ ์ง„ํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค.
ex)
{
    "token_type": access
}

Signature(์„œ๋ช…)

์„œ๋ช…(Signature)์€ ํ† ํฐ์„ ์ธ์ฝ”๋”ฉํ•˜๊ฑฐ๋‚˜ ์œ ํšจ์„ฑ ๊ฒ€์ฆ์„ ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ณ ์œ ํ•œ ์•”ํ˜ธํ™” ์ฝ”๋“œ์ด๋‹ค.

์ƒ์„ฑ ์ ˆ์ฐจ

  1. ํ—ค๋”(Header)์™€ ํŽ˜์ด๋กœ๋“œ(Payload)์˜ ๊ฐ’์„ ๊ฐ๊ฐ BASE64Url๋กœ ์ธ์ฝ”๋”ฉํ•œ๋‹ค.
  2. ์ธ์ฝ”๋”ฉํ•œ ๊ฐ’์„ ๋น„๋ฐ€ ํ‚ค๋ฅผ ์ด์šฉํ•ด ํ—ค๋”(Header)์—์„œ ์ •์˜ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ํ•ด์‹ฑ์„ ํ•œ๋‹ค.
  3. ์ด ๊ฐ’์„ ๋‹ค์‹œ BASE64Url๋กœ ์ธ์ฝ”๋”ฉํ•˜์—ฌ ์ƒ์„ฑํ•œ๋‹ค.
  4. ์ƒ์„ฑ๋œ ํ† ํฐ์€ HTTP ํ†ต์‹ ์„ ํ•  ๋•Œ, Authorization์ด๋ผ๋Š” key์˜ value๋กœ ์‚ฌ์šฉ๋œ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ value์—๋Š” Bearer์ด ์•ž์— ๋ถ™์—ฌ์ง„๋‹ค.
{
    "Authorization" : "Bearer {์ƒ์„ฑ๋œ ํ† ํฐ ๊ฐ’}",
}

JWT ์žฅ๋‹จ์ 

์žฅ์ 

  • Self-Contained ์˜ ํŠน์„ฑ์— ๋”ฐ๋ผ์„œ ๋ณ„๋„์˜ ์ธ์ฆ ์ €์žฅ์†Œ๋ฅผ ํ•„์š”๋กœ ํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • MSA ํ™˜๊ฒฝ์—์„œ ์ค‘์•™ ์ง‘์ค‘์‹ ์ธ์ฆ ์„œ๋ฒ„์™€ DB์— ์˜์กดํ•˜์ง€ ์•Š๋Š” ์ธ์ฆ ๋ฐ ์ธ๊ฐ€ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•œ๋‹ค.
  • ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ๊ณผ์ •์—์„œ IO ๋˜๋Š” ๋„คํŠธ์›Œํฌ ์•ก์„ธ์Šค๋ฅผ ํ•„์š”๋กœ ํ•˜์ง€ ์•Š๊ณ  ์ตœ์‹  ์›น ์„œ๋ฒ„ HW์—์„œ ํ™•์žฅ์ด ์šฉ์ดํ•˜๋‹ค.
  • ํŠธ๋ž˜ํ”ฝ ๋Œ€ํ•œ ๋ถ€๋‹ด์ด ๋‚ฎ์Œ
  • REST ์„œ๋น„์Šค๋กœ ์ œ๊ณต ๊ฐ€๋Šฅ

๋‹จ์  ๋ฐ ๊ณ ๋ ค์‚ฌํ•ญ

  • ํ† ํฐ ๊ธธ์ด: ํ† ํฐ์˜ ํŽ˜์ด๋กœ๋“œ(Payload)์— 3์ข…๋ฅ˜์˜ ํด๋ ˆ์ž„์„ ์ €์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์ •๋ณด๊ฐ€ ๋งŽ์•„์งˆ์ˆ˜๋ก ํ† ํฐ์˜ ๊ธธ์ด๊ฐ€ ๋Š˜์–ด๋‚˜ ๋„คํŠธ์›Œํฌ์— ๋ถ€ํ•˜๋ฅผ ์ค„ ์ˆ˜ ์žˆ๋‹ค.
  • Payload ์ธ์ฝ”๋”ฉ: ์ค‘์š”ํ•œ ๋ถ€๋ถ„์ธ Payload ํŒŒํŠธ๊ฐ€ ์•”ํ˜ธํ™”๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ถ”๊ฐ€์ ์ธ ์•”ํ˜ธํ™” ๋ฐฉ์•ˆ์„ ๊ณ ๋ คํ•˜๊ฑฐ๋‚˜, Payload์— ์ค‘์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ์ง€ ์•Š๊ณ  ์šด์˜ํ•ด์•ผ ํ•œ๋‹ค.
  • Stateless: ํ† ํฐ ์ž์ฒด์—์„œ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜์ง€ ์•Š๊ธฐ๋•Œ๋ฌธ์— ํ† ํฐ ๋งŒ๋ฃŒ์™€ ๊ด€๋ จ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ํ•„์ˆ˜๋กœ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

Access Token, Refresh Token

Access Token ๋งŒ์„ ํ†ตํ•œ ์ธ์ฆ ๋ฐฉ์‹์€ ์ œ 3์ž์—๊ฒŒ ํƒˆ์ทจ๋‹นํ•  ๊ฒฝ์šฐ ๋ณด์•ˆ์— ์ทจ์•ฝํ•˜๋‹ค๋Š” ๋ฌธ์ œ์ ์ด ์žˆ๋‹ค.
Access Token์˜ ์œ ํšจ๊ธฐ๊ฐ„์„ ์งง๊ฒŒ ํ•˜๊ณ , Refresh Token์˜ ์œ ํšจ๊ธฐ๊ฐ„์„ ๊ธธ๊ฒŒํ•˜๋Š” ๋ฐฉ์‹์„ ์ด์šฉํ•œ๋‹ค.

  • ์˜ˆ์‹œ

1. ์ฒ˜์Œ์— ๋กœ๊ทธ์ธ์„ ํ•  ๋•Œ, ์„œ๋ฒ„๋Š” ๋กœ๊ทธ์ธ ์„ฑ๊ณต๊ณผ ํ•จ๊ป˜ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ Access Token๊ณผ Refresh Token์„ ๋™์‹œ์— ๋ฐœ๊ธ‰ํ•œ๋‹ค.

2. ์„œ๋ฒ„๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— Refresh Token์„ ์ €์žฅํ•˜๊ณ , ํด๋ผ์ด์–ธํŠธ๋Š” Access Token๊ณผ Refresh Token์„ ์ €์žฅํ•˜๊ณ , ์š”์ฒญ์„ ํ• ๋•Œ๋งˆ๋‹ค ๋‘ ํ† ํฐ์„ ํ—ค๋”์— ๋‹ด์•„์„œ ๋ณด๋‚ธ๋‹ค.

์‚ฌ์šฉ์ž๊ฐ€ ์ธ์ฆ์ด ํ•„์š”ํ•œ API์— ์ ‘๊ทผํ•˜๊ณ ์ž ํ•˜๋ฉด, ๊ฐ€์žฅ ๋จผ์ € ํ† ํฐ์„ ๊ฒ€์‚ฌํ•œ๋‹ค.
์ด๋•Œ, ํ† ํฐ์„ ๊ฒ€์‚ฌํ•จ๊ณผ ๋™์‹œ์— ๊ฐ ๊ฒฝ์šฐ์— ๋Œ€ํ•ด์„œ ํ† ํฐ์˜ ์œ ํšจ๊ธฐ๊ฐ„์„ ํ™•์ธํ•˜์—ฌ ์žฌ๋ฐœ๊ธ‰ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•œ๋‹ค.

case1 : access token๊ณผ refresh token ๋ชจ๋‘ ๋งŒ๋ฃŒ
→ ์—๋Ÿฌ ๋ฐœ์ƒ (์žฌ ๋กœ๊ทธ์ธํ•˜์—ฌ ๋‘˜๋‹ค ์ƒˆ๋กœ ๋ฐœ๊ธ‰)
case2 : access token์€ ๋งŒ๋ฃŒ, refresh token์€ ์œ ํšจ
→ refresh token์„ ๊ฒ€์ฆํ•˜์—ฌ access token ์žฌ๋ฐœ๊ธ‰
case3 : access token์€ ์œ ํšจ, refresh token์€ ๋งŒ๋ฃŒ
→ access token์„ ๊ฒ€์ฆํ•˜์—ฌ refresh token ์žฌ๋ฐœ๊ธ‰
case4 : accesss token๊ณผ refresh token ๋ชจ๋‘๊ฐ€ ์œ ํšจ
→ ์ •์ƒ ์ฒ˜๋ฆฌ

3. ๋กœ๊ทธ์•„์›ƒ์„ ํ•˜๋ฉด Acces Token๊ณผ Refresh Token์„ ๋ชจ๋‘ ๋งŒ๋ฃŒ์‹œํ‚จ๋‹ค.

๋Œ“๊ธ€