[WEB] JWT(JSON Web Token)

yayaya_hojinยท2024๋…„ 1์›” 25์ผ

WEB

๋ชฉ๋ก ๋ณด๊ธฐ
7/16
post-thumbnail

๐Ÿช™ JWT(JSON Web Token)

jwt_img

JWT์€ JSON Web Token์„ ์ค„์ธ ๋ง๋กœ JSON ํ˜•ํƒœ๋ฅผ ์•”ํ˜ธํ™”ํ•˜์—ฌ URL-safe๋กœ ํ‘œํ˜„ํ•œ ์ธํ„ฐ๋„ท ํ‘œ์ค€ ์ธ์ฆ ๋ฐฉ์‹์ด๋‹ค.

๐Ÿ“ JWT ๋“ฑ์žฅ๋ฐฐ๊ฒฝ?

์ด์ „์—๋Š” ์ฟ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•ด ์‚ฌ์šฉ์ž๋ฅผ ์‹๋ณ„ํ•˜๊ณ  ๋กœ๊ทธ์ธ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜์˜€๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋ช‡๊ฐ€์ง€ ๋ฌธ์ œ์ ์ด ์ƒ๊ฒผ๋‹ค.

๐Ÿ’ฅ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๊ฐ•์ œ๋กœ ์ฟ ํ‚ค์˜ ๊ฐ’์„ ์กฐ์ž‘ ๊ฐ€๋Šฅ

๐Ÿ’ฅ ๋„คํŠธ์›Œํฌ ์ „์†ก ๊ตฌ๊ฐ„์—์„œ ์ฟ ํ‚ค ํƒˆ์ทจ ๊ฐ€๋Šฅ

๐Ÿ’ฅ ํ•œ ๊ฐœ์˜ ์ฟ ํ‚ค๋Š” ์ตœ๋Œ€ 4KB๋กœ ์ œํ•œ๋˜์–ด ์žˆ์–ด ๋ฐ์ดํ„ฐ๊ฐ€ ์ถฉ๋ถ„ํžˆ ๋‹ด๊ธฐ์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Œ

์ฟ ํ‚ค๋ฅผ ํ†ตํ•ด ์ธ์ฆ์„ ํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ๋ฌธ์ œ์ ์„ ํ•ด๊ฒฐํ•˜๊ณ ์ž ๋‚˜์˜จ ๊ฒƒ์ด ์„ธ์…˜์ด๋‹ค.

์ด๋Š” ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„์— ๋กœ๊ทธ์ธ ์š”์ฒญ์„ ํ•˜๊ณ  ์„œ๋ฒ„์—์„œ ์„ธ์…˜ ID๋ฅผ ๋ฐœ๊ธ‰ํ•ด ํด๋ผ์ด์–ธํŠธ ์ฟ ํ‚ค์— ์ €์žฅ์„ ํ•œ๋‹ค. ๊ทธ ํ›„ ์„œ๋ฒ„์— ์š”์ฒญํ•  ๋•Œ ์ฟ ํ‚ค์— ์„ธ์…˜ ID๋ฅผ ๊ฐ™์ด ์ „๋‹ฌํ•ด์„œ ์„œ๋ฒ„์—์„œ ์„ธ์…˜ ID๋ฅผ ๊ฒ€์‚ฌ ํ›„ ์‘๋‹ต์„ ํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ด๋„ ๋ฌธ์ œ์ ์ด ์ƒ๊ฒผ๋‹ค.

๐Ÿ’ฅ ์„ธ์…˜ ์ €์žฅ์†Œ์˜ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์ธ์ฆ ๋ถˆ๊ฐ€

๐Ÿ’ฅ ์„ธ์…˜ ์ €์žฅ์†Œ๊ฐ€ ์„œ๋ฒ„์— ๋”ฐ๋กœ ์กด์žฌํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ถ”๊ฐ€์ ์ธ ๋น„์šฉ ๋ฐœ์ƒ

๐Ÿ’ฅ ๋งค ์š”์ฒญ๋งˆ๋‹ค ์„ธ์…˜ ์ €์žฅ์†Œ๋ฅผ ์กฐํšŒํ•˜๋Š” ๋ฒˆ๊ฑฐ๋กœ์›€ ๋ฐœ์ƒ

๐Ÿ“ˆ 3) HTTP Stateless

Stateless: ์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ์˜ ์ƒํƒœ๋ฅผ ๋ณด์กดํ•˜์ง€ ์•Š๋Š”๋‹ค.

Stateful: ์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ์˜ ์ƒํƒœ๋ฅผ ๋ณด์กดํ•œ๋‹ค.

HTTP ํ†ต์‹ ์€ ๋ฌด์ƒํƒœ์„ฑ(Stateless)์„ ์ง€ํ–ฅํ•œ๋‹ค. ์ด๋Š” ์„œ๋ฒ„์— ํŠธ๋ž˜ํ”ฝ์ด ์ฆ๊ฐ€ํ•ด๋„ ๋Œ€์ฒ˜๊ฐ€ ๊ฐ€๋Šฅํ•˜๋ฉฐ ์„œ๋ฒ„ ์ค‘ ํ•˜๋‚˜๊ฐ€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ด๋„ ํด๋ผ์ด์–ธํŠธ ์ธก์—์„œ ์ •๋ณด๋ฅผ ๊ด€๋ฆฌํ•ด ๋‹ค๋ฅธ ์„œ๋ฒ„์—์„œ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

