๊ฐœ๋ฐœ ์ง€์‹/WEB ์ง€์‹

๐ŸŒ JWT ํ† ํฐ ์ธ์ฆ ์ด๋ž€? (์ฟ ํ‚ค vs ์„ธ์…˜ vs ํ† ํฐ)

์ธํŒŒ_ 2022. 1. 13. 19:24

json-web-token

Cookie / Session / Token ์ธ์ฆ ๋ฐฉ์‹ ์ข…๋ฅ˜

๋ณดํ†ต ์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ ์ธ์ฆ์„ ํ™•์ธํ•˜๋Š” ๋ฐฉ์‹์€ ๋Œ€ํ‘œ์ ์œผ๋กœ ์ฟ ํ‚ค, ์„ธ์…˜, ํ† ํฐ 3๊ฐ€์ง€ ๋ฐฉ์‹์ด ์žˆ๋‹ค.

JWT๋ฅผ ๋ฐฐ์šฐ๊ธฐ ์•ž์„œ ์šฐ์„  ์ฟ ํ‚ค์™€ ์„ธ์…˜์˜ ํ†ต์‹  ๋ฐฉ์‹์„ ๋ณต์Šตํ•ด๋ณด๊ณ  ์ด๋“ค์˜ ๊ฐ๊ฐ ํŠน์ง•๊ณผ ์žฅ๋‹จ์  ๊ทธ๋ฆฌ๊ณ  ์™œ ํ† ํฐ ์ธ์ฆ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜์ง€๋Š”์— ๋Œ€ํ•ด ๊ฐ„๋‹จํ•˜๊ฒŒ ์•Œ์•„๋ณด์ž. (์ฃผ์ž…์‹ ์•”๊ธฐํ•˜์ง€๋ง๊ณ  ๊ณผ์ •์„ ์ดํ•ดํ•˜๋ฉด ๋จธ๋ฆฟ์†์— ๋” ์˜ค๋ž˜ ๋‚จ์„ ๊ฒƒ์ด๋‹ค!)


Cookie ์ธ์ฆ

์ฟ ํ‚ค๋Š” Key-Value ํ˜•์‹์˜ ๋ฌธ์ž์—ด ๋ฉ์–ด๋ฆฌ์ด๋‹ค.

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

์ฟ ํ‚ค-์ธ์ฆ

 

Cookie ์ธ์ฆ ๋ฐฉ์‹

์ฟ ํ‚ค-์ธ์ฆ

  1. ๋ธŒ๋ผ์šฐ์ €(ํด๋ผ์ด์–ธํŠธ)๊ฐ€ ์„œ๋ฒ„์— ์š”์ฒญ(์ ‘์†)์„ ๋ณด๋‚ธ๋‹ค.
  2. ์„œ๋ฒ„๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์— ๋Œ€ํ•œ ์‘๋‹ต์„ ์ž‘์„ฑํ•  ๋•Œ, ํด๋ผ์ด์–ธํŠธ ์ธก์— ์ €์žฅํ•˜๊ณ  ์‹ถ์€ ์ •๋ณด๋ฅผ ์‘๋‹ต ํ—ค๋”์˜ Set-Cookie์— ๋‹ด๋Š”๋‹ค.
  3. ์ดํ›„ ํ•ด๋‹น ํด๋ผ์ด์–ธํŠธ๋Š” ์š”์ฒญ์„ ๋ณด๋‚ผ ๋•Œ๋งˆ๋‹ค, ๋งค๋ฒˆ ์ €์žฅ๋œ ์ฟ ํ‚ค๋ฅผ ์š”์ฒญ ํ—ค๋”์˜ Cookie์— ๋‹ด์•„ ๋ณด๋‚ธ๋‹ค.
    ์„œ๋ฒ„๋Š” ์ฟ ํ‚ค์— ๋‹ด๊ธด ์ •๋ณด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ํ•ด๋‹น ์š”์ฒญ์˜ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ˆ„๊ตฐ์ง€ ์‹๋ณ„ํ•˜๊ฑฐ๋‚˜ ์ •๋ณด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์ถ”์ฒœ ๊ด‘๊ณ ๋ฅผ ๋„์šฐ๊ฑฐ๋‚˜ ํ•œ๋‹ค.

 

Cookie ๋ฐฉ์‹์˜ ๋‹จ์ 

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

Session ์ธ์ฆ

์ด๋Ÿฌํ•œ ์ฟ ํ‚ค์˜ ๋ณด์•ˆ์ ์ธ ์ด์Šˆ ๋•Œ๋ฌธ์—, ์„ธ์…˜์€ ๋น„๋ฐ€๋ฒˆํ˜ธ ๋“ฑ ํด๋ผ์ด์–ธํŠธ์˜ ๋ฏผ๊ฐํ•œ ์ธ์ฆ ์ •๋ณด๋ฅผ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์•„๋‹Œ ์„œ๋ฒ„ ์ธก์— ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌํ•œ๋‹ค. ์„œ๋ฒ„์˜ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•˜๊ธฐ๋„ ํ•˜๊ณ , ์„œ๋ฒ„์˜ ๋กœ์ปฌ ํŒŒ์ผ์ด๋‚˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅํ•˜๊ธฐ๋„ ํ•œ๋‹ค. 

ํ•ต์‹ฌ ๊ณจ์ž๋Š” ๋ฏผ๊ฐํ•œ ์ •๋ณด๋Š” ํด๋ผ์ด์–ธํŠธ์— ๋ณด๋‚ด์ง€๋ง๊ณ  ์„œ๋ฒ„์—์„œ ๋ชจ๋‘ ๊ด€๋ฆฌํ•œ๋‹ค๋Š” ์ ์ด๋‹ค.

