JWT๋ ๋ฌด์์ธ๊ฐ์? JSON Web Token ์๋ฒฝ ๊ฐ์ด๋
JWT๋ ๋ฌด์์ธ๊ฐ์?
JSON Web Token(JWT)์ ๋น์ฌ์ ๊ฐ์ ์ ๋ณด๋ฅผ JSON ๊ฐ์ฒด๋ก ์์ ํ๊ฒ ์ ์กํ๊ธฐ ์ํ ๊ฐ๊ฒฐํ๊ณ ์์ฒด ํฌํจ๋ ๋ฐฉ์์ ์ ์ํ๋ ๊ฐ๋ฐฉํ ํ์ค(RFC 7519)์ ๋๋ค. JWT๋ ์ฌ์ฉ์ ์ธ์ฆ ๋ฐ API ๊ถํ ๋ถ์ฌ๋ถํฐ ๋ง์ดํฌ๋ก์๋น์ค ๊ฐ ์์ ํ ๋ฐ์ดํฐ ๊ตํ์ ์ด๋ฅด๊ธฐ๊น์ง ํ๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ง๋ฐฐ์ ์ธ ํ ํฐ ํ์์ ๋๋ค.
JWT ์ธ์ฆ ์๋ ๋ฐฉ์
JWT ์ธ์ฆ์ ์๋ฒ ์ธก ์ธ์ ์ ์ฅ์๊ฐ ํ์ ์๋ ๋ฌด์ํ(stateless) ํจํด์ ๋ฐ๋ฆ ๋๋ค. ์ด ํ๋ฆ์ ์ดํดํ๋ ๊ฒ์ด JWT๊ฐ ํ๋ API ๋ณด์์ ๊ธฐ๋ณธ ์ ํ์ด ๋ ์ด์ ๋ฅผ ์ดํดํ๋ ํต์ฌ์ ๋๋ค.
์ธ์ฆ ํ๋ฆ
- ์ฌ์ฉ์ ๋ก๊ทธ์ธ โ ํด๋ผ์ด์ธํธ๊ฐ ์ธ์ฆ ์๋ฒ์ ์๊ฒฉ ์ฆ๋ช (์ฌ์ฉ์ ์ด๋ฆ ๋ฐ ๋น๋ฐ๋ฒํธ)์ ์ ์กํฉ๋๋ค.
- ์๋ฒ๊ฐ JWT ์์ฑ โ ์๋ฒ๊ฐ ์๊ฒฉ ์ฆ๋ช ์ ๊ฒ์ฆํ๊ณ , ์ฌ์ฉ์์ ์ ์๊ณผ ๊ถํ์ ํฌํจํ JWT๋ฅผ ์์ฑํ์ฌ ๋น๋ฐ ํค ๋๋ ๊ฐ์ธ ํค๋ก ์๋ช ํ ํ ํด๋ผ์ด์ธํธ์ ๋ฐํํฉ๋๋ค.
- ํด๋ผ์ด์ธํธ๊ฐ ํ ํฐ ์ ์ฅ โ ํด๋ผ์ด์ธํธ๊ฐ ์ผ๋ฐ์ ์ผ๋ก localStorage, sessionStorage ๋๋ HTTP-only ์ฟ ํค์ JWT๋ฅผ ์ ์ฅํฉ๋๋ค.
- ํด๋ผ์ด์ธํธ๊ฐ ๊ฐ ์์ฒญ์ ํ ํฐ ํฌํจ โ ์ดํ ๋ชจ๋ API ์์ฒญ์ ๋ํด ํด๋ผ์ด์ธํธ๋ Bearer ์คํด์ ์ฌ์ฉํ์ฌ
Authorizationํค๋์ JWT๋ฅผ ํฌํจํฉ๋๋ค:Authorization: Bearer <token>. - ์๋ฒ๊ฐ ํ ํฐ ๊ฒ์ฆ โ ์๋ฒ๊ฐ JWT ์๋ช ์ ๊ฒ์ฆํ๊ณ , ๋ง๋ฃ ์๊ฐ์ ํ์ธํ๊ณ , ์ฌ์ฉ์ ํด๋ ์์ ์ถ์ถํ์ฌ ์์ฒญ์ ์น์ธํฉ๋๋ค.
- ์ธ์ ์กฐํ ๋ถํ์ โ JWT์ ํ์ํ ๋ชจ๋ ์ ๋ณด๊ฐ ํฌํจ๋์ด ์์ผ๋ฏ๋ก, ์๋ฒ๋ ์ฌ์ฉ์๋ฅผ ์๋ณํ๊ธฐ ์ํด ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ์บ์๋ฅผ ์กฐํํ ํ์๊ฐ ์์ต๋๋ค.
์ด๊ฒ์ด ์ค์ํ ์ด์
์ ํต์ ์ธ ์ธ์ ๊ธฐ๋ฐ ์ธ์ฆ์ ์ธ์ ID๋ฅผ ์๋ฒ์ ๋ฉ๋ชจ๋ฆฌ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅํฉ๋๋ค. ์ธ์ฆ๋ ๊ฐ ์์ฒญ๋ง๋ค ์กฐํ๊ฐ ํ์ํฉ๋๋ค. JWT๋ ์ด ์กฐํ๋ฅผ ์ ๊ฑฐํฉ๋๋ค โ ํ ํฐ ์์ฒด๊ฐ ์ฌ์ฉ์์ ์ ์์ ์ฆ๋ช ํฉ๋๋ค. ์ด๋ก ์ธํด JWT ๊ธฐ๋ฐ ์์คํ ์ ํด๋ฌ์คํฐ์ ์ด๋ค ์๋ฒ๋ ๊ณต์ ์ธ์ ์ํ ์์ด ํ ํฐ์ ๊ฒ์ฆํ ์ ์์ผ๋ฏ๋ก ๋ณธ์ง์ ์ผ๋ก ํ์ฅ์ฑ์ด ๋ฐ์ด๋ฉ๋๋ค.
JWT vs ์ธ์ ๊ธฐ๋ฐ ์ธ์ฆ
| ํญ๋ชฉ | JWT ์ธ์ฆ | ์ธ์ ๊ธฐ๋ฐ ์ธ์ฆ | |--------|--------------------|------------------------------| | ์ ์ฅ ์์น | ํด๋ผ์ด์ธํธ ์ธก (ํ ํฐ ๋ด) | ์๋ฒ ์ธก (๋ฉ๋ชจ๋ฆฌ ๋๋ DB) | | ํ์ฅ์ฑ | ๊ณต์ ์ธ์ ์ ์ฅ์ ๋ถํ์ | ์ธ์คํด์ค ๊ฐ ๊ณต์ ์ธ์ ์ ์ฅ์ ํ์ | | ๋๋ฉ์ธ ๊ฐ | ๋๋ฉ์ธ ๊ฐ ์์ฐ์ค๋ฝ๊ฒ ์๋ | ์ธ์ ๊ณต์ ๊ฐ ์ด๋ ค์ | | ๋ชจ๋ฐ์ผ ์นํ์ฑ | ์ (์ฟ ํค ๋ถํ์) | ์ฟ ํค ์ง์ ํ์ | | ์ทจ์ | ์ด๋ ค์ (ํ ํฐ ๋ง๋ฃ ์ ๊น์ง) | ์ฌ์ (์ ์ฅ์์์ ์ธ์ ์ญ์ ) | | ํ์ด๋ก๋ ํฌ๊ธฐ | ์์ฒญ๋น ๋ ํผ (ํค๋์ ํ ํฐ ํฌํจ) | ์ต์ (์ธ์ ID๋ง) |
JWT๊ฐ API ๋ณด์์ ์ฌ์ฉ๋๋ ์ด์
JWT๋ฅผ ์ธ์ฆ์ ์ ํฉํ๊ฒ ๋ง๋๋ ํน์ฑ์ API ๋ณด์์๋ ์ด์์ ์ ๋๋ค.
๋ฌด์ํ ๋ฐ ํ์ฅ์ฑ
๋ชจ๋ JWT๋ ์๋ฒ๊ฐ ์์ฒญ์ ์น์ธํ๋ ๋ฐ ํ์ํ ๋ชจ๋ ์ ๋ณด๋ฅผ ํฌํจํฉ๋๋ค. ์กฐํํ ์ธ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋, ํ์ธํ ์บ์๋, ์๋ฒ ๊ฐ ๋๊ธฐํํ ์ํ๋ ์์ต๋๋ค. ๋ก๋ ๋ฐธ๋ฐ์๋ ์กฐ์ ์์ด ์ด๋ค ์๋ฒ ์ธ์คํด์ค๋ก๋ ์์ฒญ์ ๋ผ์ฐํ ํ ์ ์์ต๋๋ค.
๋๋ฉ์ธ ๊ฐ ๋ฐ ์ถ์ฒ ๊ฐ
JWT๋ ์๋ก ๋ค๋ฅธ ๋๋ฉ์ธ๊ณผ ์ถ์ฒ ๊ฐ์ ์์ฐ์ค๋ฝ๊ฒ ์๋ํฉ๋๋ค. auth.example.com์์ ๋ฐ๊ธ๋ ํ ํฐ์ api.example.com ๋ฐ admin.example.com์ ์ก์ธ์คํ๋ ๋ฐ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด๋ JWT๊ฐ ์ฑ๊ธ ์ฌ์ธ์จ(SSO) ์์คํ
์ ๊ธฐ๋ฐ์ด ๋๋ ์ด์ ์
๋๋ค.
์ธ๋ถํ๋ ๊ถํ ๋ถ์ฌ
JWT ํ์ด๋ก๋์๋ ์ญํ , ๊ถํ, ์กฐ์ง ๋ฉค๋ฒ์ญ์ ๋ํ ์ฌ์ฉ์ ์ ์ ํด๋ ์์ด ํฌํจ๋ ์ ์์ต๋๋ค.
{
"sub": "user_abc123",
"role": "admin",
"permissions": ["read:users", "write:users", "delete:users"],
"org_id": "org_xyz789",
"iat": 1516239022,
"exp": 1516325422
}
API ์๋ฒ๋ ์ถ๊ฐ ์กฐํ ์์ด ํ ํฐ์์ ์ง์ ์ด๋ฌํ ํด๋ ์์ ์ฝ์ต๋๋ค.
์ฑ๊ธ ์ฌ์ธ์จ(SSO)์ ์ํ JWT
์ฑ๊ธ ์ฌ์ธ์จ์ ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ JWT ์ฌ์ฉ ์ฌ๋ก ์ค ํ๋์ ๋๋ค. ์ผ๋ฐ์ ์ธ SSO ์ํคํ ์ฒ์์:
- ์ฌ์ฉ์๊ฐ Auth0, Okta, Keycloak๊ณผ ๊ฐ์ ID ๊ณต๊ธ์(IdP)์ ๋ก๊ทธ์ธํฉ๋๋ค.
- IdP๊ฐ ๊ฐ์ธ ํค๋ก ์๋ช ๋ JWT๋ฅผ ๋ฐ๊ธํฉ๋๋ค.
- ์ฌ์ฉ์๊ฐ ์ด JWT๋ฅผ ์ฌ๋ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ํฉ๋๋ค.
- ๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ด IdP์ ๊ณต๊ฐ ํค๋ฅผ ์ฌ์ฉํ์ฌ ์๋ช ์ ๊ฒ์ฆํฉ๋๋ค.
- ๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋งค ์์ฒญ๋ง๋ค IdP์ ํต์ ํ์ง ์๊ณ ํ ํฐ์ ์ ๋ขฐํฉ๋๋ค.
์ด ํจํด์ ํตํด ํ ๋ฒ์ ๋ก๊ทธ์ธ์ผ๋ก ์ด๋ฉ์ผ, ํ์ผ ์ ์ฅ์, ํ๋ก์ ํธ ๊ด๋ฆฌ, HR ์์คํ ๋ฑ ์์ญ ๊ฐ์ ์๋น์ค์ ์ก์ธ์คํ ์ ์์ผ๋ฉฐ, ๊ฐ ์๋น์ค๊ฐ ์์ฒด ๋ก๊ทธ์ธ ํ๋ฆ์ ๊ตฌํํ ํ์๊ฐ ์์ต๋๋ค.
JWT ๋ณด์ ๋ชจ๋ฒ ์ฌ๋ก
JWT๋ API ๋ณด์์ ์ํ ๊ฐ๋ ฅํ ๊ธฐ๋ฐ์ ์ ๊ณตํ์ง๋ง, ์ฌ๋ฐ๋ฅธ ๊ตฌํ์ด ํ์์ ์ ๋๋ค.
ํ ํฐ์ ์งง์ ์๋ช ์ผ๋ก ์ ์ง
์ก์ธ์ค ํ ํฐ์ exp(๋ง๋ฃ) ํด๋ ์์ 15๋ถ์์ 1์๊ฐ ์ฌ์ด์ ์งง์ ๊ธฐ๊ฐ์ผ๋ก ์ค์ ํ์ธ์. ๋ ๊ธด ์๋ช
์ ๋ฆฌํ๋ ์ ํ ํฐ(์์ผ ๋๋ ์์ฃผ)์ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์๊ฐ ์ฌ์ธ์ฆํ์ง ์๊ณ ๋ ์๋ก์ด ์ก์ธ์ค ํ ํฐ์ ์ป์ ์ ์๋๋ก ํ์ธ์.
ํญ์ HTTPS ์ฌ์ฉ
JWT๋ ํ์ด๋ก๋๋ฅผ ์ํธํํ์ง ์์ต๋๋ค. ํ ํฐ์ ๊ฐ๋ก์ฑ ์ฌ๋์ ๋๊ตฌ๋ ๋์ฝ๋ฉํ์ฌ ๋ด์ฉ์ ์ฝ์ ์ ์์ต๋๋ค. ๊ฐ๋ก์ฑ๊ธฐ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ํญ์ HTTPS๋ฅผ ํตํด JWT๋ฅผ ์ ์กํ์ธ์.
๋ชจ๋ ๊ฒ์ ๊ฒ์ฆ
ํญ์ ์๋ช
์ ๊ฒ์ฆํ๊ณ , ํ ํฐ์ด ๋ง๋ฃ๋์ง ์์๋์ง ํ์ธํ๊ณ , aud(audience)๊ฐ ์ ํ๋ฆฌ์ผ์ด์
๊ณผ ์ผ์นํ๋์ง ํ์ธํ๊ณ , ์์์น ๋ชปํ ์๊ณ ๋ฆฌ์ฆ์ ํ ํฐ์ ๊ฑฐ๋ถํ์ธ์.
ํ ํฐ์ ์์ ํ๊ฒ ์ ์ฅ
ํด๋ผ์ด์ธํธ ์ธก์์๋ ๊ฐ๋ฅํ ๊ฒฝ์ฐ HTTP-only ์ฟ ํค์, ๋๋ ์ฑ๊ธ ํ์ด์ง ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฒฝ์ฐ ๋ฉ๋ชจ๋ฆฌ์ JWT๋ฅผ ์ ์ฅํ์ธ์. ๋ฏผ๊ฐํ ๋ฐ์ดํฐ์ ๋ํ ์ก์ธ์ค๋ฅผ ์ ๊ณตํ๋ ํ ํฐ์ localStorage์ ์ ์ฅํ์ง ๋ง์ธ์.
ํํ JWT ์คํด
"JWT๋ ์ํธํ๋์ด ์๋ค." โ ์๋๋๋ค. JWT๋ ์ํธํ๋ ๊ฒ์ด ์๋๋ผ ์๋ช ๋ ๊ฒ์ ๋๋ค. ํ์ด๋ก๋๋ base64url๋ก ์ธ์ฝ๋ฉ๋์ด ์์ผ๋ฉฐ, ์ด๋ ๋๋๋ฆด ์ ์์ต๋๋ค. JWE(JSON Web Encryption)๋ ์ํธํ๋ฅผ ์ ๊ณตํ์ง๋ง, ํ์ค JWT์๋ ๋ณ๊ฐ์ ์ฌ์์ ๋๋ค.
"JWT๋ CSRF๋ฅผ ๋ฐฉ์งํ๋ค." โ ๊ทธ ์์ฒด๋ก๋ ์๋๋๋ค. Authorization ํค๋์ ํฌํจ๋ JWT๋ ๋์์ด ๋์ง๋ง, ํ ํฐ์ด ์ฟ ํค์ ์๋ ๊ฒฝ์ฐ CSRF ๋ณดํธ๊ฐ ์ฌ์ ํ ํ์ํฉ๋๋ค.
"JWT๋ ์ธ์ฆ ์ ์ฉ์ด๋ค." โ JWT๋ ์ธ์ฆ๋ฟ๋ง ์๋๋ผ ๊ถํ ๋ถ์ฌ ๋ฐ์ดํฐ ๊ตํ, ๋ฌด์ํ ์ธ์ , ์๋น์ค ๊ฐ ์์ ํ ์ ๋ณด ๊ณต์ ์๋ ์ฌ์ฉ๋ฉ๋๋ค.
์จ๋ผ์ธ์ผ๋ก JWT ๋์ฝ๋ฉ ๋ฐ ํ์ํ๊ธฐ
JWT ๋์ฝ๋ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋ชจ๋ JSON Web Token์ ๊ฒ์ฌํ์ธ์. ํ ํฐ์ ๋ถ์ฌ๋ฃ๊ณ ๋์ฝ๋ฉ๋ ํค๋, ํ์ด๋ก๋, ์๋ช ์๊ณ ๋ฆฌ์ฆ์ ์ฆ์ ํ์ธํ์ธ์. ์ด ๋๊ตฌ๋ ํ ํฐ์ด ์ด๋ค ๋ฐ์ดํฐ๋ฅผ ๋ด๊ณ ์๋์ง ์ดํดํ๊ณ ์ฌ๋ฐ๋ฅด๊ฒ ๊ตฌ์กฐํ๋์๋์ง ํ์ธํ๋ ๋ฐ ๋์์ ์ค๋๋ค.