Skip to content

Latest commit

ย 

History

History

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
ย 
ย 

JWT ์ธ์ฆ ๋ฐฉ์‹ ๐ŸŽฏ๐Ÿ’ก๐Ÿ”ฅ๐Ÿ“Œโœ…

  • ์ธ์ฆ์— ํ•„์š”ํ•œ ์ •๋ณด๋“ค์„ ์•”ํ˜ธํ™”์‹œํ‚จ JSONํ† ํฐ์„ ์˜๋ฏธํ•œ๋‹ค.
  • ํ•˜๋‚˜์˜ ์ธํ„ฐ๋„ท ํ‘œ์ค€ ์ธ์ฆ ๋ฐฉ์‹, (์ธ์ฆ์— ํ•„์š”ํ•œ ์ •๋ณด๋“ค์„ Token์— ๋‹ด์•„ ์•”ํ˜ธํ™”์‹œ์ผœ ์‚ฌ์šฉํ•˜๋Š” ํ† ํฐ)
  • JWT๋Š” ์„œ๋ช…๋œ ํ† ํฐ, ๊ณต๊ฐœ/๊ฐœ์ธ ํ‚ค๋ฅผ ์Œ์œผ๋กœ ์‚ฌ์šฉํ•˜์—ฌ ํ† ํฐ์— ์„œ๋ช…ํ•  ๊ฒฝ์šฐ, ํ† ํฐ์€ ๊ฐœ์ธ ํ‚ค๋ฅผ ๋ณด์œ ํ•œ ์„œ๋ฒ„๊ฐ€ ์ด ์„œ๋ช…๋œ ํ† ํฐ์ด ์ •์ƒ์ ์ธ ํ† ํฐ์ธ์ง€ ์ธ์ฆ ๊ฐ€๋Šฅ
  • ํ† ํฐ์€ ์„ธ์…˜๊ณผ๋Š” ๋‹ฌ๋ฆฌ ์„œ๋ฒ„๊ฐ€ ์•„๋‹Œ ํด๋ผ์ด์–ธํŠธ์— ์ €์žฅ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋ฒ„์˜ ๋ถ€๋‹ด์„ ๋œ ์ฃผ๊ฒŒ ๋œ๋‹ค.
โœ… ํ† ํฐ ์ž์ฒด์— ์‚ฌ์šฉ์ž์˜ ๊ถŒํ•œ ์ •๋ณด๋‚˜ ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ์ •๋ณด๊ฐ€ ํฌํ•จ ๋œ๋‹ค๋Š” ๊ฒƒ

โœ… jwt๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด RESTful๊ณผ ๊ฐ™์€ ๋ฌด์ƒํƒœ์ธ ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.
  - ํด๋ผ์ด์–ธํŠธ์— ์ €์žฅํ•˜๊ณ  ์š”์ฒญ์‹œ ๋‹จ์ˆœํžˆ HTTP ํ—ค๋”์— ํ† ํฐ์„ ์ฒจ๋ถ€ํ•˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋„ ๋‹จ์ˆœํ•˜๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•˜๊ณ  ์‘๋‹ต ๋ฐ›์•„์˜ฌ ์ˆ˜ ์žˆ๋‹ค.
โœ… jwtํ† ํฐ์„ HTTP ํ—ค๋”์— ์‹ค์–ด ์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ๋ฅผ ์‹๋ณ„ํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

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


JWT๋Š” .์œผ๋กœ ๊ตฌ๋ถ„์ด ๋˜์–ด ์žˆ์œผ๋ฉฐ, ๊ตฌ์„ฑ์š”์†Œ๋Š” 3๊ฐ€์ง€ ์ด๋‹ค.

  • Header

    • ํ† ํฐ์˜ ํƒ€์ž…, ์„œ๋ช… ์ƒ์„ฑ์— ์–ด๋–ค ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์‚ฌ์šฉ๋˜์—ˆ๋Š”์ง€ ์ €์žฅํ•œ๋‹ค.
  • Payload

    • payload์—๋Š” ๋ฏผ๊ฐํ•œ ์ •๋ณด๋ฅผ ๋„ฃ์ง€ ์•Š๋Š”๋‹ค.
    • Claim์ด๋ผ๋Š” ์‚ฌ์šฉ์ž์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋‹ด๋Š”๋‹ค. (key-value)๊ฐ’์— ์ €์žฅํ•œ๋‹ค.
    • Claim์˜ ํ‘œ์ค€ ์ŠคํŽ™ : 7๊ฐ€์ง€ (์‚ฌ์šฉ์ž์— ๋”ฐ๋ผ ์„ ํƒ์‚ฌํ•ญ)
      • iss : ํ† ํฐ ๋ฐœ๊ธ‰์ž
      • sub : ํ† ํฐ ์ œ๋ชฉ (ํ† ํฐ์—์„œ ์‚ฌ์šฉ์ž์— ๋Œ€ํ•œ ์‹๋ณ„ ๊ฐ’์ด ๋จ)
      • aud : ํ† ํฐ ๋Œ€์ƒ์ž
      • exp : ๋งŒ๋ฃŒ์‹œ๊ฐ„
      • nbf : ํ† ํฐ ํ™œ์„ฑ ์‹œ๊ฐ„
      • iat : ํ† ํฐ ๋ฐœ๊ธ‰ ์‹œ๊ฐ„
      • jti : JWT ํ† ํฐ ์‹๋ณ„์ž
  • Signature (์„œ๋ช…)

    • Header์™€ Payload๋ฅผ ๋ณด์—ฌ์ค„ ๋•Œ๋Š” ์ธ์ฝ”๋”ฉ ๋˜์–ด์žˆ๋˜ ๊ฐ’๋“ค์„ JWT์— ๋‹ด๊ฒจ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋””์ฝ”๋”ฉ๋œ ์ƒํƒœ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
    • Signature๋Š” ์„œ๋ฒ„์— ์žˆ๋Š” ๊ฐœ์ธํ‚ค๋กœ๋งŒ ์•”ํ˜ธํ™”๋ฅผ ํ’€ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋‹ค๋ฅธ ํด๋ผ์ด์–ธํŠธ๋Š” ์ž„์˜๋กœ Signature๋ฅผ ๋ณตํ˜ธํ™”ํ•  ์ˆ˜ ์—†๋‹ค.