์„ธ์…˜ ๊ฐ์ฒด๋Š” ์–ด๋–ค ํ˜•ํƒœ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์„๊นŒ ?
์„ธ์…˜ ๊ฐ์ฒด๋Š” Key์— ํ•ด๋‹นํ•˜๋Š” SESSION ID์™€ ์ด์— ๋Œ€์‘ํ•˜๋Š” Value๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค.
Value์—๋Š” ์„ธ์…˜ ์ƒ์„ฑ ์‹œ๊ฐ„, ๋งˆ์ง€๋ง‰ ์ ‘๊ทผ ์‹œ๊ฐ„ ๋ฐ User๊ฐ€ ์ €์žฅํ•œ ์†์„ฑ ๋“ฑ ์ด Map ํ˜•ํƒœ๋กœ ์ €์žฅ๋œ๋‹ค.
Session ์ธ์ฆ

 

Session ์ธ์ฆ ๋ฐฉ์‹

Session ์ธ์ฆ

  1. ์œ ์ €๊ฐ€ ์›น์‚ฌ์ดํŠธ์—์„œ ๋กœ๊ทธ์ธํ•˜๋ฉด ์„ธ์…˜์ด ์„œ๋ฒ„ ๋ฉ”๋ชจ๋ฆฌ(ํ˜น์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค) ์ƒ์— ์ €์žฅ๋œ๋‹ค.
    ์ด๋•Œ, ์„ธ์…˜์„ ์‹๋ณ„ํ•˜๊ธฐ ์œ„ํ•œ Session Id๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ •๋ณด๋ฅผ ์ €์žฅํ•œ๋‹ค.
  2. ์„œ๋ฒ„์—์„œ ๋ธŒ๋ผ์šฐ์ €์— ์ฟ ํ‚ค์—๋‹ค๊ฐ€ Session Id๋ฅผ ์ €์žฅํ•œ๋‹ค.
  3. ์ฟ ํ‚ค์— ์ •๋ณด๊ฐ€ ๋‹ด๊ฒจ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ธŒ๋ผ์šฐ์ €๋Š” ํ•ด๋‹น ์‚ฌ์ดํŠธ์— ๋Œ€ํ•œ ๋ชจ๋“  Request์— Session Id๋ฅผ ์ฟ ํ‚ค์— ๋‹ด์•„ ์ „์†กํ•œ๋‹ค.
  4. ์„œ๋ฒ„๋Š” ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ณด๋‚ธ Session Id ์™€ ์„œ๋ฒ„ ๋ฉ”๋ชจ๋ฆฌ๋กœ ๊ด€๋ฆฌํ•˜๊ณ  ์žˆ๋Š” Session Id๋ฅผ ๋น„๊ตํ•˜์—ฌ ์ธ์ฆ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

 

Session ๋ฐฉ์‹์˜ ๋‹จ์ 

  • ์ฟ ํ‚ค๋ฅผ ํฌํ•จํ•œ ์š”์ฒญ์ด ์™ธ๋ถ€์— ๋…ธ์ถœ๋˜๋”๋ผ๋„ ์„ธ์…˜ ID ์ž์ฒด๋Š” ์œ ์˜๋ฏธํ•œ ๊ฐœ์ธ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ์ง€ ์•Š๋Š”๋‹ค.
    ๊ทธ๋Ÿฌ๋‚˜ ํ•ด์ปค๊ฐ€ ์„ธ์…˜ ID ์ž์ฒด๋ฅผ ํƒˆ์ทจํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ์ธ์ฒ™ ์œ„์žฅํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ํ•œ๊ณ„๊ฐ€ ์กด์žฌํ•œ๋‹ค. (์ด๋Š” ์„œ๋ฒ„์—์„œ IPํŠน์ •์„ ํ†ตํ•ด ํ•ด๊ฒฐ ํ•  ์ˆ˜ ์žˆ๊ธด ํ•˜๋‹ค)
  • ์„œ๋ฒ„์—์„œ ์„ธ์…˜ ์ €์žฅ์†Œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ์š”์ฒญ์ด ๋งŽ์•„์ง€๋ฉด ์„œ๋ฒ„์— ๋ถ€ํ•˜๊ฐ€ ์‹ฌํ•ด์ง„๋‹ค.

Token ์ธ์ฆ

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

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

ํ† ํฐ์€ ์•ฑ๊ณผ ์„œ๋ฒ„๊ฐ€ ํ†ต์‹  ๋ฐ ์ธ์ฆํ• ๋•Œ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋œ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์›น์—๋Š” ์ฟ ํ‚ค์™€ ์„ธ์…˜์ด ์žˆ์ง€๋งŒ ์•ฑ์—์„œ๋Š” ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

[์„œ๋ฒ„ ๊ธฐ๋ฐ˜ vs ํ† ํฐ ๊ธฐ๋ฐ˜]

์„œ๋ฒ„(์„ธ์…˜) ๊ธฐ๋ฐ˜ ์ธ์ฆ ์‹œ์Šคํ…œ
์„œ๋ฒ„์˜ ์„ธ์…˜์„ ์‚ฌ์šฉํ•ด ์‚ฌ์šฉ์ž ์ธ์ฆ์„ ํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ์„œ๋ฒ„์ธก(์„œ๋ฒ„ ๋žจ or ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค)์—์„œ ์‚ฌ์šฉ์ž์˜ ์ธ์ฆ์ •๋ณด๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.
๊ทธ๋Ÿฌ๋‹ค ๋ณด๋‹ˆ, ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ ์š”์ฒญ์„ ๋ฐ›์œผ๋ฉด ํด๋ผ์ด์–ธํŠธ์˜ ์ƒํƒœ๋ฅผ ๊ณ„์†์—์„œ ์œ ์ง€ํ•ด๋†“๊ณ  ์‚ฌ์šฉํ•œ๋‹ค.
(Stateful) ์ด๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์ฆ๊ฐ€ํ•จ์— ๋”ฐ๋ผ ์„ฑ๋Šฅ์˜ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ์œผ๋ฉฐ ํ™•์žฅ์„ฑ์ด ์–ด๋ ต๋‹ค๋Š” ๋‹จ์ ์„ ์ง€๋‹Œ๋‹ค.

