๊ฐœ๋ฐœ ๊ณต๋ถ€/์›น ์ง€์‹ ์ฐฝ๊ณ 

JWT (JSON Web Token) ๊ฐœ๋…

๊ฐ€์šค์ด 2024. 11. 6. 13:27

JWT (JSON Web Token)

JSON ํ˜•์‹์œผ๋กœ ์ธ์ฝ”๋”ฉ๋œ ํ† ํฐ์„ ์‚ฌ์šฉํ•ด ์‚ฌ์šฉ์ž ์ธ์ฆ ๋ฐ ์ •๋ณด ์ „๋‹ฌ์— ์‚ฌ์šฉํ•˜๋Š” ํ† ํฐ ๊ธฐ๋ฐ˜ ์ธ์ฆ ๋ฐฉ์‹

 

 

์ธ๊ฐ€ (Authorization)


  • ์–ด๋–ค ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉ์ž๊ฐ€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ถŒํ•œ์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ์ ˆ์ฐจ
  • ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธํ•˜๋Š” ๊ฒƒ์€ ์ธ์ฆ(Authentication)์ด๊ณ , ๋กœ๊ทธ์ธํ•œ ์‚ฌ์šฉ์ž๊ฐ€ ์–ด๋–ค ๊ถŒํ•œ์„ ๊ฐ€์กŒ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ณผ์ •์ด ์ธ๊ฐ€(Authorization)
  • ์–ด๋–ค ์„œ๋น„์Šค์—์„œ ๊ฒŒ์‹œ๊ธ€์„ ๋“ฑ๋กํ•œ๋‹ค๋˜์ง€, ๋Œ“๊ธ€์„ ๋‚จ๊ธฐ๋˜์ง€ ๋“ฑ์˜ ๊ธฐ๋Šฅ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๊ถŒํ•œ์— ๋Œ€ํ•ด ๋งค๋ฒˆ ํ™•์ธํ•ด์•ผ ํ•จ ⇒ ๋กœ๊ทธ์ธ ์œ ์ง€
  • ๋กœ๊ทธ์ธ ์œ ์ง€ ๋ฐฉ์‹
    • ์„ธ์…˜ (Session)
    • ํ† ํฐ

 

 

Session๊ณผ JWT ๋น„๊ต


Session

  • ์„ธ์…˜ ID๋ฅผ ํด๋ผ์ด์–ธํŠธ์— ์ „๋‹ฌํ•˜๊ณ  ์ดํ›„ ํด๋ผ์ด์–ธํŠธ๋Š” ์š”์ฒญ๋งˆ๋‹ค ์„ธ์…˜ ID๋ฅผ ๋ณด๋‚ธ๋‹ค. ์„œ๋ฒ„๋Š” ์ €์žฅ๋œ ์„ธ์…˜ ์ •๋ณด๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž๋ฅผ ํ™•์ธํ•˜๋Š” ๋ฐฉ์‹
  • ์„œ๋ฒ„๊ฐ€ ์„ธ์…˜์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— Stateful(์ƒํƒœ์œ ์ง€)ํ•œ ๋ฐฉ์‹
  • ๋งŽ์€ ์‚ฌ์šฉ์ž๊ฐ€ ์ ‘์†ํ•˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋ถ€์กฑํ•ด์งˆ ์ˆ˜ ์žˆ๋‹ค.
  • ์—ฌ๋Ÿฌ ๋Œ€์˜ ์„œ๋ฒ„๋ฅผ ์ด์šฉํ•  ๋• ์‚ฌ์šฉ์ž๊ฐ€ ์–ด๋–ค ์„œ๋ฒ„์— ์ ‘์†ํ–ˆ๋Š”์ง€์— ๋”ฐ๋ผ ์„ธ์…˜ ์ •๋ณด๋ฅผ ์ผ๊ด€๋˜๊ฒŒ ์œ ์ง€ํ•ด์•ผํ•˜๋ฏ€๋กœ ์„œ๋ฒ„ ๊ฐ„์˜ ์„ธ์…˜ ๋™๊ธฐํ™”๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

 

