๊ฐ๋ฐ ๊ณต๋ถ/์น ์ง์ ์ฐฝ๊ณ
JWT (JSON Web Token) ๊ฐ๋
๊ฐ์ค์ด
2024. 11. 6. 13:27
JWT (JSON Web Token)
JSON ํ์์ผ๋ก ์ธ์ฝ๋ฉ๋ ํ ํฐ์ ์ฌ์ฉํด ์ฌ์ฉ์ ์ธ์ฆ ๋ฐ ์ ๋ณด ์ ๋ฌ์ ์ฌ์ฉํ๋ ํ ํฐ ๊ธฐ๋ฐ ์ธ์ฆ ๋ฐฉ์
- ์ด๋ค ๊ธฐ๋ฅ์ ์ฌ์ฉ์๊ฐ ์ฌ์ฉํ ์ ์๋ ๊ถํ์ด ์๋์ง ํ์ธํ๋ ์ ์ฐจ
- ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธํ๋ ๊ฒ์ ์ธ์ฆ(Authentication)์ด๊ณ , ๋ก๊ทธ์ธํ ์ฌ์ฉ์๊ฐ ์ด๋ค ๊ถํ์ ๊ฐ์ก๋์ง ํ์ธํ๋ ๊ณผ์ ์ด ์ธ๊ฐ(Authorization)
- ์ด๋ค ์๋น์ค์์ ๊ฒ์๊ธ์ ๋ฑ๋กํ๋ค๋์ง, ๋๊ธ์ ๋จ๊ธฐ๋์ง ๋ฑ์ ๊ธฐ๋ฅ์ ์ ๊ทผํ ์ ์๋์ง ๊ถํ์ ๋ํด ๋งค๋ฒ ํ์ธํด์ผ ํจ ⇒ ๋ก๊ทธ์ธ ์ ์ง
- ๋ก๊ทธ์ธ ์ ์ง ๋ฐฉ์
- ์ธ์ (Session)
- ํ ํฐ
- ์ธ์ ID๋ฅผ ํด๋ผ์ด์ธํธ์ ์ ๋ฌํ๊ณ ์ดํ ํด๋ผ์ด์ธํธ๋ ์์ฒญ๋ง๋ค ์ธ์ ID๋ฅผ ๋ณด๋ธ๋ค. ์๋ฒ๋ ์ ์ฅ๋ ์ธ์ ์ ๋ณด๋ฅผ ํตํด ์ฌ์ฉ์๋ฅผ ํ์ธํ๋ ๋ฐฉ์
- ์๋ฒ๊ฐ ์ธ์ ์ ๋ํ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ Stateful(์ํ์ ์ง)ํ ๋ฐฉ์
- ๋ง์ ์ฌ์ฉ์๊ฐ ์ ์ํ๋ฉด ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ถ์กฑํด์ง ์ ์๋ค.
- ์ฌ๋ฌ ๋์ ์๋ฒ๋ฅผ ์ด์ฉํ ๋ ์ฌ์ฉ์๊ฐ ์ด๋ค ์๋ฒ์ ์ ์ํ๋์ง์ ๋ฐ๋ผ ์ธ์ ์ ๋ณด๋ฅผ ์ผ๊ด๋๊ฒ ์ ์งํด์ผํ๋ฏ๋ก ์๋ฒ ๊ฐ์ ์ธ์ ๋๊ธฐํ๊ฐ ํ์ํ๋ค.
- ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธ์ ํ๋ฉด ์๋ฒ๊ฐ ํ ํฐ(JWT)์ ์์ฑํด ํด๋ผ์ด์ธํธ์๊ฒ ์ ๋ฌํ๋ค. ํด๋ผ์ด์ธํธ๋ ํ ํฐ์ ์ ์ฅํด ์๋ฒ์ ์์ฒญ ์๋ง๋ค ํ ํฐ์ ํจ๊ป ์ ์กํ๋ค.
- ์ํ๋ฅผ ์๋ฒ์ ์ ์ฅํ์ง ์๊ณ ํ ํฐ์ ์ ๋ณด๊ฐ ํฌํจ๋์ด ์๊ธฐ ๋๋ฌธ์ Stateless(์ํ๋น์ ์ง) ๋ฐฉ์
- Stateful ๋ฐฉ์์ ๋จ์ ์ ํด๊ฒฐ
- ๊ทธ๋ฌ๋ ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์์ํ๊ฑฐ๋ ํ ํฐ์ ๋ฌดํจํํด์ผ ํ ๊ฒฝ์ฐ ์ด๋ฏธ ๋ฐ๊ธ๋ JWT๋ฅผ ๊ฐ์ ๋ก ๋ฌดํจํํ๊ธฐ ์ด๋ ต๋ค๋ ๋จ์ ์ด ์์
- ์ฌ์ฉ์๊ฐ id, password๋ก ๋ก๊ทธ์ธ ์์ฒญ
- ์๋ฒ๋ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ํ์ธํ ํ ์ฌ์ฉ์์ ์ ๋ณด์ ํ ํฐ์ ๋ง๋ฃ ์๊ฐ ๋ฑ์ด ํฌํจ๋ JWT๋ฅผ ๋ฐ๊ธ
- ์ด ํ ํฐ์ ํด๋ผ์ด์ธํธ์๊ฒ ์ ๋ฌ
- ํด๋ผ์ด์ธํธ๋ ์ด JWT๋ฅผ ์ฟ ํค๋ ๋ก์ปฌ์คํ ๋ฆฌ์ง์ ์ ์ฅ
- ํด๋ผ์ด์ธํธ๋ ์๋ฒ์ ์์ฒญํ ๋๋ง๋ค Authorization ํค๋์ JWT๋ฅผ ํฌํจํ์ฌ ์์ฒญ
- ์๋ฒ์์ JWT๋ฅผ ๊ฒ์ฆ ํ์ ์์ฒญ์ ์ฒ๋ฆฌ
JWT.IO
JSON Web Tokens are an open, industry standard RFC 7519 method for representing claims securely between two parties.
jwt.io
ํ ํฐ ์์)
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
์ธ์ฝ๋ฉ๋ ํ ํฐ์ ๋์ฝ๋ฉํ ์์)
// header
{
"alg": "HS256",
"typ": "JWT"
}
// payload
{
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022
}
// signature
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret
) secret base64 encoded
- Header (ํค๋)
- type: “JWT” ← ๊ณ ์ ๊ฐ
- alg: ์๋ช ๊ฐ์ ๋ง๋๋ ๋ฐ ์ฌ์ฉ๋๋ ์๊ณ ๋ฆฌ์ฆ (HS256…)
- Payload (์ ๋ณด)
- iss (issuer): ํ ํฐ ๋ฐ๊ธ์
- aud (audience): ํ ํฐ ๋์์ (client id)
- exp (expiration): ํ ํฐ ๋ง๋ฃ ์๊ฐ
- iat (issued at): ํ ํฐ ๋ฐ๊ธ ์๊ฐ
- sub (subject): ํ ํฐ ์ ๋ชฉ
- ๊ทธ ์ธ ์ฌ์ฉ์ ๋ฐ์ดํฐ
- Verify Signature (์๋ช
)
- ์ธ์ฝ๋ฉ๋ ํค๋์ ํ์ด๋ก๋ ๊ทธ๋ฆฌ๊ณ ๋น๋ฐํค์ ํจ๊ป ์ฌ์ฉ๋๋ ์๋ช ์๊ณ ๋ฆฌ์ฆ์ ํตํด ์์ฑ๋ ๊ฐ