ํ† ํฐ ๊ธฐ๋ฐ˜ ์ธ์ฆ ์‹œ์Šคํ…œ
์ด๋Ÿฌํ•œ ๋‹จ์ ์„ ๊ทน๋ณตํ•˜๊ธฐ ์œ„ํ•ด์„œ "ํ† ํฐ ๊ธฐ๋ฐ˜ ์ธ์ฆ ์‹œ์Šคํ…œ"์ด ๋‚˜ํƒ€๋‚ฌ๋‹ค.
์ธ์ฆ๋ฐ›์€ ์‚ฌ์šฉ์ž์—๊ฒŒ ํ† ํฐ์„ ๋ฐœ๊ธ‰ํ•˜๊ณ , ๋กœ๊ทธ์ธ์ด ํ•„์š”ํ•œ ์ž‘์—…์ผ ๊ฒฝ์šฐ ํ—ค๋”์— ํ† ํฐ์„ ํ•จ๊ป˜ ๋ณด๋‚ด ์ธ์ฆ๋ฐ›์€ ์‚ฌ์šฉ์ž์ธ์ง€ ํ™•์ธํ•œ๋‹ค.
์ด๋Š” ์„œ๋ฒ„ ๊ธฐ๋ฐ˜ ์ธ์ฆ ์‹œ์Šคํ…œ๊ณผ ๋‹ฌ๋ฆฌ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ Stateless ํ•œ ํŠน์ง•์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

 

Token ์ธ์ฆ ๋ฐฉ์‹

json-web-token

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

 

Token ๋ฐฉ์‹์˜ ๋‹จ์ 

  1. ์ฟ ํ‚ค/์„ธ์…˜๊ณผ ๋‹ค๋ฅด๊ฒŒ ํ† ํฐ ์ž์ฒด์˜ ๋ฐ์ดํ„ฐ ๊ธธ์ด๊ฐ€ ๊ธธ์–ด, ์ธ์ฆ ์š”์ฒญ์ด ๋งŽ์•„์งˆ์ˆ˜๋ก ๋„คํŠธ์›Œํฌ ๋ถ€ํ•˜๊ฐ€ ์‹ฌํ•ด์งˆ์ˆ˜ ์žˆ๋‹ค.
  2. Payload ์ž์ฒด๋Š” ์•”ํ˜ธํ™”๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์œ ์ €์˜ ์ค‘์š”ํ•œ ์ •๋ณด๋Š” ๋‹ด์„ ์ˆ˜ ์—†๋‹ค.
  3. ํ† ํฐ์„ ํƒˆ์ทจ๋‹นํ•˜๋ฉด ๋Œ€์ฒ˜ํ•˜๊ธฐ ์–ด๋ ต๋‹ค. (๋”ฐ๋ผ์„œ ์‚ฌ์šฉ ๊ธฐ๊ฐ„ ์ œํ•œ์„ ์„ค์ •ํ•˜๋Š” ์‹์œผ๋กœ ๊ทน๋ณตํ•œ๋‹ค)

JWT (JSON Web Token) ์ด๋ž€

json-web-token

JWT(JSON Web Token)๋ž€ ์ธ์ฆ์— ํ•„์š”ํ•œ ์ •๋ณด๋“ค์„ ์•”ํ˜ธํ™”์‹œํ‚จ JSON ํ† ํฐ์„ ์˜๋ฏธํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  JWT ๊ธฐ๋ฐ˜ ์ธ์ฆ์€ JWT ํ† ํฐ(Access Token)์„ HTTP ํ—ค๋”์— ์‹ค์–ด ์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ๋ฅผ ์‹๋ณ„ํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค

JWT๋Š” JSON ๋ฐ์ดํ„ฐ๋ฅผ Base64 URL-safe Encode ๋ฅผ ํ†ตํ•ด ์ธ์ฝ”๋”ฉํ•˜์—ฌ ์ง๋ ฌํ™”ํ•œ ๊ฒƒ์ด๋ฉฐ, ํ† ํฐ ๋‚ด๋ถ€์—๋Š” ์œ„๋ณ€์กฐ ๋ฐฉ์ง€๋ฅผ ์œ„ํ•ด ๊ฐœ์ธํ‚ค๋ฅผ ํ†ตํ•œ ์ „์ž์„œ๋ช…๋„ ๋“ค์–ด์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ์‚ฌ์šฉ์ž๊ฐ€ JWT ๋ฅผ ์„œ๋ฒ„๋กœ ์ „์†กํ•˜๋ฉด ์„œ๋ฒ„๋Š” ์„œ๋ช…์„ ๊ฒ€์ฆํ•˜๋Š” ๊ณผ์ •์„ ๊ฑฐ์น˜๊ฒŒ ๋˜๋ฉฐ ๊ฒ€์ฆ์ด ์™„๋ฃŒ๋˜๋ฉด ์š”์ฒญํ•œ ์‘๋‹ต์„ ๋Œ๋ ค์ค€๋‹ค.

Base64 URL-safe Encode ๋Š” ์ผ๋ฐ˜์ ์ธ Base64 Encode ์—์„œ URL ์—์„œ ์˜ค๋ฅ˜์—†์ด ์‚ฌ์šฉํ•˜๋„๋ก '+', '/' ๋ฅผ ๊ฐ๊ฐ '-', '_' ๋กœ ํ‘œํ˜„ํ•œ ๊ฒƒ์ด๋‹ค.

JWT ๊ตฌ์กฐ

