JWT ํ ํฐ ๊ตฌ์กฐ ์ค๋ช : Header, Payload, Signature
JWT ํ ํฐ ๊ตฌ์กฐ ์ค๋ช
๋ชจ๋ JSON Web Token(JWT)์ ๋ ๋น์ฌ์ ๊ฐ์ ํด๋ ์์ ์ ๋ฌํ๋ ๊ฐ๊ฒฐํ๊ณ URL-safeํ ๋ฌธ์์ด์ ๋๋ค. ํ ํฐ ๊ธฐ๋ฐ ๋ณด์์ ๋ค๋ฃจ๋ ๊ฐ๋ฐ์๋ผ๋ฉด ๋ด๋ถ ๊ตฌ์กฐ๋ฅผ ์ดํดํ๋ ๊ฒ์ด ํ์์ ์ ๋๋ค.
JWT์ ์ธ ๋ถ๋ถ
JWT๋ ์ (.)์ผ๋ก ๊ตฌ๋ถ๋ ์ธ ๋ถ๋ถ์ผ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค.
header.payload.signature
์์:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
๊ฐ ๋ถ๋ถ์ base64url๋ก ์ธ์ฝ๋ฉ๋ JSON์ ๋๋ค. JWT๋ ์ํธํ๋ ๊ฒ์ด ์๋๋ผ ์๋ช ๋ ๊ฒ์ ๋๋ค โ ๋๊ตฌ๋ ๋์ฝ๋ฉํ์ฌ ๋ด์ฉ์ ์ฝ์ ์ ์์ต๋๋ค.
Part 1: Header
ํค๋์๋ ํ ํฐ์ ๋ํ ๋ฉํ๋ฐ์ดํฐ, ์ฆ ์๋ช ์๊ณ ๋ฆฌ์ฆ๊ณผ ํ ํฐ ์ ํ์ด ํฌํจ๋ฉ๋๋ค.
| ํ๋ | ์ค๋ช
| ์์ ๊ฐ |
|-------|-------------|----------------|
| alg | ์๋ช
์๊ณ ๋ฆฌ์ฆ (ํ์) | HS256, RS256, ES256 |
| typ | ํ ํฐ ์ ํ (์ ํ) | JWT |
| kid | ํค ID (์ ํ) | "key-1" |
{
"alg": "HS256",
"typ": "JWT"
}
alg ํ๋๋ ๊ฒ์ฆ์์๊ฒ ์ด๋ค ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ์๋ช
์ด ์์ฑ๋์๋์ง ์๋ ค์ค๋๋ค. ์๊ณ ๋ฆฌ์ฆ ๋ถ์ผ์น ๋๋ alg: "none"์ ์๋ฝํ๋ ๊ฒ์ ํํ JWT ๋ณด์ ์ทจ์ฝ์ ์
๋๋ค.
Part 2: Payload
ํ์ด๋ก๋์๋ ์ฌ์ฉ์ ๋ฐ ๋ฉํ๋ฐ์ดํฐ์ ๋ํ ํด๋ ์์ด ํฌํจ๋ฉ๋๋ค. ํด๋ ์์ ์ธ ๊ฐ์ง ๋ฒ์ฃผ๋ก ๋๋ฉ๋๋ค.
๋ฑ๋ก๋ ํด๋ ์ (Registered Claims)
| ํด๋ ์ | ์ ์ฒด ์ด๋ฆ | ์ฉ๋ |
|-------|-----------|---------|
| iss | Issuer | ํ ํฐ ๋ฐ๊ธ์ |
| sub | Subject | ์ฌ์ฉ์ ์๋ณ |
| aud | Audience | ์๋๋ ์์ ์ |
| exp | Expiration | ํ ํฐ ๋ง๋ฃ ํ์์คํฌํ |
| nbf | Not Before | ์ด ์๊ฐ ์ด์ ์๋ ํ ํฐ ์ ํจํ์ง ์์ |
| iat | Issued At | ํ ํฐ ์์ฑ ํ์์คํฌํ |
| jti | JWT ID | ๊ณ ์ ํ ํฐ ์๋ณ์ |
๋์ฝ๋ฉ๋ ํ์ด๋ก๋ ์์
{
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022,
"exp": 1516242622,
"iss": "https://auth.example.com"
}
๊ณต๊ฐ ํด๋ ์(Public claims)์ IANA ๋ ์ง์คํธ๋ฆฌ์ ์ ์๋๊ฑฐ๋ ์ถฉ๋ ๋ฐฉ์ง URI๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๋น๊ณต๊ฐ ํด๋ ์(Private claims)์ ๋ฐ๊ธ์์ ์์ ์ ๊ฐ์ ํฉ์๋ ์ฌ์ฉ์ ์ ์ ํด๋ ์์ ๋๋ค.
Part 3: Signature
์๋ช ์ ์ธ์ฝ๋ฉ๋ ํค๋, ์ธ์ฝ๋ฉ๋ ํ์ด๋ก๋, ๊ทธ๋ฆฌ๊ณ ํค๋์ ๋ช ์๋ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ์ฌ ๋น๋ฐ ํค๋ฅผ ๊ฒฐํฉํด ์์ฑ๋ฉ๋๋ค. ์๋ช ์ ๋ ๊ฐ์ง ๋ชฉ์ ์ ๊ฐ์ง๋๋ค.
- ๋ฌด๊ฒฐ์ฑ โ ์๋ช ํ ํ ํฐ์ด ์์ ๋์ง ์์์์ ํ์ธํฉ๋๋ค.
- ์ธ์ฆ โ ํ ํฐ์ด ์์๋ ๋น์ฌ์์ ์ํด ์๋ช ๋์์์ ์ฆ๋ช ํฉ๋๋ค.
HS256 ์๋ช ์์ฑ
HMACSHA256(
base64urlEncode(header) + "." + base64urlEncode(payload),
secret
)
RS256 ์๋ช ์์ฑ
RSASHA256(
base64urlEncode(header) + "." + base64urlEncode(payload),
privateKey
)
Base64url vs ํ์ค Base64
| ํญ๋ชฉ | ํ์ค Base64 | Base64url |
|--------|-----------------|-----------|
| 62๋ฒ ๋ฌธ์ | + | - |
| 63๋ฒ ๋ฌธ์ | / | _ |
| ํจ๋ฉ | = | ์๋ต |
์ด ์ธ์ฝ๋ฉ ๋ฐฉ์ ๋๋ถ์ JWT๋ HTTP ํค๋, ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ, URL ๊ฒฝ๋ก์์ ํผ์ผํธ ์ธ์ฝ๋ฉ ์์ด ์์ ํ๊ฒ ์ฌ์ฉํ ์ ์์ต๋๋ค.
JWT ์์ฑ ์ ์ฒด ๊ณผ์
- ํค๋ JSON์ ์์ฑํ๊ณ base64url๋ก ์ธ์ฝ๋ฉํฉ๋๋ค.
- ํ์ด๋ก๋ JSON์ ์์ฑํ๊ณ base64url๋ก ์ธ์ฝ๋ฉํฉ๋๋ค.
.๊ตฌ๋ถ์๋ก ์ฐ๊ฒฐํฉ๋๋ค.- ์ ํํ ์๊ณ ๋ฆฌ์ฆ๊ณผ ๋น๋ฐ ํค๋ก ์๋ช ํฉ๋๋ค.
- ์๋ช ์ base64url๋ก ์ธ์ฝ๋ฉํฉ๋๋ค.
- ์ธ ๋ถ๋ถ์
.๊ตฌ๋ถ์๋ก ๋ชจ๋ ์ฐ๊ฒฐํฉ๋๋ค.
๋ณด์ ๊ณ ๋ ค ์ฌํญ
- ํ์ด๋ก๋์ ๋น๋ฐ ์ ๋ณด๋ฅผ ์ ์ฅํ์ง ๋ง์ธ์. ํ์ด๋ก๋๋ ์ํธํ๋ ๊ฒ์ด ์๋๋ผ ์ธ์ฝ๋ฉ๋ ๊ฒ์ ๋๋ค.
- ํญ์ ์๋ช ์ ๊ฒ์ฆํ์ธ์. ๊ฒ์ฆ ์์ด๋ ๋๊ตฌ๋ ํ ํฐ์ ์์กฐํ ์ ์์ต๋๋ค.
algํค๋๋ฅผ ํ์ธํ์ธ์.alg: "none"๋ฐ ์๊ณ ๋ฆฌ์ฆ ๋ค์ด๊ทธ๋ ์ด๋ ์๋๋ฅผ ๊ฑฐ๋ถํด์ผ ํฉ๋๋ค.- ์งง์ ๋ง๋ฃ ์๊ฐ์ ์ค์ ํ์ธ์.
expํด๋ ์์ ๋ช ๋ฌ์ด ์๋ ๋ถ ๋๋ ์๊ฐ ๋จ์๋ก ์ฌ์ฉํ์ธ์.
์จ๋ผ์ธ์ผ๋ก JWT ํ ํฐ ๋์ฝ๋ฉํ๊ธฐ
JWT ๋์ฝ๋ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋ชจ๋ ํ ํฐ์ ๊ฒ์ฌํ์ธ์. ํ ํฐ์ ๋ถ์ฌ๋ฃ์ผ๋ฉด ๋์ฝ๋ฉ๋ ํค๋, ํ์ด๋ก๋, ์๋ช ์๊ณ ๋ฆฌ์ฆ์ ์ฆ์ ํ์ธํ ์ ์์ต๋๋ค. ๋ชจ๋ ์ฒ๋ฆฌ๋ ๋ธ๋ผ์ฐ์ ์์ ์ด๋ฃจ์ด์ง๋๋ค.