JWTํ† ํฐ ์ •๋ฆฌ๐ŸŽซ

JACKJACKยท2023๋…„ 8์›” 26์ผ
1
post-thumbnail

JWTํ† ํฐ์ด๋ž€?

JWT(JSON Web Token)์€ ์›น ํ‘œ์ค€์œผ๋กœ์„œ, ์ •๋ณด๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•œ ๊ตฌ์กฐ๋ฅผ ์ •์˜ํ•œ ํ† ํฐ์ด๋‹ค. ์ฃผ๋กœ ์ธ์ฆ๊ณผ ์ธ๊ฐ€๋ฅผ ๊ฑฐ์ณ ์ •๋ณด ๊ตํ™˜์„ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋ฉฐ, ํŠนํžˆ ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๊ฐ„์˜ ์ธ์ฆ/์ธ๊ฐ€๋ฅผ ๊ฐ„ํŽธํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๋ชฉ์ ์œผ๋กœ ๋„๋ฆฌ ์‚ฌ์šฉ๋œ๋‹ค.

JWT์˜ ๊ธฐ๋ณธ ๊ตฌ์กฐ๋กœ๋Š” Header, Payload, Verify signature๊ฐ€ ์žˆ๋Š”๋ฐ. ๋‹ค์Œ ์‚ฌ์ง„์„ ๋ณด๋ฉด ์ดํ•ด๊ฐ€ ๋น ๋ฅด๋‹ค.
ํ—ค๋”์—๋Š” ํ† ํฐ์˜ ํƒ€์ž…๊ณผ ์‚ฌ์šฉํ•˜๋Š” ํ•ด์‹ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๋“ค์–ด๊ฐ€ ์žˆ๋‹ค.
ํŽ˜์ด๋กœ๋“œ์—๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด๊ฐ€ ์žˆ๋Š”๋ฐ ๊ฐ ๋ฐ์ดํ„ฐ๋ฅผ Claim์ด๋ผ๊ณ  ํ•œ๋‹ค.
์ธ์ฆ ์„œ๋ช…์—๋Š” ํ—ค๋”์™€ ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ๊ณผ ๋ณ€์กฐ ๋ฐฉ์ง€๋ฅผ ์œ„ํ•œ ์„œ๋ช…์ด ๋“ค์–ด๊ฐ€์žˆ์–ด์„œ ํ—ค๋”์™€ ํŽ˜์ด๋กœ๋“œ๋ฅผ ํ•ฉ์นœ ํ›„ ์‹œํฌ๋ฆฟ ํ‚ค ํ—ค๋”์˜ ํ•ด์‹ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ์ธ์ฝ”๋”ฉํ•œ๋‹ค.

JWT์˜ ์ธ์ฆ๊ณผ์ •์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.