JWT๋Š” . ์„ ๊ตฌ๋ถ„์ž๋กœ ๋‚˜๋ˆ„์–ด์ง€๋Š” ์„ธ ๊ฐ€์ง€ ๋ฌธ์ž์—ด์˜ ์กฐํ•ฉ์ด๋‹ค.

. ์„ ๊ธฐ์ค€์œผ๋กœ ์ขŒ์ธก๋ถ€ํ„ฐ Header, Payload, Signature๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

json-web-token

Header ์—๋Š” JWT ์—์„œ ์‚ฌ์šฉํ•  ํƒ€์ž…๊ณผ ํ•ด์‹œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์ข…๋ฅ˜๊ฐ€ ๋‹ด๊ฒจ์žˆ์œผ๋ฉฐ, Payload ๋Š” ์„œ๋ฒ„์—์„œ ์ฒจ๋ถ€ํ•œ ์‚ฌ์šฉ์ž ๊ถŒํ•œ ์ •๋ณด์™€ ๋ฐ์ดํ„ฐ๊ฐ€ ๋‹ด๊ฒจ์žˆ๋‹ค. ๋งˆ์ง€๋ง‰์œผ๋กœ Signature ์—๋Š” Header, Payload ๋ฅผ Base64 URL-safe Encode ๋ฅผ ํ•œ ์ดํ›„ Header ์— ๋ช…์‹œ๋œ ํ•ด์‹œํ•จ์ˆ˜๋ฅผ ์ ์šฉํ•˜๊ณ , ๊ฐœ์ธํ‚ค(Private Key)๋กœ ์„œ๋ช…ํ•œ ์ „์ž์„œ๋ช…์ด ๋‹ด๊ฒจ์žˆ๋‹ค.

์‹ค์ œ ๋””์ฝ”๋”ฉ๋œ JWT๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ตฌ์กฐ๋ฅผ ์ง€๋‹Œ๋‹ค.

 

Header

json-web-token

  • alg : ์„œ๋ช… ์•”ํ˜ธํ™” ์•Œ๊ณ ๋ฆฌ์ฆ˜(ex: HMAC SHA256, RSA)
  • typ : ํ† ํฐ ์œ ํ˜•

 

Payload

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

์ฆ‰, ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ฃผ๊ณ ๋ฐ›๋Š” ์‹œ์Šคํ…œ์—์„œ ์‹ค์ œ๋กœ ์‚ฌ์šฉ๋  ์ •๋ณด์— ๋Œ€ํ•œ ๋‚ด์šฉ์„ ๋‹ด๊ณ  ์žˆ๋Š” ์„น์…˜์ด๋‹ค.

key-value ํ˜•์‹์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ํ•œ ์Œ์˜ ์ •๋ณด๋ฅผ Claim์ด๋ผ๊ณ  ์นญํ•œ๋‹ค.

json-web-token

ํŽ˜์ด๋กœ๋“œ๋Š” ์ •ํ•ด์ง„ ๋ฐ์ดํ„ฐ ํƒ€์ž…์€ ์—†์ง€๋งŒ, ๋Œ€ํ‘œ์ ์œผ๋กœ Registered claims, Public claims, Private claims ์ด๋ ‡๊ฒŒ ์„ธ ๊ฐ€์ง€๋กœ ๋‚˜๋‰œ๋‹ค.

json-web-token

  • Registed claims : ๋ฏธ๋ฆฌ ์ •์˜๋œ ํด๋ ˆ์ž„.
    • iss(issuer; ๋ฐœํ–‰์ž),
    • exp(expireation time; ๋งŒ๋ฃŒ ์‹œ๊ฐ„),
    • sub(subject; ์ œ๋ชฉ),
    • iat(issued At; ๋ฐœํ–‰ ์‹œ๊ฐ„),
    • jti(JWI ID)
  • Public claims : ์‚ฌ์šฉ์ž๊ฐ€ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋Š” ํด๋ ˆ์ž„ ๊ณต๊ฐœ์šฉ ์ •๋ณด ์ „๋‹ฌ์„ ์œ„ํ•ด ์‚ฌ์šฉ.
  • Private claims : ํ•ด๋‹นํ•˜๋Š” ๋‹น์‚ฌ์ž๋“ค ๊ฐ„์— ์ •๋ณด๋ฅผ ๊ณต์œ ํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“ค์–ด์ง„ ์‚ฌ์šฉ์ž ์ง€์ • ํด๋ ˆ์ž„. ์™ธ๋ถ€์— ๊ณต๊ฐœ๋˜๋„ ์ƒ๊ด€์—†์ง€๋งŒ ํ•ด๋‹น ์œ ์ €๋ฅผ ํŠน์ •ํ•  ์ˆ˜ ์žˆ๋Š” ์ •๋ณด๋“ค์„ ๋‹ด๋Š”๋‹ค

 

Signature

json-web-token

์‹œ๊ทธ๋‹ˆ์ฒ˜์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ํ—ค๋”์—์„œ ์ •์˜ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฐฉ์‹(alg)์„ ํ™œ์šฉํ•œ๋‹ค.

์‹œ๊ทธ๋‹ˆ์ฒ˜์˜ ๊ตฌ์กฐ๋Š” (ํ—ค๋” + ํŽ˜์ด๋กœ๋“œ)์™€ ์„œ๋ฒ„๊ฐ€ ๊ฐ–๊ณ  ์žˆ๋Š” ์œ ์ผํ•œ key ๊ฐ’์„ ํ•ฉ์นœ ๊ฒƒ์„ ํ—ค๋”์—์„œ ์ •์˜ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ์•”ํ˜ธํ™”๋ฅผ ํ•œ๋‹ค.

json-web-token

