[CS-WEB] JWT

์ง€์˜ยท2023๋…„ 8์›” 10์ผ
0

CS

๋ชฉ๋ก ๋ณด๊ธฐ
58/77
post-custom-banner

๐Ÿ“ ๋ฏธ๋ฆฌ ์•Œ๊ณ ์žˆ์œผ๋ฉด ์ข‹์€ ์ง€์‹

  • Authorization(์ธ๊ฐ€) : ์‚ฌ์šฉ์ž ๊ฐœ์ธ์ •๋ณด์™€ ๊ฐ™์€ ์ž์›์— ์ ‘๊ทผํ•  ๋•Œ์˜ ๊ถŒํ•œ์„ ํš๋“ํ•˜๋Š” ๊ฒƒ. ์ด๋•Œ Access token์œผ๋กœ ๊ถŒํ•œ์ด ๋ถ€์—ฌ๋จ.
  • Authentication(์ธ์ฆ) : ์‚ฌ์šฉ์ž์˜ ์‹ ์›์„ ๊ฒ€์ฆํ•˜๋Š” ํ–‰์œ„. ๋ณด์•ˆ ํ”„๋กœ์„ธ์Šค์˜ ์ฒซ๋ฒˆ์งธ ๋‹จ๊ณ„์— ํ•ด๋‹น ID/PW ์ž…๋ ฅ์ด ๊ฐ€์žฅ ๋ณดํŽธ์ ์ธ ์ธ์ฆ ๋ฐฉ์‹์ž„. ์š”์ฆ˜์—๋Š” ์ƒ์ฒด์ธ์‹์œผ๋กœ๋„ ์ง„ํ–‰ํ•˜๊ณ  ์žˆ์Œ.

โœ” JWT๋ž€,

  • JSON Web Token์˜ ์•ฝ์ž.

  • ์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ธ์ฆ๋˜์—ˆ๋‹ค๋Š” ์˜๋ฏธ๋กœ ํ† ํฐ์„ ๋ฐœ๊ธ‰ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹.

  • Base64๋กœ ์ธ์ฝ”๋”ฉ ๋˜์–ด์žˆ๊ณ , ์˜จ๋ผ์ธ ๋””๋ฒ„๊ฑฐ๋ฅผ ํ†ตํ•ด JSONํ˜•ํƒœ๋กœ ๋””์ฝ”๋”ฉํ•จ.

  • ํด๋ผ์ด์–ธํŠธ๋Š” ์„œ๋ฒ„์— ์š”์ฒญ์„ ๋ณด๋‚ผ ๋•Œ ๋งˆ๋‹ค ์š”์ฒญ์˜ ํ—ค๋”์— ํ† ํฐ์„ ๋‹ด์•„ ํ•จ๊ป˜ ์š”์ฒญ

  • ํ† ํฐ๊ณผ ํ•จ๊ป˜ ์˜จ ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ์„œ๋ฒ„๊ฐ€ ์Šค์Šค๋กœ ์ œ๊ณตํ–ˆ๋˜ ํ† ํฐ๊ณผ ์ผ์น˜ํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•œ ํ›„, ์ •์ƒ์ ์ธ ์š”์ฒญ์ธ์ง€๋ฅผ ํ™•์ธํ•œ๋‹ค.

  • ํฌ๊ฒŒ Header. Payload. Signature ํŒŒํŠธ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์Œ.

๐Ÿ“œ JWT์—์„œ ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” JSON ํ‚ค ์ด๋ฆ„

  1. sub : ์ธ์ฆ์˜ ์ฃผ์ œ(subject)
  2. iss : ํ† ํฐ์˜ ๋ฐœ๊ธ‰์ฒ˜
  3. typ : ํ† ํฐ์˜ ์œ ํ˜• (type)
  4. alg : ์„œ๋ช…์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜
  5. iat : ๋ฐœ๊ธ‰ ์‹œ๊ฐ (issued at)
  6. exp : ๋งŒ๋ฃŒ ์‹œ์ž‘(expiration time)
  7. aud : ํด๋ผ์ด์–ธํŠธ(audience)

โœ” JWT๋ฅผ ์“ฐ๋Š” ์ด์œ ?

์ฟ ํ‚ค์™€ ์„ธ์…˜์„ ์‚ฌ์šฉํ•  ๋•Œ์—๋Š” ์„œ๋ฒ„ ๋‹จ์— ๋กœ๊ทธ์ธํ•œ ๋ชจ๋“  ์‚ฌ์š”์ž์˜ ์„ธ์…˜์„ DB๋‚˜ ์บ์‹œ์— ์ €์žฅํ•œ ํ›„, ์ฟ ํ‚ค๋กœ ๋„˜์–ด์˜จ ์„ธ์…˜ID๋กœ ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•ด์•ผ๋งŒ ํ–ˆ๋‹ค. ๋˜ํ•œ ์ฟ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ•„ํžˆ ๋ฐœ์ƒํ•˜๋Š” CORS๋ฌธ์ œ๋„ ํ•ด๊ฒฐํ•ด์•ผ๋งŒ ํ–ˆ๋‹ค.


