Post

๐Ÿฅธ JWT(Json Web Token)

JWT๋Š” ์œ ์ €๋ฅผ ์ธ์ฆํ•˜๊ณ  ์‹๋ณ„ํ•˜๊ธฐ ์œ„ํ•œ Token ๊ธฐ๋ฐ˜ ์ธ์ฆ์ด๋‹ค.
ํ† ํฐ ์ž์ฒด์— ์‚ฌ์šฉ์ž์˜ ๊ธฐ๋ณธ ์ •๋ณด ๋˜๋Š” Auth๊ฐ€ ํฌํ•จ๋œ๋‹ค.

JWT์˜ ๊ตฌ์กฐ

JWT๋Š” Header, Payload, Signature๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.
๊ฐ ์š”์†Œ๋Š” .์œผ๋กœ ๊ตฌ๋ถ„๋œ๋‹ค.

JWT์—์„œ ์‚ฌ์šฉํ•  Type(typ)๊ณผ ํ•ด์‹œ ์•Œ๊ณ ๋ฆฌ์ฆ˜(alg)์˜ ์ข…๋ฅ˜๊ฐ€ ๋‹ด๊ฒจ์žˆ๋‹ค.

1
2
3
4
{
    "typ":"JWT",
    "alg":"HS256"
}

Payload

์„œ๋ฒ„์—์„œ ์ „๋‹ฌํ•ด์ค€ ์‚ฌ์šฉ์ž์˜ ์ •๋ณด ๋ฐ์ดํ„ฐ(Claim)๋ฅผ ์ €์žฅํ•œ๋‹ค.
Claim์€ Key:Valueํ˜•ํƒœ๋กœ ๊ฐ’์„ ๊ฐ€์ง„๋‹ค. ์ €์žฅ๋˜๋Š” ์ •๋ณด์— ๋”ฐ๋ผ Registered Claims, Public Claims, Private Claims๋กœ ๊ตฌ๋ถ„๋œ๋‹ค.

Registered Claims

1
2
3
4
5
6
7
iss : ํ† ํฐ ๋ฐœ๊ธ‰์ž (issuer)   
sub : ํ† ํฐ ์ œ๋ชฉ (subject)   
aud : ํ† ํฐ ๋Œ€์ƒ์ž (audience)   
exp : ํ† ํฐ ๋งŒ๋ฃŒ ์‹œ๊ฐ„ (expiration)   
nbf : ํ† ํฐ ํ™œ์„ฑ ๋‚ ์งœ (not before), ์ด ๋‚ ์ด ์ง€๋‚˜์ง€ ์•Š์œผ๋ฉด ํ™œ์„ฑํ™”๋˜์ง€ ์•Š๋Š”๋‹ค.   
iat : ํ† ํฐ ๋ฐœ๊ธ‰ ์‹œ๊ฐ„ (issued at)   
jti : JWT ํ† ํฐ ์‹๋ณ„์ž (JWT ID)

Public Claims

Public Claims๋Š” ์ถฉ๋Œ์ด ๋ฐฉ์ง€๋˜์–ด์•ผํ•œ๋‹ค.
์ฃผ๋กœ URI ํ˜•์‹์œผ๋กœ ์ง“๋Š”๋‹ค.

1
"https://munprooo.github.io/jwt/public":true

Private Claims

ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ํ˜‘์˜ํ•˜์— ์‚ฌ์šฉ๋˜๋Š” ํด๋ ˆ์ž„์ด๋‹ค. Public๊ณผ๋Š” ๋‹ฌ๋ฆฌ ์ด๋ฆ„์ด ์ค‘๋ณต๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ถฉ๋Œ์— ์œ ์˜ํ•ด์•ผ ํ•œ๋‹ค.

Signature

Header์™€ Payload๋ฅผ Base64๋กœ ์ธ์ฝ”๋”ฉ ํ›„, Header์— ๋ช…์‹œ๋œ ํ•ด์‹œํ•จ์ˆ˜๋ฅผ ์ ์šฉํ•˜๊ณ , ๊ฐœ์ธํ‚ค๋กœ ์„œ๋ช…ํ•œ ์ „์ž์„œ๋ช…์ด ๋‹ด๊ฒจ์žˆ๋‹ค.
ํ•ด๋‹น ๊ฐ’์€ Header์™€ Payload๊ฐ€ ๋ณ€์กฐ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋œ๋‹ค.

SigningKey๋ฅผ ์„œ๋ฒ„์—์„œ ๊ณ ์ •ํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ์™ธ๋ถ€์—์„œ ๋™์ ์œผ๋กœ ๋ฐ›์•„์˜ค๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.

์„œ๋ฒ„์—์„œ ๊ณ ์ •

  • ์ฝ”๋“œ๋กœ ๊ณ ์ •

์™ธ๋ถ€์—์„œ ๋™์ ์œผ๋กœ ๋ฐ›์•„์˜ค๊ธฐ

  • ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋กœ ์„ค์ •
  • Config๋“ฑ ํŒŒ์ผ์—์„œ ์ฝ์–ด์˜ค๊ธฐ
  • ์™ธ๋ถ€ ์„œ๋น„์Šค ํ˜ธ์ถœ (API ๋“ฑ)

๐Ÿ‘‰ Conclusion

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

JWT์™€ ๊ฐ™์€ ํ† ํฐ์„ ํด๋ผ์ด์–ธํŠธ์— ์ €์žฅํ•˜๋ฉด HTTP ํ—ค๋”์— ํ† ํฐ์„ ์ฒจ๋ถ€ํ•ด์„œ ์š”์ฒญํ•˜๋ฉด ์„œ๋ฒ„์—์„  ํ† ํฐ์˜ ์—ฌ๋ถ€๋งŒ ํŒ๋ณ„ํ•˜๋ฉด ๋œ๋‹ค.
์„œ๋ฒ„๊ฐ€ ์—ฌ๋Ÿฌ ๋Œ€ ์žˆ๋”๋ผ๋„, ์‚ฌ์šฉ์ž๊ฐ€ ๋ณธ์ธ์˜ ์ธ์ฆ,์ธ๊ฐ€๋ฅผ ์ฆ๋ช…ํ•  ์ˆ˜ ์žˆ์–ด ๊ด€๋ฆฌ๊ฐ€ ํŽธ๋ฆฌํ•ด์ง„๋‹ค.

์ด ๋ฐฉ์‹์€ MSA์—์„œ ๋น›์„ ๋ฐœํ•œ๋‹ค.
๊ฐ ์„œ๋น„์Šค๋งˆ๋‹ค ์ž์ฒด์ ์ธ ์„œ๋ฒ„์ด๋ฏ€๋กœ JWT๋ฐฉ์‹์„ ์“ฐ๋ฉด ๋ณต์žกํ•œ ์„ธ์…˜๊ด€๋ฆฌ๊ฐ€ ํ•„์š” ์—†์ด ํ† ํฐ์˜ ์œ ํšจ์„ฑ๋งŒ ๊ฒ€์ฆํ•˜๋ฉด ๋œ๋‹ค.

This post is licensed under CC BY 4.0 by the author.