Header์™€ Payload๋Š” ๋‹จ์ˆœํžˆ ์ธ์ฝ”๋”ฉ๋œ ๊ฐ’์ด๊ธฐ ๋•Œ๋ฌธ์— ์ œ 3์ž๊ฐ€ ๋ณตํ˜ธํ™” ๋ฐ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, Signature๋Š” ์„œ๋ฒ„ ์ธก์—์„œ ๊ด€๋ฆฌํ•˜๋Š” ๋น„๋ฐ€ํ‚ค๊ฐ€ ์œ ์ถœ๋˜์ง€ ์•Š๋Š” ์ด์ƒ ๋ณตํ˜ธํ™”ํ•  ์ˆ˜ ์—†๋‹ค. ๋”ฐ๋ผ์„œ Signature๋Š” ํ† ํฐ์˜ ์œ„๋ณ€์กฐ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.

JWT ์ธ์ฝ”๋”ฉ / ๋””์ฝ”๋”ฉ ํ•ด๋ณด๊ธฐ

์ง์ ‘ JWT ํ† ํฐ์„ ์ƒ์„ฑํ•ด ์—ฐ์Šตํ•ด๋ณด๊ณ  ์‹ถ๋‹ค๋ฉด, ์•„๋ž˜ ๊ณต์‹์‚ฌ์ดํŠธ์—์„œ ์‰ฝ๊ฒŒ JWT ํ† ํฐ์„ ์ธ์ฝ”๋”ฉ(์ƒ์„ฑ) ํ•˜๊ฑฐ๋‚˜ ๋””์ฝ”๋”ฉ ํ• ์ˆ˜ ์žˆ๋‹ค.

 

JWT.IO

JSON Web Tokens are an open, industry standard RFC 7519 method for representing claims securely between two parties.

jwt.io

JWT ์ธ์ฝ”๋“œ/๋””์ฝ”๋“œ ์˜จ๋ผ์ธ ์‚ฌ์ดํŠธ


JWT๋ฅผ ์ด์šฉํ•œ ์ธ์ฆ ๊ณผ์ •

json-web-token

  1. ์‚ฌ์šฉ์ž๊ฐ€ ID, PW๋ฅผ ์ž…๋ ฅํ•˜์—ฌ ์„œ๋ฒ„์— ๋กœ๊ทธ์ธ ์ธ์ฆ์„ ์š”์ฒญํ•œ๋‹ค.
  2. ์„œ๋ฒ„์—์„œ ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ ์ธ์ฆ ์š”์ฒญ์„ ๋ฐ›์œผ๋ฉด, Header, PayLoad, Signature๋ฅผ ์ •์˜ํ•œ๋‹ค.
    Hedaer, PayLoad, Signature๋ฅผ ๊ฐ๊ฐ Base64๋กœ ํ•œ ๋ฒˆ ๋” ์•”ํ˜ธํ™”ํ•˜์—ฌ JWT๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ด๋ฅผ ์ฟ ํ‚ค์— ๋‹ด์•„ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋ฐœ๊ธ‰ํ•œ๋‹ค.
  3. ํด๋ผ์ด์–ธํŠธ๋Š” ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ JWT๋ฅผ ๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€์— ์ €์žฅํ•œ๋‹ค. (์ฟ ํ‚ค๋‚˜ ๋‹ค๋ฅธ ๊ณณ์— ์ €์žฅํ•  ์ˆ˜๋„ ์žˆ์Œ)
    API๋ฅผ ์„œ๋ฒ„์— ์š”์ฒญํ• ๋•Œ Authorization header์— Access Token์„ ๋‹ด์•„์„œ ๋ณด๋‚ธ๋‹ค.
  4. ์„œ๋ฒ„๊ฐ€ ํ•  ์ผ์€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ Header์— ๋‹ด์•„์„œ ๋ณด๋‚ธ JWT๊ฐ€ ๋‚ด ์„œ๋ฒ„์—์„œ ๋ฐœํ–‰ํ•œ ํ† ํฐ์ธ์ง€ ์ผ์น˜ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜์—ฌ ์ผ์น˜ํ•œ๋‹ค๋ฉด ์ธ์ฆ์„ ํ†ต๊ณผ์‹œ์ผœ์ฃผ๊ณ  ์•„๋‹ˆ๋ผ๋ฉด ํ†ต๊ณผ์‹œํ‚ค์ง€ ์•Š์œผ๋ฉด ๋œ๋‹ค.
    ์ธ์ฆ์ด ํ†ต๊ณผ๋˜์—ˆ์œผ๋ฏ€๋กœ ํŽ˜์ด๋กœ๋“œ์— ๋“ค์–ด์žˆ๋Š” ์œ ์ €์˜ ์ •๋ณด๋“ค์„ selectํ•ด์„œ ํด๋ผ์ด์–ธํŠธ์— ๋Œ๋ ค์ค€๋‹ค.
  5. ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„์— ์š”์ฒญ์„ ํ–ˆ๋Š”๋ฐ, ๋งŒ์ผ ์•ก์„ธ์Šค ํ† ํฐ์˜ ์‹œ๊ฐ„์ด ๋งŒ๋ฃŒ๋˜๋ฉด ํด๋ผ์ด์–ธํŠธ๋Š” ๋ฆฌํ”„๋ž˜์‹œ ํ† ํฐ์„ ์ด์šฉํ•ด์„œ
  6. ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์ƒˆ๋กœ์šด ์—‘์„ธ์Šค ํ† ํฐ์„ ๋ฐœ๊ธ‰ ๋ฐ›๋Š”๋‹ค.

 

ํ† ํฐ ์ธ์ฆ ์‹ ๋ขฐ์„ฑ์„ ๊ฐ€์ง€๋Š” ์ด์œ 

