JWT ์๋ช ๊ฒ์ฆ ๋ฐฉ๋ฒ: HS256, RS256, ES256
JWT ์๋ช ๊ฒ์ฆ ๋ฐฉ๋ฒ
JWT๋ ํด๋ ์์ ํ๋ฌธ์ผ๋ก ์ ๋ฌํฉ๋๋ค. ์์กฐ๋ฅผ ๋ง๋ ์ ์ผํ ์๋จ์ ์๋ช ์ ๋๋ค. ๊ฒ์ฆ ์์ด๋ ๊ณต๊ฒฉ์๊ฐ ์์์ ํ ํฐ์ ๋ง๋ค์ด ์ด๋ค ์ฌ์ฉ์๋ก๋ ๊ฐ์ฅํ ์ ์์ต๋๋ค. ์ด ๊ฐ์ด๋์์๋ ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ์ธ ๊ฐ์ง JWT ์๋ช ์๊ณ ๋ฆฌ์ฆ๊ณผ ๊ฐ๊ฐ์ ๊ฒ์ฆ ๋ฐฉ๋ฒ์ ๋ค๋ฃน๋๋ค.
๊ฒ์ฆ ํ๋ก์ธ์ค
์๊ณ ๋ฆฌ์ฆ๊ณผ ๊ด๊ณ์์ด JWT ์๋ช ๊ฒ์ฆ์ ๋์ผํ ๋จ๊ณ๋ฅผ ๋ฐ๋ฆ ๋๋ค.
- ํ ํฐ์
.์ผ๋ก ๋ถํ ํ์ฌ ํค๋, ํ์ด๋ก๋, ์๋ช ์ ์ถ์ถํฉ๋๋ค. - ํค๋๋ฅผ base64url ๋์ฝ๋ฉํ์ฌ
algํ๋๋ฅผ ์ฝ์ต๋๋ค. - ์๊ณ ๋ฆฌ์ฆ๊ณผ ํค๋ฅผ ์ฌ์ฉํ์ฌ ํค๋์ ํ์ด๋ก๋๋ก๋ถํฐ ์๋ช ์ ๋ค์ ๊ณ์ฐํฉ๋๋ค.
- ๋ค์ ๊ณ์ฐํ ์๋ช ๊ณผ ํ ํฐ์ ์๋ช ์ ๋น๊ตํฉ๋๋ค.
- ์ผ์นํ๋ฉด ํ ํฐ์ด ์ธ์ฆ๋ ๊ฒ์ ๋๋ค.
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 ๋์ฝ๋ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋ชจ๋ ํ ํฐ์ ๋์ฝ๋ฉํ๊ณ ๊ฒ์ฆํ์ธ์. ํ ํฐ์ ๋ถ์ฌ๋ฃ๊ณ ํค๋์ ํ์ด๋ก๋๋ฅผ ํ์ธํ ๋ค์, ์ ์ ํ ๋น๋ฐ ํค ๋๋ ๊ณต๊ฐ ํค๋ฅผ ์ ๊ณตํ์ฌ ์๋ช ์ ๊ฒ์ฆํ์ธ์. ๋ชจ๋ ์ฒ๋ฆฌ๋ ๋ธ๋ผ์ฐ์ ์์ ์ด๋ฃจ์ด์ง๋๋ค.