๐Ÿ’ Spring/Spring Security

5. JWT ๊ตฌ์กฐ์— ๋Œ€ํ•ด์„œ

iseunghan 2021. 10. 27. 23:06
๋ฐ˜์‘ํ˜•

์ด ํฌ์ŠคํŠธ๋Š” ๋ฐ์–ด ํ”„๋กœ๊ทธ๋ž˜๋ฐ๋‹˜์˜ ์œ ํŠœ๋ธŒ ๊ฐ•์˜๋ฅผ ๋“ฃ๊ณ  ๋‚˜์„œ ์ •๋ฆฌํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค.

 

JWT๋ž€?

์ถœ์ฒ˜ : https://jwt.io/introduction

jwt.io์— ๊ฐ€๋ณด๋ฉด JWT๋ฅผ ์ด๋ ‡๊ฒŒ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

  • JWT๋กœ ์ฃผ๊ณ ๋ฐ›๋Š” ์ •๋ณด๋Š” ๋””์ง€ํ„ธ ์„œ๋ช…์ด ๋˜์–ด์žˆ์œผ๋ฏ€๋กœ ํ™•์ธํ•˜๊ณ  ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋‹ค.
  • JWT๋Š” HMAC SHA256 (HS256) ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•œ๋‹ค.
  • JWT๋Š” ์ •๋ณด๋ฅผ ์•”ํ˜ธํ™”ํ•˜์—ฌ ์ฃผ๊ณ ๋ฐ›์„ ์ˆ˜ ์žˆ์ง€๋งŒ, ์„œ๋ช…๋œ ํ† ํฐ์— ์ค‘์ ์„ ๋‘˜ ๊ฒƒ. ("์ด๊ฑด ๋‚ด๊ฐ€ ๋ณด๋‚ธ๊ฒŒ ๋งž์•„!" ๋ผ๋Š” ์„œ๋ช…, ์ธ์ฆ์— ์ค‘์ ์„ ๋‘์—ˆ๋‹ค.)

 

JWT ๊ตฌ์กฐ

์ถœ์ฒ˜ : https://jwt.io

(.)์„ ๊ธฐ์ค€์œผ๋กœ ์„ธ๊ฐ€์ง€ ๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋‰œ๋‹ค.

  • Header
  • Payload
  • Signature

 

์™„์„ฑ๋œ ํ† ํฐ์€ ์ด๋ ‡๋‹ค.

xxxxx.yyyyy.zzzzz

 

Header

{
  "alg": "HS256",
  "typ": "JWT"
}
  • ์–ด๋–ค ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ์•”ํ˜ธํ™”๋ฅผ ํ–ˆ๋Š”์ง€
  • ํ† ํฐ์˜ ํƒ€์ž…์ด ๋ฌด์—‡์ธ์ง€

 

Payload

{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true
}
  • Payload์—๋Š” ํด๋ ˆ์ž„์„ ํฌํ•จํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋“ฑ๋ก๋œ ํด๋ ˆ์ž„
    • iss(๋ฐœ๊ธ‰์ž)
    • exp(๋งŒ๋ฃŒ์‹œ๊ฐ„)
    • sub(์ œ๋ชฉ)
    • aud(๋Œ€์ƒ)
    • ๋“ฑ๋“ฑ..
  • ๊ณต๊ฐœ ํด๋ ˆ์ž„
    • ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๊ฐ’๋“ค์„ Key : value ํ˜•์‹์œผ๋กœ ๋„ฃ์œผ๋ฉด ๋œ๋‹ค.
  • ๋น„๊ณต๊ฐœ ํด๋ ˆ์ž„
    • ๋‹น์‚ฌ์ž ๊ฐ„์— ์ •๋ณด๋ฅผ ๊ณต์œ ํ•˜๊ธฐ ์œ„ํ•ด ์ƒ์„ฑ๋œ ๋งž์ถค ํด๋ ˆ์ž„

 

Signature

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

Signature์—๋Š” Base64Url๋กœ ์ธ์ฝ”๋”ฉ ๋œ header, payload, ์‹œํฌ๋ฆฟ ํ‚ค๋ฅผ ๊ฐ€์ง€๊ณ  HMAC256 ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ์•”ํ˜ธํ™”๋ฅผ ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

ํด๋ผ์ด์–ธํŠธ - ์„œ๋ฒ„ ๊ฐ„ JWT ํ† ํฐ ์ƒ์„ฑ

 

JWT ์–ด๋–ป๊ฒŒ ๊ฒ€์ฆํ• ๊นŒ?

์ด์ „์— Signature๋Š” Header์™€ Payload์™€ ์‹œํฌ๋ฆฟ ํ‚ค๋กœ HS256 ์•”ํ˜ธํ™” ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ์ƒ์„ฑํ•œ๋‹ค๊ณ  ํ–ˆ์Šต๋‹ˆ๋‹ค.

  • header
  • payload
  • secret_key

์•„๋ž˜์˜ ๊ณผ์ •์„ ๊ฑฐ์ณ ํ† ํฐ์„ ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ํด๋ผ์ด์–ธํŠธ์—์„œ ๋„˜๊ฒจ์ค€ ์š”์ฒญํ—ค๋”์— JWT์„ header, payload, signature ์„ธ๊ฐ€์ง€๋กœ ๋ถ„๋ฅ˜ํ•œ๋‹ค.
  2. header์™€ payload๋ฅผ base64UrlEncodeํ•œ๋‹ค.
  3. secret_key๋ฅผ ๊ฐ€์ง€๊ณ  HMAC256 ์•”ํ˜ธํ™”๋ฅผ ํ•˜๋ฉด? signature๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค.
  4. ์ด์ œ ๋ฐฉ๊ธˆ ์ƒ์„ฑํ•œ Signature์™€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ค€ signature๋ฅผ ๋น„๊ตํ•ด๋ณธ๋‹ค.

 

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

์™œ?

๋ชจ๋“  ์„œ๋ฒ„๋“ค์ด JWT๋ฅผ ๊ฒ€์ฆํ•˜๊ธฐ ์œ„ํ•ด {secret_key} ๋งŒ ์•Œ๊ณ ์žˆ์œผ๋ฉด ํ•ด๋‹น ์„œ๋ฒ„์—์„œ ์ธ์ฆ๊นŒ์ง€ ๋งˆ์น  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค!

 

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

๋ฐ˜์‘ํ˜•