์œ ์ € JWT: A(Header) + B(Payload) + C(Signature) ์ผ ๋•Œ (๋งŒ์ผ ์ž„์˜์˜ ์œ ์ €๊ฐ€ B๋ฅผ ์ˆ˜์ •ํ–ˆ๋‹ค๊ณ  ํ•˜๋ฉด B'๋กœ ํ‘œ์‹œํ•œ๋‹ค.)

  1. ๋‹ค๋ฅธ ์œ ์ €๊ฐ€ B๋ฅผ ์ž„์˜๋กœ ์ˆ˜์ • -> ์œ ์ € JWT: A + B' + C
  2. ์ˆ˜์ •ํ•œ ํ† ํฐ์„ ์„œ๋ฒ„์— ์š”์ฒญ์„ ๋ณด๋‚ด๋ฉด ์„œ๋ฒ„๋Š” ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ์‹œํ–‰
    • ์œ ์ € JWT: A + B' + C
    • ์„œ๋ฒ„์—์„œ ๊ฒ€์ฆ ํ›„ ์ƒ์„ฑํ•œ JWT: A + B' + C' => (signature) ๋ถˆ์ผ์น˜
  3.  ๋Œ€์กฐ ๊ฒฐ๊ณผ๊ฐ€ ์ผ์น˜ํ•˜์ง€ ์•Š์•„ ์œ ์ €์˜ ์ •๋ณด๊ฐ€ ์ž„์˜๋กœ ์กฐ์ž‘๋˜์—ˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

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

๐Ÿ’ก JWT์€ ์„œ๋ช…(์ธ์ฆ)์ด ๋ชฉ์ ์ด๋‹ค.
JWT๋Š” Base64๋กœ ์•”ํ˜ธํ™”๋ฅผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋””๋ฒ„๊ฑฐ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ธ์ฝ”๋”ฉ๋œ JWT๋ฅผ 1์ดˆ๋งŒ์— ๋ณตํ˜ธํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค.
๋ณตํ˜ธํ™” ํ•˜๋ฉด ์‚ฌ์šฉ์ž์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด์€ Payload ๋ถ€๋ถ„์ด ๊ทธ๋Œ€๋กœ ๋…ธ์ถœ๋˜์–ด ๋ฒ„๋ฆฐ๋‹ค. ๊ทธ๋ž˜์„œ ํŽ˜์ด๋กœ๋“œ์—๋Š” ๋น„๋ฐ€๋ฒˆํ˜ธ์™€ ๊ฐ™์€ ๋ฏผ๊ฐํ•œ ์ •๋ณด๋Š” ๋„ฃ์ง€ ๋ง์•„์•ผ ํ•œ๋‹ค.
๊ทธ๋Ÿผ ํ† ํฐ ์ธ์ฆ ๋ฐฉ์‹ ์ž์ฒด๊ฐ€ ๋น› ์ข‹์€ ๊ฐœ์‚ด๊ตฌ๋ผ๊ณ  ์ƒ๊ฐํ• ์ˆ˜๋„ ์žˆ์ง€๋งŒ, ํ† ํฐ์˜ ์ง„์งœ ๋ชฉ์ ์€ ์ •๋ณด ๋ณดํ˜ธ๊ฐ€ ์•„๋‹Œ, ์œ„์กฐ ๋ฐฉ์ง€์ด๋‹ค.
๋ฐ”๋กœ ์œ„์—์„œ ์†Œ๊ฐœํ–ˆ๋“ฏ์ด, ์‹œ๊ทธ๋‹ˆ์ฒ˜์— ์‚ฌ์šฉ๋œ ๋น„๋ฐ€ํ‚ค๊ฐ€ ๋…ธ์ถœ๋˜์ง€ ์•Š๋Š”์ด์ƒ ๋ฐ์ดํ„ฐ๋ฅผ ์œ„์กฐํ•ด๋„ ์‹œ๊ทธ๋‹ˆ์ฒ˜ ๋ถ€๋ถ„์—์„œ ๋ฐ”๋กœ ๊ฑธ๋Ÿฌ์ง€๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

JWT ์žฅ๋‹จ์  ์ •๋ฆฌ

JWT ์žฅ๋‹จ์ 

 

JWT ์žฅ์ 

  1. Header์™€ Payload๋ฅผ ๊ฐ€์ง€๊ณ  Signature๋ฅผ ์ƒ์„ฑํ•˜๋ฏ€๋กœ ๋ฐ์ดํ„ฐ ์œ„๋ณ€์กฐ๋ฅผ ๋ง‰์„ ์ˆ˜ ์žˆ๋‹ค.
  2. ์ธ์ฆ ์ •๋ณด์— ๋Œ€ํ•œ ๋ณ„๋„์˜ ์ €์žฅ์†Œ๊ฐ€ ํ•„์š”์—†๋‹ค.
  3. JWT๋Š” ํ† ํฐ์— ๋Œ€ํ•œ ๊ธฐ๋ณธ ์ •๋ณด์™€ ์ „๋‹ฌํ•  ์ •๋ณด ๋ฐ ํ† ํฐ์ด ๊ฒ€์ฆ๋ฌ์Œ์„ ์ฆ๋ช…ํ•˜๋Š” ์„œ๋ช… ๋“ฑ ํ•„์š”ํ•œ ๋ชจ๋“  ์ •๋ณด๋ฅผ ์ž์ฒด์ ์œผ๋กœ ์ง€๋‹ˆ๊ณ  ์žˆ๋‹ค.
  4. ํด๋ผ์ด์–ธํŠธ ์ธ์ฆ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๋Š” ์„ธ์…˜๊ณผ ๋‹ค๋ฅด๊ฒŒ, ์„œ๋ฒ„๋Š” ๋ฌด์ƒํƒœ(StateLess)๊ฐ€ ๋˜์–ด ์„œ๋ฒ„ ํ™•์žฅ์„ฑ์ด ์šฐ์ˆ˜ํ•ด์งˆ ์ˆ˜ ์žˆ๋‹ค.
  5. ํ† ํฐ ๊ธฐ๋ฐ˜์œผ๋กœ ๋‹ค๋ฅธ ๋กœ๊ทธ์ธ ์‹œ์Šคํ…œ์— ์ ‘๊ทผ ๋ฐ ๊ถŒํ•œ ๊ณต์œ ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค. (์ฟ ํ‚ค์™€ ์ฐจ์ด)
  6. OAuth์˜ ๊ฒฝ์šฐ Facebook, Google ๋“ฑ ์†Œ์…œ ๊ณ„์ •์„ ์ด์šฉํ•˜์—ฌ ๋‹ค๋ฅธ ์›น์„œ๋น„์Šค์—์„œ๋„ ๋กœ๊ทธ์ธ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.
  7. ๋ชจ๋ฐ”์ผ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ™˜๊ฒฝ์—์„œ๋„ ์ž˜ ๋™์ž‘ํ•œ๋‹ค. (๋ชจ๋ฐ”์ผ์€ ์„ธ์…˜ ์‚ฌ์šฉ ๋ถˆ๊ฐ€๋Šฅ)
์„œ๋ฒ„์—์„œ ๊ฐ€์žฅ ํ”ผํ•ด์•ผ ํ•  ๊ฒƒ์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์กฐํšŒ์ด๋‹ค.
์„œ๋ฒ„ ์ž์ฒด๊ฐ€ ์ฃฝ๋Š” ๊ฒฝ์šฐ๋„ ์žˆ์ง€๋งŒ, ๋Œ€๋ถ€๋ถ„ DB๊ฐ€ ํ„ฐ์ ธ์„œ ์„œ๋ฒ„๋„ ๊ฐ™์ด ์ฃฝ๋Š” ๊ฒฝ์šฐ๊ฐ€ ํ—ˆ๋‹คํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
์ด๋Ÿฐ ์ ์—์„œ, JWT ํ† ํฐ์€ DB์กฐํšŒ๋ฅผ ์•ˆํ•ด๋„ ๋˜๋Š” ์žฅ์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋Š” ์ ์ด๋‹ค.
๋งŒ์ผ payload์— ์œ ์ €์ด๋ฆ„๊ณผ ์œ ์ €๋“ฑ๊ธ‰ ์„ ๊ฐ™์ด ๋‘๊ณ  ๋ณด๋‚ด๋ฉด, ์„œ๋ฒ„์—์„œ๋Š” ์œ ์ €์ด๋ฆ„์„ ๊ฐ€์ง€๊ณ  DB๋ฅผ ์กฐํšŒํ•ด์„œ ์œ ์ € ๋“ฑ๊ธ‰์„ ์–ป์ง€์•Š์•„๋„ ๋ฐ”๋กœ ์›ํ•˜๋Š” ์ •๋ณด๋ฅผ ์ทจํ• ์ˆ˜ ์žˆ๋‹ค.

 

JWT ๋‹จ์ 

  1. Self-contained : ํ† ํฐ ์ž์ฒด์— ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ์œผ๋ฏ€๋กœ ์–‘๋‚ ์˜ ๊ฒ€์ด ๋  ์ˆ˜ ์žˆ๋‹ค.
  2. ํ† ํฐ ๊ธธ์ด : ํ† ํฐ์˜ Payload์— 3์ข…๋ฅ˜์˜ ํด๋ ˆ์ž„์„ ์ €์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์ •๋ณด๊ฐ€ ๋งŽ์•„์งˆ์ˆ˜๋ก ํ† ํฐ์˜ ๊ธธ์ด๊ฐ€ ๋Š˜์–ด๋‚˜ ๋„คํŠธ์›Œํฌ์— ๋ถ€ํ•˜๋ฅผ ์ค„ ์ˆ˜ ์žˆ๋‹ค.
  3. Payload ์ธ์ฝ”๋”ฉ : payload ์ž์ฒด๋Š” ์•”ํ˜ธํ™” ๋œ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ BASE64๋กœ ์ธ์ฝ”๋”ฉ ๋œ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์—, ์ค‘๊ฐ„์— Payload๋ฅผ ํƒˆ์ทจํ•˜์—ฌ ๋””์ฝ”๋”ฉํ•˜๋ฉด ๋ฐ์ดํ„ฐ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, payload์— ์ค‘์š” ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค.
  4. Store Token : stateless ํŠน์ง•์„ ๊ฐ€์ง€๊ธฐ ๋•Œ๋ฌธ์—, ํ† ํฐ์€ ํด๋ผ์ด์–ธํŠธ ์ธก์—์„œ ๊ด€๋ฆฌํ•˜๊ณ  ์ €์žฅํ•œ๋‹ค. ๋•Œ๋ฌธ์— ํ† ํฐ ์ž์ฒด๋ฅผ ํƒˆ์ทจ๋‹นํ•˜๋ฉด ๋Œ€์ฒ˜ํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต๊ฒŒ ๋œ๋‹ค.

JWT์˜ Access Token / Refresh Token

๋‹ค๋งŒ ์ด JWT๋„ ์ œ 3์ž์—๊ฒŒ ํ† ํฐ ํƒˆ์ทจ์˜ ์œ„ํ—˜์„ฑ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๋Š”๊ฒƒ์ด ์•„๋‹Œ Access Token, Refresh Token ์œผ๋กœ ์ด์ค‘์œผ๋กœ ๋‚˜๋ˆ„์–ด ์ธ์ฆ์„ ํ•˜๋Š” ๋ฐฉ์‹์„ ํ˜„์—…์—์„  ์ทจํ•œ๋‹ค.

Access Token ๊ณผ Refresh Token์€ ๋‘˜๋‹ค ๋˜‘๊ฐ™์€ JWT์ด๋‹ค. ๋‹ค๋งŒ ํ† ํฐ์ด ์–ด๋””์— ์ €์žฅ๋˜๊ณ  ๊ด€๋ฆฌ๋˜๋Š๋ƒ์— ๋”ฐ๋ฅธ ์‚ฌ์šฉ ์ฐจ์ด์ผ ๋ฟ์ด๋‹ค.

  • Access Token : ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๊ฐ–๊ณ ์žˆ๋Š” ์‹ค์ œ๋กœ ์œ ์ €์˜ ์ •๋ณด๊ฐ€ ๋‹ด๊ธด ํ† ํฐ์œผ๋กœ, ํด๋ผ์ด์–ธํŠธ์—์„œ ์š”์ฒญ์ด ์˜ค๋ฉด ์„œ๋ฒ„์—์„œ ํ•ด๋‹น ํ† ํฐ์— ์žˆ๋Š” ์ •๋ณด๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ •๋ณด์— ๋งž๊ฒŒ ์‘๋‹ต์„ ์ง„ํ–‰
  • Refresh Token: ์ƒˆ๋กœ์šด Access Token์„ ๋ฐœ๊ธ‰ํ•ด์ฃผ๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ํ† ํฐ์œผ๋กœ ์งง์€ ์ˆ˜๋ช…์„ ๊ฐ€์ง€๋Š” Access Token์—๊ฒŒ ์ƒˆ๋กœ์šด ํ† ํฐ์„ ๋ฐœ๊ธ‰ํ•ด์ฃผ๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ. ํ•ด๋‹น ํ† ํฐ์€ ๋ณดํ†ต ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์œ ์ € ์ •๋ณด์™€ ๊ฐ™์ด ๊ธฐ๋ก.

์ •๋ฆฌํ•˜์ž๋ฉด, Access Token์€ ์ ‘๊ทผ์— ๊ด€์—ฌํ•˜๋Š” ํ† ํฐ, Refresh Token์€ ์žฌ๋ฐœ๊ธ‰์— ๊ด€์—ฌํ•˜๋Š” ํ† ํฐ์˜ ์—ญํ• ๋กœ ์‚ฌ์šฉ๋˜๋Š” JWT ์ด๋ผ๊ณ  ๋งํ•  ์ˆ˜ ์žˆ๋‹ค.

 

[WEB] ๐Ÿ“š Access Token & Refresh Token ์›๋ฆฌ (feat. JWT)

Access Token๊ณผ Refresh Token ์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” ๊ธฐ๋ณธ JWT ๋ฐฉ์‹์˜ ์ธ์ฆ(๋ณด์•ˆ) ๊ฐ•ํ™” ๋ฐฉ์‹์ธ Access Token & Refresh Token ์ธ์ฆ ๋ฐฉ์‹์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ฒ ๋‹ค. ๋จผ์ € JWT(Json Web Token) ์— ๋Œ€ํ•ด ์ž˜ ๋ชจ๋ฅด๋Š” ๋…์ž๋“ค์€..

inpa.tistory.com

์œ„์—์„œ๋„ ๋งํ–ˆ๋“ฏ์ด JWT ์ธ์ฆ ๋ฐฉ์‹์„ ๋งŒ์•ฝ Access Token ๋งŒ์„ ์ด์šฉํ•˜๋ฉด, Access Token์€ ๋ฐœ๊ธ‰๋œ ์ดํ›„ ์„œ๋ฒ„์— ์ €์žฅ๋˜์ง€ ์•Š๊ณ  ํด๋ผ์ด์–ธํŠธ์— ์ €์žฅ๋˜์–ด ํ† ํฐ ์ž์ฒด๋กœ ๊ฒ€์ฆ์„ ํ•˜๋ฉฐ ์‚ฌ์šฉ์ž ๊ถŒํ•œ ์ธ์ฆ์„ ์ง„ํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, Access Token์ด ํƒˆ์ทจ๋˜๋ฉด ํ† ํฐ์ด ๋งŒ๋ฃŒ๋˜๊ธฐ ์ „ ๊นŒ์ง€, ํ† ํฐ์„ ํš๋“ํ•œ ์‚ฌ๋žŒ์€ ๋ˆ„๊ตฌ๋‚˜ ๊ถŒํ•œ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•ด์ง€๋Š” ๋ฌธ์ œ์ ์ด ์žˆ์—ˆ๋‹ค.
๊ทธ๋ž˜์„œ ํ† ํฐ์˜ ์œ ํšจ ์‹œ๊ฐ„์„ ๋ถ€์—ฌํ•˜์—ฌ ํƒˆ์ทจ ๋ฌธ์ œ์— ๋Œ€ํ•ด ๋Œ€์‘์„ ํ•˜๊ธฐ๋„ ํ•˜์ง€๋งŒ, ๋งŒ์ผ ์œ ํšจ ๊ธฐ๊ฐ„์ด ์งง์„ ๊ฒฝ์šฐ ๊ทธ๋งŒํผ ์‚ฌ์šฉ์ž๋Š” ๋กœ๊ทธ์ธ์„ ์ž์ฃผํ•ด์•ผ ํ•˜๋Š” ๋ฒˆ๊ฑฐ๋กœ์›€์ด ์žˆ๋‹ค.
๋”ฐ๋ผ์„œ ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด Refresh Token ์ด๋ผ๋Š” ์ถ”๊ฐ€์ ์ธ ํ† ํฐ์„ ํ™œ์šฉํ•˜์—ฌ ํ† ํฐ์„ ์ด์ค‘ ์žฅ๋ง‰์„ ์ณ์„œ ๋ณด๋‹ค ๋ณด์•ˆ์„ ๊ฐ•ํ™”ํ•˜๋Š” ์‹์œผ๋กœ ๋ณด๋ฉด ๋œ๋‹ค.

# ์ฐธ๊ณ ์ž๋ฃŒ

https://cbw1030.tistory.com/331

https://velopert.com/2350

https://pronist.dev/143