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

JWT ์„œ๋ช… ๊ฒ€์ฆ ๋ฐฉ๋ฒ•: HS256, RS256, ES256

ยท ํƒœ๊ทธ: jwt-verification, jwt-signature, hs256, rs256, token-validation

JWT ์„œ๋ช… ๊ฒ€์ฆ ๋ฐฉ๋ฒ•

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

๊ฒ€์ฆ ํ”„๋กœ์„ธ์Šค

์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ๊ด€๊ณ„์—†์ด JWT ์„œ๋ช… ๊ฒ€์ฆ์€ ๋™์ผํ•œ ๋‹จ๊ณ„๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.

  1. ํ† ํฐ์„ .์œผ๋กœ ๋ถ„ํ• ํ•˜์—ฌ ํ—ค๋”, ํŽ˜์ด๋กœ๋“œ, ์„œ๋ช…์„ ์ถ”์ถœํ•ฉ๋‹ˆ๋‹ค.
  2. ํ—ค๋”๋ฅผ base64url ๋””์ฝ”๋”ฉํ•˜์—ฌ alg ํ•„๋“œ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.
  3. ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ—ค๋”์™€ ํŽ˜์ด๋กœ๋“œ๋กœ๋ถ€ํ„ฐ ์„œ๋ช…์„ ๋‹ค์‹œ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.
  4. ๋‹ค์‹œ ๊ณ„์‚ฐํ•œ ์„œ๋ช…๊ณผ ํ† ํฐ์˜ ์„œ๋ช…์„ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค.
  5. ์ผ์น˜ํ•˜๋ฉด ํ† ํฐ์ด ์ธ์ฆ๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

HS256 (HMAC-SHA256)

HS256์€ ๋Œ€์นญ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ž…๋‹ˆ๋‹ค โ€” ๋™์ผํ•œ ๋น„๋ฐ€ ํ‚ค๋กœ ์„œ๋ช…์„ ์ƒ์„ฑํ•˜๊ณ  ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค.

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

๊ฒ€์ฆํ•˜๋ ค๋ฉด ๊ณต์œ  ๋น„๋ฐ€ ํ‚ค๋กœ HMAC์„ ๋‹ค์‹œ ๊ณ„์‚ฐํ•˜์—ฌ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค.

Token:   header.payload.sig
Secret:  "my-shared-secret"

1. ๊ณ„์‚ฐ: HMACSHA256("header.payload", "my-shared-secret")
2. ๋น„๊ต: computedSignature === sig

๋ณด์•ˆ ๊ณ ๋ ค ์‚ฌํ•ญ: ๋น„๋ฐ€ ํ‚ค๋Š” ๊ธฐ๋ฐ€๋กœ ์œ ์ง€๋˜์–ด์•ผ ํ•˜๋ฉฐ, ์ฃผ๊ธฐ์ ์œผ๋กœ ๊ต์ฒดํ•˜๊ณ , ์ตœ์†Œ 256๋น„ํŠธ์˜ ์—”ํŠธ๋กœํ”ผ๋ฅผ ๊ฐ€์ ธ์•ผ ํ•ฉ๋‹ˆ๋‹ค. HS256์€ ์—ฌ๋Ÿฌ ์„œ๋น„์Šค๊ฐ€ ๊ณต์œ  ๋น„๋ฐ€ ํ‚ค๋ฅผ ํ•„์š”๋กœ ํ•˜๋Š” ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ์•„ํ‚คํ…์ฒ˜์—๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

RS256 (RSA-SHA256)

RS256์€ ๋น„๋Œ€์นญ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ž…๋‹ˆ๋‹ค. ๋ฐœ๊ธ‰์ž๋Š” ๊ฐœ์ธ ํ‚ค๋กœ ์„œ๋ช…ํ•˜๊ณ , ๊ฒ€์ฆ์ž๋Š” ํ•ด๋‹น ๊ณต๊ฐœ ํ‚ค๋กœ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

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