JWT ์ง„ํ–‰ ๋ฐฉ์‹

  1. ํด๋ผ์ด์–ธํŠธ์—์„œ ๋กœ๊ทธ์ธ
  2. ์„œ๋ฒ„์—์„œ ์„œ๋ช…๋œ jwt๋ฅผ ์ƒ์„ฑํ•ด์„œ ํด๋ผ์ด์–ธํŠธ์— ์‘๋‹ต ๋Œ๋ ค์ฃผ๊ธฐ
  3. ํด๋ผ์ด์–ธํŠธ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์š”๊ตฌํ•  ๋•Œ jwt๋ฅผ ํ•ด๋”์— ์ฒจ๋ถ€ํ•ด์„œ ์š”์ฒญ
  4. ์„œ๋ฒ„์—์„œ jwt๊ฒ€์ฆ


JWT ๊ธฐ๋ณธ ๊ตฌ์กฐ

image




Header

{
  //์„œ๋ช… ์•”ํ˜ธํ™” ์•Œ๊ณ ๋ฆฌ์ฆ˜
  "alg": "HS256",
  //ํ† ํฐ ์œ ํ˜•
  "typ": "JWT"
}

Payload

// ํ† ํฐ์—์„œ ์‚ฌ์šฉํ•  ์ •๋ณด์˜ ์กฐ๊ฐ๋“ค์ธ Claim์ด ๋‹ด๊ฒจ ์žˆ๋‹ค.
// ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ฃผ๊ณ ๋ฐ›๋Š” ์‹œ์Šคํ…œ์—์„œ ์‹ค์ œ๋กœ ์‚ฌ์šฉ๋  ์ •๋ณด์— ๋Œ€ํ•œ ๋‚ด์šฉ์„ ๋‹ด๊ณ  ์žˆ๋‹ค.
{
  "sub": "123",
  "name": "je",
  "iat": 156239200,
  "exp": 165234200
}

Signature

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


JWT.io์—์„œ ์ธ์ฝ”๋”ฉ, ๋””์ฝ”๋”ฉ ๊ฐ€๋Šฅ

๐Ÿ’ก JWT์€ ์„œ๋ช…์ธ์ฆ์ด ๋ชฉ์ ์ด๋‹ค.
- jwt๋Š” base64๋กœ ์•”ํ˜ธํ™”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋””๋ฒ„๊ฑฐ๋ฅผ ํ†ตํ•ด ๋ฐ”๋กœ ๋ณตํ˜ธํ™”๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋•Œ๋ฌธ์— ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด์€ payload๋ถ€๋ถ„์ด ๊ทธ๋Œ€๋กœ ๋…ธ์ถœ๋˜์–ด ๋ฒ„๋ฆฐ๋‹ค.

- playload์—๋Š” ๋ฏผ๊ฐํ•œ ์ •๋ณด๋ฅผ ๋„ฃ์œผ๋ฉด ์•ˆ๋œ๋‹ค.

- jwt์ธ์ฆ ๋ฐฉ์‹์€ ์ •๋ณด ๋ณดํ˜ธ๊ฐ€ ์•„๋‹Œ์œ„์กฐ ๋ฐฉ์ง€๊ฐ€ ๋ชฉ์ ์ด๋‹ค.
  - ์‹œ๊ทธ๋‹ˆ์ฒ˜์— ์‚ฌ์šฉ๋œ ๋น„๋ฐ€ํ‚ค๊ฐ€ ๋…ธ์ถœ๋˜์ง€ ์•Š๋Š” ์ด์ƒ ๋ฐ์ดํ„ฐ๋ฅผ ์œ„์กฐํ•ด๋„ ์‹œ๊ทธ๋‹ˆ์ฒ˜ ๋ถ€๋ถ„์—์„œ ๋ฐ”๋กœ ๊ฑธ๋Ÿฌ์ง„๋‹ค.