๊ทธ๋ ‡๋‹ค๋ฉด ์ฟ ํ‚ค์™€ ์„ธ์…˜์ด ์žˆ๋Š”๋ฐ Web Token์ด ์™œ ํ•„์š”ํ•œ๊ฐ€?

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

  • ์ƒํƒœ ์ €์žฅ ํ•„์š” ์—†์Œ(Stateless): ์›น ํ† ํฐ์€ ํด๋ผ์ด์–ธํŠธ ์ธก์— ์ €์žฅ๋˜๋ฉฐ ์„œ๋ฒ„ ์ธก์— ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ด๋กœ์จ ์„œ๋ฒ„๋Š” ์‚ฌ์šฉ์ž ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ๋ณต์žกํ•œ ์ž‘์—… ์—†์ด ๊ฐ„ํŽธํ•˜๊ฒŒ ๊ตฌํ˜„์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ์„œ๋ฒ„ ํ™•์žฅ์„ฑ๊ณผ ๋ถ„์‚ฐ ์‹œ์Šคํ…œ: ์„ธ์…˜์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์„œ๋ฒ„๊ฐ€ ์‚ฌ์šฉ์ž ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๋ฏ€๋กœ ์„œ๋ฒ„ ํ™•์žฅ์ด ์–ด๋ ค์šธ ์ˆ˜ ์žˆ๋‹ค. ๋ฐ˜๋ฉด ์›น ํ† ํฐ์€ ํด๋ผ์ด์–ธํŠธ ์ธก์—์„œ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๋ฏ€๋กœ ์—ฌ๋Ÿฌ ์„œ๋ฒ„ ๊ฐ„์— ํ† ํฐ์„ ๊ณต์œ ํ•˜๊ฑฐ๋‚˜ ๋™๊ธฐํ™”ํ•  ํ•„์š”๊ฐ€ ์—†์–ด ์„œ๋ฒ„ ํ™•์žฅ์„ฑ์ด ์ข‹๋‹ค.
  • ๋‹ค์–‘ํ•œ ํด๋ผ์ด์–ธํŠธ ์ง€์›: ์›น ํ† ํฐ์€ ์›น ๋ธŒ๋ผ์šฐ์ €๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ชจ๋ฐ”์ผ ์•ฑ, ๋ฐ์Šคํฌํ†ฑ ์•ฑ ๋“ฑ์—์„œ๋„ ๋™์ผํ•œ ํ† ํฐ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ธ์ฆ ๋ฐ ๊ถŒํ•œ ๋ถ€์—ฌ๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.
  • CORS ๋ฌธ์ œ ํ•ด๊ฒฐ: ์›น ํ† ํฐ์€ ํ† ํฐ์„ ํ—ค๋”์— ํฌํ•จํ•˜์—ฌ ์š”์ฒญ์„ ๋ณด๋‚ด๋ฏ€๋กœ, ๋ณด๋‹ค ์œ ์—ฐํ•œ CORS ์„ค์ •์ด ๊ฐ€๋Šฅํ•ด ๋‹ค์–‘ํ•œ ๋„๋ฉ”์ธ์—์„œ๋„ ๋™์ผํ•œ ํ† ํฐ์„ ์‚ฌ์šฉํ•˜์—ฌ API ํ˜ธ์ถœ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋ณด์•ˆ ๊ฐ•ํ™”: ์›น ํ† ํฐ์€ ํ† ํฐ ์ž์ฒด๊ฐ€ ์•”ํ˜ธํ™”๋˜๊ฑฐ๋‚˜ ์„œ๋ช…๋˜์–ด ๋ฐ์ดํ„ฐ ์•ˆ์ •์„ฑ๊ณผ ๋ณด์•ˆ์„ฑ์„ ๊ฐ•ํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค. JWT(JSON Web Token) ๊ฐ™์€ ํ‘œ์ค€์„ ์‚ฌ์šฉํ•˜์—ฌ ํ† ํฐ์„ ์ƒ์„ฑํ•˜๊ณ  ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ๋‹ค. (์‚ฌ์‹ค base64 ๋””์ฝ”๋”ฉ์œผ๋กœ ํ•ด์„์ด ๊ฐ€๋Šฅํ•œ๋ฐ ์ด๊ฒŒ ๋งž๋‚˜ ์‹ถ๋‹ค.)
  • ํด๋ผ์ด์–ธํŠธ ์ธก ์ฒ˜๋ฆฌ ๊ฐ์†Œ: ์„ธ์…˜์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ, ๊ฐ ์š”์ฒญ๋งˆ๋‹ค ์„œ๋ฒ„์—์„œ ์„ธ์…˜ ์ •๋ณด๋ฅผ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค. ํ•˜์ง€๋งŒ ์›น ํ† ํฐ์„ ์‚ฌ์šฉํ•˜๋ฉด ํด๋ผ์ด์–ธํŠธ ์ธก์—์„œ ํ† ํฐ์„ ๊ด€๋ฆฌํ•˜๊ณ  ์š”์ฒญ์— ํฌํ•จ์‹œ์ผœ ๋ณด๋‚ด๋ฏ€๋กœ ์„œ๋ฒ„ ์š”์ฒญ์˜ ๋ถ€๋‹ด์ด ์ค„์–ด๋“ ๋‹ค.(Preflight -> ํ† ํฐ ๊ถŒํ™˜ ํ™•์ธ ๋ฐ ์‹ค์ œ ์š”์ฒญ)

์›น ํ† ํฐ์€ ์ข‹๊ธฐ๋งŒ ํ•œ๊ฐ€?

์›น ํ† ํฐ์€ ๋งŽ์€ ์žฅ์ ์„ ๊ฐ€์ง€์ง€๋งŒ, ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ช‡ ๊ฐ€์ง€ ๋‹จ์ ๋„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

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

Reference

profile
๋Ÿฌ๋‹์ปค๋ธŒ๋ฅผ ๋น ๋ฅด๊ฒŒ ๋†’์ด์ž๐ŸŽข

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