๊ทธ์น˜๋งŒ JWT๋Š” ํ† ํฐ ์ž์ฒด์— ์‚ฌ์šฉ์ž์˜ ์ •๋ณด๊ฐ€ ์ €์žฅ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋ฒ„ ์ž…์žฅ์—์„œ ํ† ํฐ์„ ๊ฒ€์ฆํ•˜๊ธฐ ํ•˜๋ฉด ๋œ๋‹ค. ๋”ฐ๋ผ์„œ ์‚ฌ์šฉ๊ฐ€ ๋Š˜์–ด๋‚˜๋”๋ผ๋„ ์‚ฌ์šฉ์ž ์ธ์ฆ์— ๋“ค์–ด๊ฐ€๋Š” ์ธํ”„๋ผ ๋น„์šฉ์„ ์ ˆ๊ฐํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿค”CORS : Cross Origin Resource Sharing, ํ•œ ๋„๋ฉ”์ธ์ด ๋‹ค๋ฅธ ๋„๋ฉ”์ธ๊ฐ€ ๊ฐ€์ง„ ๋ฆฌ์†Œ์Šค์— ์•ก์„ธ์Šค๋ฅผ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ๋ณด์•ˆ ๋ฉ”์ปค๋‹ˆ์ฆ˜. ์ด์ „์—๋Š” ๋™์ผํ•œ ๋„๋ฉ”์ธ์—์„œ ๋ฆฌ์†Œ์Šค๋ฅผ ๋ฐ›์•„์™”๋‹ค๋ฉด, ์ง€๊ธˆ์€ ํด๋ผ์ด์–ธํŠธ์—์„œ ๋‹ค๋ฅธ ์„œ๋ฒ„๊ฐ€ ์ œ๊ณตํ•˜๋Š” API๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ผ์ด ๋งŽ์•„์ง€๋ฉด์„œ ์ƒ๊ธฐ๊ฒŒ ๋˜์—ˆ๋‹ค๊ณ  ํ•œ๋‹ค.

โœ” JWT์˜ ๊ตฌ์กฐ

1. Header

ํ† ํฐ์˜ ์œ ํ˜•๊ณผ ์„œ๋ช… ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋ช…์‹œํ•˜๋Š” ๋ถ€๋ถ„

{
  "typ" : "JWT",
  "alg" : "HS256" // ํ•ด์‹ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ์„œ, HMAC, RSA๊ฐ€ ์˜ˆ์‹œ๋กœ ์žˆ๋‹ค. signature๋ถ€๋ถ„์—์„œ ์‚ฌ์šฉ๋จ.
}

2. Payload

claim์ด๋ผ๊ณ ๋„ ๋ถˆ๋ฆฌ๋Š” ์‚ฌ์šฉ์ž์˜ ์ธ์ฆ/์ธ๊ฐ€ ์ •๋ณด๊ฐ€ ๋‹ด๊ธฐ๋Š” ๋ถ€๋ถ„

{
  "sub" : "1234567890",
  "lat" : 152459873
}

3. Signature

JWT์˜ ํ•ต์‹ฌ. ํ† ํฐ์˜ ์œ„๋ณ€์กฐ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜๋Š”๋ฐ์— ์‚ฌ์šฉ, header/payload๋ฅผ Base64URLEncode๋ฅผ ์ ์šฉํ•˜์—ฌ ๊ฐœ์ธ ํ‚ค๋กœ ์„œ๋ช…ํ•œ ํ›„, header-alg์—์„œ ๋ช…์‹œํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ ์šฉํ•จ.

  HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload), "YourSecretKeyValue
)

โœ” ๋กœ๊ทธ์ธ ์ธ์ฆ์‹œ JWT ์‚ฌ์šฉ

JWT(JSON Web Token)๋Š” JSON๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  self-contained ๋ฐฉ์‹์œผ๋กœ ๋‘ ๊ฐœ์ฒด์—์„œ ์ •๋ณด๋ฅผ ๊ฐ€๋ณ๊ณ  ์•ˆ์ •์„ฑ ์žˆ๊ฒŒ ์ „๋‹ฌํ•ด์ค€๋‹ค. JWT์˜ ํ•ต์‹ฌ์ ์ธ ํŠน์ง•์ธ self-contained๋Š” ํ† ํฐ ์ž์ฒด์— ์‚ฌ์šฉ์ž์˜ ๊ถŒํ•œ ์ •๋ณด๋‚˜ ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ์ •๋ณด๊ฐ€ ํฌํ•จ๋œ๋‹ค๋Š” ๊ฒƒ์œผ๋กœ ํ† ํฐ์— ๋Œ€ํ•œ ๊ธฐ๋ณธ์ •๋ณด, ์ „๋‹ฌํ•  ์ •๋ณด, ํ† ํฐ์ด ๊ฒ€์ฆ๋˜์—ˆ๋‹ค๋Š” ๊ฒƒ์„ ์ฆ๋ช…ํ•ด์ฃผ๋Š” signature์„ ํฌํ•จํ•˜๊ณ  ์žˆ๋‹ค.

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

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

profile
๊พธ์ค€ํ•จ์˜ ํž˜์„ ์•„๋Š” ๊ฐœ๋ฐœ์ž๐Ÿ“
post-custom-banner

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

comment-user-thumbnail
2023๋…„ 8์›” 10์ผ

๊ฐœ๋ฐœ์ž๋กœ์„œ ์„ฑ์žฅํ•˜๋Š” ๋ฐ ํฐ ๋„์›€์ด ๋œ ๊ธ€์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

๋‹ต๊ธ€ ๋‹ฌ๊ธฐ