๐ฆ Spring/๐๏ธ ์ธ์ฆ&์ธ๊ฐ
[Spring] ์ธ์
๊ธฐ๋ฐ ์ธ์ฆ๊ณผ ๋ค๋ฅธ JWT์ ๋์ ์๋ฆฌ
by ์๋ค์ค๋ฆฌ
2025. 9. 22.
๐ JWT(Json Web Token) ํน์ง๊ณผ ์ฃผ์ ์ฌํญ
JWT(Json Web Token)๋ JSON ํ์์ ๊ธฐ๋ฐ์ผ๋ก ์์ ํ๊ฒ ์ ์กํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ ํด๋ ์ ๊ธฐ๋ฐ ํ ํฐ์ด๋ค.
์ฃผ๋ก ์ธ์ฆ(Authentication)๊ณผ ์ธ๊ฐ(Authorization) ๊ณผ์ ์์ ํ์ฉ๋๋ฉฐ, ์๋ฒ๊ฐ ์ํ๋ฅผ ์ ์ฅํ์ง ์๋ Stateless ์ธ์ฆ ๋ฐฉ์์ ์ ๊ณตํ๋ค.
๊ตฌ์กฐ๋ Header, Payload, Signature ์ธ ๋ถ๋ถ์ผ๋ก ๋๋๋ฉฐ, ์๋ช
(Signature)์ ํตํด ๋ณ์กฐ ์ฌ๋ถ๋ฅผ ๊ฒ์ฆํ ์ ์๋ค.
โ
์ฃผ์ ๊ฐ๋
์ ๋ฆฌ
| ๊ตฌ๋ถ |
์ค๋ช
|
| Header |
ํ ํฐ์ ํ์
(JWT)๊ณผ ํด์ฑ ์๊ณ ๋ฆฌ์ฆ(HS256, RS256 ๋ฑ)์ ๋ช
์ |
| Payload |
์ฌ์ฉ์ ์ ๋ณด, ๊ถํ, ๋ง๋ฃ ์๊ฐ(exp) ๋ฑ ํด๋ ์(Claims) ํฌํจ |
| Signature |
Header + Payload๋ฅผ ๋น๋ฐํค๋ก ์๋ช
ํ์ฌ ๋ณ์กฐ ์ฌ๋ถ ๊ฒ์ฆ |
| ํด๋ ์(Claims) |
ํ ํฐ์ ๋ด๊ธด ์ ๋ณด ๋จ์. ๋ฑ๋ก๋ ํด๋ ์(iss, sub, exp ๋ฑ)๊ณผ ์ปค์คํ
ํด๋ ์์ผ๋ก ๊ตฌ๋ถ |
๐ก JWT ํน์ง
1. Stateless ์ธ์ฆ
- ์๋ฒ๊ฐ ์ธ์
์ ์ ์ฅํ์ง ์์ผ๋ฏ๋ก ํ์ฅ์ฑ๊ณผ ์๋ฒ ์ด์คํ ํ๊ฒฝ์ ์ ํฉ
- ์ธ์
๋ถ์ผ์น ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์๋๋ค.
2. ์์ฒด ํฌํจ (Self-contained)
- ํ ํฐ์ ํ์ํ ์ ๋ณด(์ฌ์ฉ์, ๊ถํ ๋ฑ)๋ฅผ ํฌํจํ๊ณ ์์ด DB ์กฐํ ์์ด ์ธ๊ฐ ๊ฐ๋ฅ
3. ๊ตฌ์กฐ์ ๋จ์์ฑ
- Base64URL ์ธ์ฝ๋ฉ ๋ ๋ฌธ์์ด๋ก, HTTP ํค๋๋ URL ์ฟผ๋ฆฌ์คํธ๋ง์ ์ฝ๊ฒ ๋ด์ ์ ์ก ๊ฐ๋ฅ
4. ๋ฒ์ฉ์ฑ
- OAuth2, OpenID Connect ๋ฑ ๋ค์ํ ์ธ์ฆ ํ์ค์์ ํ์ฉ
โ ๏ธ JWT ์ฌ์ฉ ์ ์ฃผ์ ์ฌํญ
| ํญ๋ชฉ |
์ค๋ช
|
| ๋ฏผ๊ฐ ์ ๋ณด ์ ์ฅ ๊ธ์ง |
Payload๋ Base64 ๋์ฝ๋ฉ์ผ๋ก ๋๊ตฌ๋ ๋ณผ ์ ์์ผ๋ฏ๋ก ๋น๋ฐ๋ฒํธ, ์ฃผ๋ฏผ๋ฒํธ ๋ฑ ๋ฏผ๊ฐํ ์ ๋ณด๋ ๋ด์ง ์์์ผ ํ๋ค. |
| ์ํฌ๋ฆฟ ํค ๊ด๋ฆฌ |
์ถฉ๋ถํ ๋ณต์กํ ํค๋ฅผ ์ฌ์ฉํ๊ณ , ์์ ํ ํค ๊ด๋ฆฌ ์ ๋ต(KMS, Vault ๋ฑ)์ ์ ์ฉํด์ผ ํ๋ค. |
| ํ ํฐ ํ์ทจ ์ํ |
XSS, CSRF, ๋ก์ปฌ ์คํ ๋ฆฌ์ง ์ ์ฅ ์ ํ์ทจ ์ํ → HttpOnly Cookie, Refresh Token Rotation ๊ณ ๋ ค |
| ๋ง๋ฃ ์๊ฐ ์ค์ |
ํ ํฐ์ด ๋๋ฌด ๋นจ๋ฆฌ ๋ง๋ฃ๋๋ฉด UX ์ ํ, ๋๋ฌด ๊ธธ๋ฉด ๋ณด์ ์ทจ์ฝ → Sliding Session ์ ๋ต ํ์ฉ ๊ฐ๋ฅ |
| None ์๊ณ ๋ฆฌ์ฆ ๊ณต๊ฒฉ |
alg:none ์ทจ์ฝ์ ์
์ฉ ๋ฐฉ์ง → ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ ํ ์ ๊ฒ์ฆ ํ์ |
| ํ ํฐ ํฌ๊ธฐ ๋ฌธ์ |
JWT๋ ๊ธธ์ด๊ฐ ๊ธธ์ด์ง ์ ์์ด ๋คํธ์ํฌ ๋น์ฉ ์ฆ๊ฐ → ๋ถํ์ํ ๋ฐ์ดํฐ๋ ์ต์ํ |
| Revocation ๋ถ๊ฐ |
ํ ๋ฒ ๋ฐ๊ธ๋ ํ ํฐ์ ๋ง๋ฃ ์ ๊น์ง ๋ฌดํจํ ์ด๋ ต๊ธฐ ๋๋ฌธ์, ๋ธ๋๋ฆฌ์คํธ/ํ์ดํธ๋ฆฌ์คํธ๋ Redis ์บ์ ํ์ฉ ํ์ |
๐งช ์์ (JWT ๊ตฌ์กฐ)
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 // Header
.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkhvbmcgR2lsZG9uZyIsImlhdCI6MTUxNjIzOTAyMn0 // Payload
.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c // Signature
๐ง ์์ฝ
- JWT๋ ํด๋ ์ ๊ธฐ๋ฐ ํ ํฐ์ผ๋ก ์ธ์ฆ/์ธ๊ฐ์ ๋๋ฆฌ ์ฌ์ฉ
- ์ฅ์ : Stateless, ์์ฒด ํฌํจ, ํ์ฅ์ฑ
- ๋จ์ : ํ์ทจ ์ํ, ๋ฏผ๊ฐ ์ ๋ณด ์ ์ฅ ๋ถ๊ฐ, ๋ง๋ฃ ์ ๊ฐ์ ํ๊ธฐ ์ด๋ ค์
- ๋ณด์ ๊ฐํ๋ฅผ ์ํด ์งง์ Access Token + Refresh Token + ์์ ํ ํค ๊ด๋ฆฌ ์ ๋ต์ด ํ์