JWT(JSON Web Token)

JWT๋ฅผ ์•Œ์•„๋ณด์ž

LOGO

๐Ÿ‘ด ๊ณผ๊ฑฐ ์ผ๋ฐ˜ ํ† ํฐ


์ผ๋ฐ˜ ํ† ํฐ ๊ธฐ๋ฐ˜์˜ ์ธ์ฆ ๋ฐฉ์‹์€ ์˜๋ฏธ๊ฐ€ ์—†๋Š” ๋ฌธ์ž์—ด์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์œผ๋ฉฐ, ์ด๋Ÿฐ ์ผ๋ฐ˜ํ† ํฐ์€ ๋ฌธ์ž์—ด์ด๊ธฐ ๋•Œ๋ฌธ์— ์ •๋ณด๋ฅผ ๋‹ด๊ฑฐ๋‚˜ ํ•  ์ˆ˜ ์—†๋‹ค.

//์ผ๋ฐ˜ ํ† ํฐ
as8d89ae8g88jy8er8g5ergtfg5sdf6g9
// ์ผ๋ฐ˜ ํ† ํฐ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•
{
  "response" : {
    "token" : "as8d89ae8g88jy8er8g5ergtfg5sdf6g9",
    "exp" : "1647329524",
    "iat" : "1560929524"
  }
}

๊ณผ๊ฑฐ ์ผ๋ฐ˜ ํ† ํฐ ๋ฐฉ์‹์˜ ๋ฌธ์ œ์ 

  • ๋ฐœ๊ธ‰๋œ ํ† ํฐ์˜ ๋งŒ๋ฃŒ ์ˆ˜๋‹จ์ด ์—†๋‹ค.
  • ๋ฐœ๊ธ‰๋œ ํ† ํฐ์„ ์ฒ˜๋ฆฌํ• ๋•Œ๋งˆ๋‹ค๊ฐ€ DB์— ์ ‘๊ทผํ•˜์—ฌ ๊ฒ€์‚ฌํ•  ๊ฒฝ์šฐ ๋ถ€๋‹ด์ด ์ƒ๊ธด๋‹ค.
  • ์‚ฌ์šฉ์ž ๋กœ๊ทธ์•„์›ƒ ๋“ฑ์œผ๋กœ ์ธํ•œ ํ† ํฐ์„ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์—†๋‹ค.

๐Ÿ’ก JWT


์œ„์™€ ๊ฐ™์€ ์ผ๋ฐ˜ ํ† ํฐ ๋ฐฉ์‹์˜ ๋ฌธ์ œ์ ์„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ํด๋ ˆ์ž„(claim) ๊ธฐ๋ฐ˜ ํ† ํฐ ๋ฐฉ์‹์ด ๋‚˜์™”๋Š”๋ฐ ํด๋ ˆ์ž„(claim) ๊ธฐ๋ฐ˜ ํ† ํฐ์€ ์‚ฌ์šฉ์ž ์ •๋ณด๋‚˜ ๋ฐ์ดํ„ฐ ์†์„ฑ์„ ๋‹ด์„์ˆ˜ ์žˆ๋‹ค.

//ํ† ํฐ์•ˆ์— ์•„๋ž˜์™€ ๊ฐ™์€ ์ •๋ณด๋ฅผ ๋‹ด์„ ์ˆ˜ ์žˆ๋‹ค.
{
  "user_id" : "gaengsworld",
  "isAdmin" : true
}

์ด ํด๋ ˆ์ž„ ๊ธฐ๋ฐ˜ ํ† ํฐ ์ค‘ ๋Œ€ํ‘œ์ ์ธ ๊ฒƒ์ด JWT๋‹ค(๋ฐœ์Œ์€ JOT์œผ๋กœ ํ•œ๋‹ค๐Ÿ˜…).

