๐ŸŽซ
โ† ๊ฐ€์ด๋“œ ๋ชฉ๋ก์œผ๋กœ

JWT ํ† ํฐ ๊ตฌ์กฐ ์„ค๋ช…: Header, Payload, Signature

ยท ํƒœ๊ทธ: jwt-structure, jwt-header, jwt-payload, jwt-signature, json-web-token

JWT ํ† ํฐ ๊ตฌ์กฐ ์„ค๋ช…

๋ชจ๋“  JSON Web Token(JWT)์€ ๋‘ ๋‹น์‚ฌ์ž ๊ฐ„์— ํด๋ ˆ์ž„์„ ์ „๋‹ฌํ•˜๋Š” ๊ฐ„๊ฒฐํ•˜๊ณ  URL-safeํ•œ ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค. ํ† ํฐ ๊ธฐ๋ฐ˜ ๋ณด์•ˆ์„ ๋‹ค๋ฃจ๋Š” ๊ฐœ๋ฐœ์ž๋ผ๋ฉด ๋‚ด๋ถ€ ๊ตฌ์กฐ๋ฅผ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค.

JWT์˜ ์„ธ ๋ถ€๋ถ„

JWT๋Š” ์ (.)์œผ๋กœ ๊ตฌ๋ถ„๋œ ์„ธ ๋ถ€๋ถ„์œผ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.

header.payload.signature

์˜ˆ์‹œ:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

๊ฐ ๋ถ€๋ถ„์€ base64url๋กœ ์ธ์ฝ”๋”ฉ๋œ JSON์ž…๋‹ˆ๋‹ค. JWT๋Š” ์•”ํ˜ธํ™”๋œ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์„œ๋ช…๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค โ€” ๋ˆ„๊ตฌ๋‚˜ ๋””์ฝ”๋”ฉํ•˜์—ฌ ๋‚ด์šฉ์„ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Part 1: Header

ํ—ค๋”์—๋Š” ํ† ํฐ์— ๋Œ€ํ•œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ, ์ฆ‰ ์„œ๋ช… ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ํ† ํฐ ์œ ํ˜•์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

| ํ•„๋“œ | ์„ค๋ช… | ์˜ˆ์‹œ ๊ฐ’ | |-------|-------------|----------------| | alg | ์„œ๋ช… ์•Œ๊ณ ๋ฆฌ์ฆ˜ (ํ•„์ˆ˜) | HS256, RS256, ES256 | | typ | ํ† ํฐ ์œ ํ˜• (์„ ํƒ) | JWT | | kid | ํ‚ค ID (์„ ํƒ) | "key-1" |

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

alg ํ•„๋“œ๋Š” ๊ฒ€์ฆ์ž์—๊ฒŒ ์–ด๋–ค ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ์„œ๋ช…์ด ์ƒ์„ฑ๋˜์—ˆ๋Š”์ง€ ์•Œ๋ ค์ค๋‹ˆ๋‹ค. ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ถˆ์ผ์น˜ ๋˜๋Š” alg: "none"์„ ์ˆ˜๋ฝํ•˜๋Š” ๊ฒƒ์€ ํ”ํ•œ JWT ๋ณด์•ˆ ์ทจ์•ฝ์ ์ž…๋‹ˆ๋‹ค.

Part 2: Payload

ํŽ˜์ด๋กœ๋“œ์—๋Š” ์‚ฌ์šฉ์ž ๋ฐ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ํด๋ ˆ์ž„์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ํด๋ ˆ์ž„์€ ์„ธ ๊ฐ€์ง€ ๋ฒ”์ฃผ๋กœ ๋‚˜๋‰ฉ๋‹ˆ๋‹ค.

๋“ฑ๋ก๋œ ํด๋ ˆ์ž„ (Registered Claims)

| ํด๋ ˆ์ž„ | ์ „์ฒด ์ด๋ฆ„ | ์šฉ๋„ | |-------|-----------|---------| | iss | Issuer | ํ† ํฐ ๋ฐœ๊ธ‰์ž | | sub | Subject | ์‚ฌ์šฉ์ž ์‹๋ณ„ | | aud | Audience | ์˜๋„๋œ ์ˆ˜์‹ ์ž | | exp | Expiration | ํ† ํฐ ๋งŒ๋ฃŒ ํƒ€์ž„์Šคํƒฌํ”„ | | nbf | Not Before | ์ด ์‹œ๊ฐ„ ์ด์ „์—๋Š” ํ† ํฐ ์œ ํšจํ•˜์ง€ ์•Š์Œ | | iat | Issued At | ํ† ํฐ ์ƒ์„ฑ ํƒ€์ž„์Šคํƒฌํ”„ | | jti | JWT ID | ๊ณ ์œ  ํ† ํฐ ์‹๋ณ„์ž |

๋””์ฝ”๋”ฉ๋œ ํŽ˜์ด๋กœ๋“œ ์˜ˆ์‹œ

{
  "sub": "1234567890",
  "name": "John Doe",
  "iat": 1516239022,
  "exp": 1516242622,
  "iss": "https://auth.example.com"
}