JWT

  • ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธ์„ ํ•˜๋ฉด ์„œ๋ฒ„๊ฐ€ ํ† ํฐ(JWT)์„ ์ƒ์„ฑํ•ด ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ „๋‹ฌํ•œ๋‹ค. ํด๋ผ์ด์–ธํŠธ๋Š” ํ† ํฐ์„ ์ €์žฅํ•ด ์„œ๋ฒ„์— ์š”์ฒญ ์‹œ๋งˆ๋‹ค ํ† ํฐ์„ ํ•จ๊ป˜ ์ „์†กํ•œ๋‹ค.
  • ์ƒํƒœ๋ฅผ ์„œ๋ฒ„์— ์ €์žฅํ•˜์ง€ ์•Š๊ณ  ํ† ํฐ์— ์ •๋ณด๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— Stateless(์ƒํƒœ๋น„์œ ์ง€) ๋ฐฉ์‹
  • Stateful ๋ฐฉ์‹์˜ ๋‹จ์ ์„ ํ•ด๊ฒฐ
  • ๊ทธ๋Ÿฌ๋‚˜ ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์•„์›ƒํ•˜๊ฑฐ๋‚˜ ํ† ํฐ์„ ๋ฌดํšจํ™”ํ•ด์•ผ ํ•  ๊ฒฝ์šฐ ์ด๋ฏธ ๋ฐœ๊ธ‰๋œ JWT๋ฅผ ๊ฐ•์ œ๋กœ ๋ฌดํšจํ™”ํ•˜๊ธฐ ์–ด๋ ต๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ์Œ

 

 

JWT ๋™์ž‘ ์›๋ฆฌ


  1. ์‚ฌ์šฉ์ž๊ฐ€ id, password๋กœ ๋กœ๊ทธ์ธ ์š”์ฒญ
  2. ์„œ๋ฒ„๋Š” ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ํ™•์ธํ•œ ํ›„ ์‚ฌ์šฉ์ž์˜ ์ •๋ณด์™€ ํ† ํฐ์˜ ๋งŒ๋ฃŒ ์‹œ๊ฐ„ ๋“ฑ์ด ํฌํ•จ๋œ JWT๋ฅผ ๋ฐœ๊ธ‰
  3. ์ด ํ† ํฐ์„ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ „๋‹ฌ
  4. ํด๋ผ์ด์–ธํŠธ๋Š” ์ด JWT๋ฅผ ์ฟ ํ‚ค๋‚˜ ๋กœ์ปฌ์Šคํ† ๋ฆฌ์ง€์— ์ €์žฅ
  5. ํด๋ผ์ด์–ธํŠธ๋Š” ์„œ๋ฒ„์— ์š”์ฒญํ•  ๋•Œ๋งˆ๋‹ค Authorization ํ—ค๋”์— JWT๋ฅผ ํฌํ•จํ•˜์—ฌ ์š”์ฒญ
  6. ์„œ๋ฒ„์—์„œ JWT๋ฅผ ๊ฒ€์ฆ ํ›„์— ์š”์ฒญ์„ ์ฒ˜๋ฆฌ

 

 

JWT ๊ตฌ์กฐ


https://jwt.io/

 

JWT.IO

JSON Web Tokens are an open, industry standard RFC 7519 method for representing claims securely between two parties.

jwt.io

 

ํ† ํฐ ์˜ˆ์‹œ)

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

 

์ธ์ฝ”๋”ฉ๋œ ํ† ํฐ์„ ๋””์ฝ”๋”ฉํ•œ ์˜ˆ์‹œ)

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

// payload
{
  "sub": "1234567890",
  "name": "John Doe",
  "iat": 1516239022
}

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

) secret base64 encoded

 

 

  • Header (ํ—ค๋”)
    • type: “JWT” ← ๊ณ ์ •๊ฐ’
    • alg: ์„œ๋ช… ๊ฐ’์„ ๋งŒ๋“œ๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜ (HS256…)
  • Payload (์ •๋ณด)
    • iss (issuer): ํ† ํฐ ๋ฐœ๊ธ‰์ž
    • aud (audience): ํ† ํฐ ๋Œ€์ƒ์ž (client id)
    • exp (expiration): ํ† ํฐ ๋งŒ๋ฃŒ ์‹œ๊ฐ„
    • iat (issued at): ํ† ํฐ ๋ฐœ๊ธ‰ ์‹œ๊ฐ„
    • sub (subject): ํ† ํฐ ์ œ๋ชฉ
    • ๊ทธ ์™ธ ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ
  • Verify Signature (์„œ๋ช…)
    • ์ธ์ฝ”๋”ฉ๋œ ํ—ค๋”์™€ ํŽ˜์ด๋กœ๋“œ ๊ทธ๋ฆฌ๊ณ  ๋น„๋ฐ€ํ‚ค์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ๋˜๋Š” ์„œ๋ช… ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ†ตํ•ด ์ƒ์„ฑ๋œ ๊ฐ’

 

'๊ฐœ๋ฐœ ๊ณต๋ถ€ > ์›น ์ง€์‹ ์ฐฝ๊ณ ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

Node.js ๊ตฌ์กฐ์™€ ๋™์ž‘์›๋ฆฌ  (0) 2024.11.14
GraphQL vs Rest API  (1) 2024.11.07