ํŠน์ง•

  • ์ˆ˜๋งŽ์€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ ์ง€์›ํ•œ๋‹ค.
  • ์ž๊ฐ€ ์ˆ˜์šฉ์ ์ด๋‹ค (self-contained)์ด๋‹ค.
    • JWT๋Š” ํ•„์š”ํ•œ ๋ชจ๋“  ์ •๋ณด๋ฅผ ์ž์ฒด์ ์œผ๋กœ ์ง€๋‹Œ๋‹ค.
    • JWT ์‹œ์Šคํ…œ์—์„œ ๋ฐœ๊ธ‰๋œ ํ† ํฐ์€ ํ† ํฐ์— ๋Œ€ํ•œ ๊ธฐ๋ณธ ์ •๋ณด ์™€ ์ „๋‹ฌ ํ•  ์ •๋ณด(๋กœ๊ทธ์ธ์‹œ์Šคํ…œ์—์„œ๋Š” ์œ ์ € ์ •๋ณด) ๊ทธ๋ฆฌ๊ณ  ํ† ํฐ์ด ๊ฒ€์ฆ ๋๋‹ค๋Š”๊ฒƒ์„ ์ฆ๋ช…ํ•ด์ฃผ๋Š” signature๋ฅผ ํฌํ•จํ•œ๋‹ค.
  • ์‰ฝ๊ฒŒ ์ „๋‹ฌ ๋  ์ˆ˜ ์žˆ๋‹ค.
    • JWT๋Š” ์ž๊ฐ€์ˆ˜์šฉ์ ์ด๋ฏ€๋กœ ๋‘ ๊ฐœ์ฒด ์‚ฌ์ด์—์„œ ์†์‰ฝ๊ฒŒ ์ „๋‹ฌ๋  ์ˆ˜ ์žˆ๋‹ค.
    • ์›น์„œ๋ฒ„์˜ ๊ฒฝ์šฐ HTTP์˜ ํ—ค๋”์— ๋„ฃ์–ด์„œ ์ „๋‹ฌ ํ•  ์ˆ˜๋„ ์žˆ๊ณ  URL์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌ ํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ตฌ์กฐ

JWT ๊ตฌ์กฐ

์•”ํ˜ธํ™” ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ํ† ํฐ ํƒ€์ž…์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋‹ด๋Š”๋‹ค

{
  "alg": "HS256",
  "typ": "JWT"
}

Payload

  • ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋‹ด๋Š”๋‹ค.
  • ์—ฌ๊ธฐ์— ๋‹ด๋Š” ์ •๋ณด์˜ ํ•œ ์กฐ๊ฐ์„ ํด๋ ˆ์ž„(claim)์ด๋ผ๊ณ  ๋ถ€๋ฅด๊ณ 
  • ์ด๋Š” Name / Value์˜ ํ•œ ์Œ์œผ๋กœ ์ด๋ค„์ ธ์žˆ๋‹ค.
  • ํ† ํฐ์—๋Š” ์—ฌ๋Ÿฌ๊ฐœ์˜ ํด๋ ˆ์ž„๋“ค์„ ๋„ฃ์„ ์ˆ˜ ์žˆ๋‹ค.
{
  "user_id": "gaengsworld",
  "iat": 1560929524,
  "exp": 1647329524
}

Verify Signature

์œ ํšจ์„ฑ ๊ฒ€์ฆ

  • JSON Web Token์˜ ๋งˆ์ง€๋ง‰ ๋ถ€๋ถ„์€ ๋ฐ”๋กœ ์„œ๋ช…(signature)์ด๋‹ค.
  • ์ด ์„œ๋ช…์€ ํ—ค๋”์˜ ์ธ์ฝ”๋”ฉ๊ฐ’๊ณผ ์ •๋ณด์˜ ์ธ์ฝ”๋”ฉ๊ฐ’์„ ํ•ฉ์นœ ํ›„ ์ฃผ์–ด์ง„ ๋น„๋ฐ€ํ‚ค๋กœ ํ•ด์‰ฌ๋ฅผ ํ•˜์—ฌ ์ƒ์„ฑํ•œ๋‹ค.
{
  HMACSHA256(
    base64UrlEncode(header) + "." +
    base64UrlEncode(payload),
    your-256-bit-secret
  ) 
}

์ด๋ ‡๊ฒŒ ์ƒ์„ฑ๋œ ํ† ํฐ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ชจ์Šต์œผ๋กœ ๋ฐœ๊ธ‰๋œ๋‹ค. ๋˜ํ•œ ์ƒ์„ฑ๋œ ํ† ํฐ์€ ๋ณ€์กฐํ•  ์ˆ˜ ์—†๋‹ค.

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.
SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

JWT

๋‹จ์ (์ฃผ์˜ํ•  ์ )

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

Thanks to

์ฐธ๊ณ  : JWT ๊ณต์‹ ํ™ˆํŽ˜์ด์ง€

์ฐธ๊ณ  : MHLab Blog - JWT ์ด๋ž€?

์ฐธ๊ณ  : goodGid - JWT ์†Œ๊ฐœ ๋ฐ ๊ตฌ์กฐ


ยฉ 2019. All rights reserved.