๊ณต๊ฐœ ํด๋ ˆ์ž„(Public claims)์€ IANA ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์— ์ •์˜๋˜๊ฑฐ๋‚˜ ์ถฉ๋Œ ๋ฐฉ์ง€ URI๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋น„๊ณต๊ฐœ ํด๋ ˆ์ž„(Private claims)์€ ๋ฐœ๊ธ‰์ž์™€ ์ˆ˜์‹ ์ž ๊ฐ„์— ํ•ฉ์˜๋œ ์‚ฌ์šฉ์ž ์ •์˜ ํด๋ ˆ์ž„์ž…๋‹ˆ๋‹ค.

Part 3: Signature

์„œ๋ช…์€ ์ธ์ฝ”๋”ฉ๋œ ํ—ค๋”, ์ธ์ฝ”๋”ฉ๋œ ํŽ˜์ด๋กœ๋“œ, ๊ทธ๋ฆฌ๊ณ  ํ—ค๋”์— ๋ช…์‹œ๋œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๋น„๋ฐ€ ํ‚ค๋ฅผ ๊ฒฐํ•ฉํ•ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์„œ๋ช…์€ ๋‘ ๊ฐ€์ง€ ๋ชฉ์ ์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค.

  1. ๋ฌด๊ฒฐ์„ฑ โ€” ์„œ๋ช… ํ›„ ํ† ํฐ์ด ์ˆ˜์ •๋˜์ง€ ์•Š์•˜์Œ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  2. ์ธ์ฆ โ€” ํ† ํฐ์ด ์˜ˆ์ƒ๋œ ๋‹น์‚ฌ์ž์— ์˜ํ•ด ์„œ๋ช…๋˜์—ˆ์Œ์„ ์ฆ๋ช…ํ•ฉ๋‹ˆ๋‹ค.

HS256 ์„œ๋ช… ์ƒ์„ฑ

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

RS256 ์„œ๋ช… ์ƒ์„ฑ

RSASHA256(
  base64urlEncode(header) + "." + base64urlEncode(payload),
  privateKey
)

Base64url vs ํ‘œ์ค€ Base64

| ํ•ญ๋ชฉ | ํ‘œ์ค€ Base64 | Base64url | |--------|-----------------|-----------| | 62๋ฒˆ ๋ฌธ์ž | + | - | | 63๋ฒˆ ๋ฌธ์ž | / | _ | | ํŒจ๋”ฉ | = | ์ƒ๋žต |

์ด ์ธ์ฝ”๋”ฉ ๋ฐฉ์‹ ๋•๋ถ„์— JWT๋Š” HTTP ํ—ค๋”, ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ, URL ๊ฒฝ๋กœ์—์„œ ํผ์„ผํŠธ ์ธ์ฝ”๋”ฉ ์—†์ด ์•ˆ์ „ํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

JWT ์ƒ์„ฑ ์ „์ฒด ๊ณผ์ •

  1. ํ—ค๋” JSON์„ ์ƒ์„ฑํ•˜๊ณ  base64url๋กœ ์ธ์ฝ”๋”ฉํ•ฉ๋‹ˆ๋‹ค.
  2. ํŽ˜์ด๋กœ๋“œ JSON์„ ์ƒ์„ฑํ•˜๊ณ  base64url๋กœ ์ธ์ฝ”๋”ฉํ•ฉ๋‹ˆ๋‹ค.
  3. . ๊ตฌ๋ถ„์ž๋กœ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.
  4. ์„ ํƒํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ๋น„๋ฐ€ ํ‚ค๋กœ ์„œ๋ช…ํ•ฉ๋‹ˆ๋‹ค.
  5. ์„œ๋ช…์„ base64url๋กœ ์ธ์ฝ”๋”ฉํ•ฉ๋‹ˆ๋‹ค.
  6. ์„ธ ๋ถ€๋ถ„์„ . ๊ตฌ๋ถ„์ž๋กœ ๋ชจ๋‘ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

๋ณด์•ˆ ๊ณ ๋ ค ์‚ฌํ•ญ

  • ํŽ˜์ด๋กœ๋“œ์— ๋น„๋ฐ€ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜์ง€ ๋งˆ์„ธ์š”. ํŽ˜์ด๋กœ๋“œ๋Š” ์•”ํ˜ธํ™”๋œ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ธ์ฝ”๋”ฉ๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • ํ•ญ์ƒ ์„œ๋ช…์„ ๊ฒ€์ฆํ•˜์„ธ์š”. ๊ฒ€์ฆ ์—†์ด๋Š” ๋ˆ„๊ตฌ๋‚˜ ํ† ํฐ์„ ์œ„์กฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • alg ํ—ค๋”๋ฅผ ํ™•์ธํ•˜์„ธ์š”. alg: "none" ๋ฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋‹ค์šด๊ทธ๋ ˆ์ด๋“œ ์‹œ๋„๋ฅผ ๊ฑฐ๋ถ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์งง์€ ๋งŒ๋ฃŒ ์‹œ๊ฐ„์„ ์„ค์ •ํ•˜์„ธ์š”. exp ํด๋ ˆ์ž„์„ ๋ช‡ ๋‹ฌ์ด ์•„๋‹Œ ๋ถ„ ๋˜๋Š” ์‹œ๊ฐ„ ๋‹จ์œ„๋กœ ์‚ฌ์šฉํ•˜์„ธ์š”.

์˜จ๋ผ์ธ์œผ๋กœ JWT ํ† ํฐ ๋””์ฝ”๋”ฉํ•˜๊ธฐ

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

JWT ํ† ํฐ ๊ตฌ์กฐ ์„ค๋ช…: Header, Payload, Signature - CoolTool