๊ฒ€์ฆํ•˜๋ ค๋ฉด ๊ณต๊ฐœ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

Token:   header.payload.sig
Public:  "-----BEGIN PUBLIC KEY-----..."

1. RSA ๊ณต๊ฐœ ํ‚ค ๋กœ๋“œ
2. ๊ฒ€์ฆ: RSA_SHA256_verify("header.payload", sig, publicKey)

์žฅ์ : ์„œ๋ช… ํ‚ค์™€ ๊ฒ€์ฆ ํ‚ค๊ฐ€ ๋ถ„๋ฆฌ๋ฉ๋‹ˆ๋‹ค. ์–ด๋–ค ์„œ๋น„์Šค๋“  ๋น„๋ฐ€ ์ •๋ณด๋ฅผ ๋ณด์œ ํ•˜์ง€ ์•Š๊ณ ๋„ ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ณต๊ฐœ ํ‚ค๋Š” JWKS ์—”๋“œํฌ์ธํŠธ์—์„œ ์ œ๊ณต๋˜์–ด ์‰ฝ๊ฒŒ ๊ต์ฒดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ES256 (ECDSA-SHA256)

ES256์€ P-256 ๊ณก์„ ์„ ์‚ฌ์šฉํ•˜๋Š” ECDSA์ž…๋‹ˆ๋‹ค. RS256๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋น„๋Œ€์นญ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ž…๋‹ˆ๋‹ค.

signature = ECDSA_SHA256(
  base64urlEncode(header) + "." + base64urlEncode(payload),
  privateKey
)

๊ฒ€์ฆ์—๋Š” ECDSA P-256 ๊ณต๊ฐœ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ES256์€ ํ›จ์”ฌ ์ž‘์€ ์„œ๋ช…(64๋ฐ”์ดํŠธ vs RSA-2048์˜ 256๋ฐ”์ดํŠธ)์„ ์ƒ์„ฑํ•˜๋ฉฐ ๋” ๋น ๋ฅธ ๊ฒ€์ฆ ์†๋„๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋น„๊ต

| ์†์„ฑ | HS256 | RS256 | ES256 | |----------|-------|-------|-------| | ํ‚ค ์œ ํ˜• | ๋Œ€์นญ (๊ณต์œ  ๋น„๋ฐ€ ํ‚ค) | ๋น„๋Œ€์นญ (RSA ํ‚ค ์Œ) | ๋น„๋Œ€์นญ (EC ํ‚ค ์Œ) | | ์„œ๋ช… ํฌ๊ธฐ | 32๋ฐ”์ดํŠธ | 256๋ฐ”์ดํŠธ | 64๋ฐ”์ดํŠธ | | ํ‚ค ๋ฐฐํฌ | ๋น„๋ฐ€๋ฆฌ์— ๊ณต์œ  | ๊ณต๊ฐœ ํ‚ค๋Š” ๊ณต๊ฐœ๋จ | ๊ณต๊ฐœ ํ‚ค๋Š” ๊ณต๊ฐœ๋จ | | ํ‚ค ๊ต์ฒด | ๋ณดํ†ต | ์‰ฌ์›€ (JWKS) | ์‰ฌ์›€ (JWKS) | | ์‚ฌ์šฉ ์‚ฌ๋ก€ | ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ๋‚ด๋ถ€ ์‹œ์Šคํ…œ | ๋ถ„์‚ฐ API | ๋ชจ๋ฐ”์ผ, IoT |

ํ”ํ•œ ๊ฒ€์ฆ ์‹ค์ˆ˜

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

์˜จ๋ผ์ธ์œผ๋กœ JWT ํ† ํฐ ๊ฒ€์ฆํ•˜๊ธฐ

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

JWT ์„œ๋ช… ๊ฒ€์ฆ ๋ฐฉ๋ฒ•: HS256, RS256, ES256 - CoolTool