JWT์— ๊ฒฝ์šฐ Stateless ํ•˜์ง€๋งŒ, Session์— ๊ฒฝ์šฐ Statefulํ•˜๋‹ค.

๐Ÿช„ JWT ๊ตฌ์„ฑ

jwt_img

Header: ํ† ํฐ์˜ ํƒ€์ž…์ด๋‚˜, ์•”ํ˜ธํ™” ์•Œ๋กœ๊ธฐ์ฆ˜์˜ ์ •๋ณด๊ฐ€ ๋‹ด๊ฒจ์ ธ ์žˆ๋‹ค.

{ 
  "typ": "JWT", // ํ† ํฐ ํƒ€์ž…(Type)
  "alg" : "HS256" // ํ† ํฐ ์•”ํ˜ธํ™” ์•Œ๊ณ ๋ฆฌ์ฆ˜(Algorithm)
}

Payload: ํ† ํฐ์—์„œ ์‚ฌ์šฉํ•  ์ •๋ณด Claim์ด ๋‹ด๊ฒจ ์žˆ๋‹ค.

{ 
  "iss": "http://localhost:3000", //ํ† ํฐ ๋ฐœ๊ธ‰์ž(Issuer)
  "sub" : "ACCESS", // ํ† ํฐ ์ œ๋ชฉ(Subject)
  "aud" : "aa", // ํ† ํฐ ๋Œ€์ƒ์ž(Audience)
  "exp" : "1234567890", // ํ† ํฐ ๋งŒ๋ฃŒ์‹œ๊ฐ„(Expiration Time)
  "nbf" : "1234567890", // ํ† ํฐ ํ™œ์„ฑ ๋‚ ์งœ(Not Before)
  "iat" : "1234567890", // ํ† ํฐ ๋ฐœ๊ธ‰ ์‹œ๊ฐ„(Issued At)
  "jtl" : "aa" // JWT ํ† ํฐ ์‹๋ณ„์ž(JWT id)
}

Signature: Header์™€ Payload์˜ ๋ฌธ์ž์—ด์„ ํ•ฉ์น˜๊ณ , Header์— ์„ ์–ธํ•œ alg์™€ key๋ฅผ ์ด์šฉํ•ด ์•”ํ˜ธํ•œ ๊ฐ’, ํ† ํฐ์˜ ์œ„์กฐ ๋ฐ ๋ณ€์กฐ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•œ๋‹ค.

โš™๏ธ JWT ๊ณผ์ •

JWT๋กœ ํ•˜๋Š” ํ† ํฐ ๊ธฐ๋ฐ˜ ์ธ์ฆ ๋ฐฉ์‹์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

proc_img

๐Ÿช™ Access-Token & Refresh-Token

JWT๋Š” ์œ„ ๊ณผ์ •์—์„œ Access-Token๊ณผ Refresh-Token ๋‘ ๊ฐœ๋ฅผ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ›๋Š”๋ฐ ์ด๋Š” ํ† ํฐ์˜ ๋งŒ๋ฃŒ์‹œ๊ฐ„์„ Access-token์€ ์งง๊ฒŒ Refresh-token์€ ๋น„๊ต์  ๊ธธ๊ฒŒ ํ•˜์—ฌ JWT ํ† ํฐ์˜ ํƒˆ์ทจ ์œ„ํ—˜์„ ์ตœ์†Œํ™”ํ•˜์˜€๋‹ค.

1) ๋‘ ๊ฐœ์˜ Access-token๊ณผ Refresh-token์„ ๋ฐœ๊ธ‰์„ ๋ฐ›์•„ ํ‰์†Œ์—๋Š” Access-token์„ ํ—ค๋”์— ๋‹ด์•„ ์„œ๋ฒ„์™€ ํ†ต์‹ ์„ ํ•œ๋‹ค.

2) Access-token ๋งŒ๋ฃŒ๋˜๋ฉด ํ—ค๋”์— Refresh-token์„ ๋‹ด์•„ ์„œ๋ฒ„์™€ ํ†ต์‹  ํ›„ ์ƒˆ๋กœ์šด Access-token์„ ๋ฐœ๊ธ‰๋ฐ›๋Š”๋‹ค.

3) ๋งŒ์•ฝ Refresh-token์ด ๋งŒ๋ฃŒ๋˜๋ฉด ํด๋ผ์ด์–ธํŠธ๋Š” ์žฌ๋กœ๊ทธ์ธ์„ ํ†ตํ•ด ์ƒˆ๋กœ์šด ๋‘ ๊ฐœ์˜ ํ† ํฐ์„ ๋ฐœ๊ธ‰๋ฐ›๋Š”๋‹ค.

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