๋ฐ์ํ
์ด ํฌ์คํธ๋ ๋ฐ์ด ํ๋ก๊ทธ๋๋ฐ๋์ ์ ํ๋ธ ๊ฐ์๋ฅผ ๋ฃ๊ณ ๋์ ์ ๋ฆฌํ ๊ธ์ ๋๋ค.
JWT๋?
jwt.io์ ๊ฐ๋ณด๋ฉด JWT๋ฅผ ์ด๋ ๊ฒ ์ค๋ช ํฉ๋๋ค.
- JWT๋ก ์ฃผ๊ณ ๋ฐ๋ ์ ๋ณด๋ ๋์งํธ ์๋ช ์ด ๋์ด์์ผ๋ฏ๋ก ํ์ธํ๊ณ ์ ๋ขฐํ ์ ์๋ค.
- JWT๋ HMAC SHA256 (HS256) ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๋ค.
- JWT๋ ์ ๋ณด๋ฅผ ์ํธํํ์ฌ ์ฃผ๊ณ ๋ฐ์ ์ ์์ง๋ง, ์๋ช ๋ ํ ํฐ์ ์ค์ ์ ๋ ๊ฒ. ("์ด๊ฑด ๋ด๊ฐ ๋ณด๋ธ๊ฒ ๋ง์!" ๋ผ๋ ์๋ช , ์ธ์ฆ์ ์ค์ ์ ๋์๋ค.)
JWT ๊ตฌ์กฐ
(.)์ ๊ธฐ์ค์ผ๋ก ์ธ๊ฐ์ง ๋ถ๋ถ์ผ๋ก ๋๋๋ค.
- Header
- Payload
- Signature
์์ฑ๋ ํ ํฐ์ ์ด๋ ๋ค.
xxxxx.yyyyy.zzzzz
Header
{
"alg": "HS256",
"typ": "JWT"
}
- ์ด๋ค ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ์ํธํ๋ฅผ ํ๋์ง
- ํ ํฐ์ ํ์ ์ด ๋ฌด์์ธ์ง
Payload
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}
- Payload์๋ ํด๋ ์์ ํฌํจํ๊ณ ์์ต๋๋ค.
- ๋ฑ๋ก๋ ํด๋ ์
- iss(๋ฐ๊ธ์)
- exp(๋ง๋ฃ์๊ฐ)
- sub(์ ๋ชฉ)
- aud(๋์)
- ๋ฑ๋ฑ..
- ๊ณต๊ฐ ํด๋ ์
- ๋ด๊ฐ ์ํ๋ ๊ฐ๋ค์ Key : value ํ์์ผ๋ก ๋ฃ์ผ๋ฉด ๋๋ค.
- ๋น๊ณต๊ฐ ํด๋ ์
- ๋น์ฌ์ ๊ฐ์ ์ ๋ณด๋ฅผ ๊ณต์ ํ๊ธฐ ์ํด ์์ฑ๋ ๋ง์ถค ํด๋ ์
Signature
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
Signature์๋ Base64Url๋ก ์ธ์ฝ๋ฉ ๋ header, payload, ์ํฌ๋ฆฟ ํค๋ฅผ ๊ฐ์ง๊ณ HMAC256 ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ์ํธํ๋ฅผ ํ ๊ฒ์ ๋๋ค.
ํด๋ผ์ด์ธํธ - ์๋ฒ ๊ฐ JWT ํ ํฐ ์์ฑ
JWT ์ด๋ป๊ฒ ๊ฒ์ฆํ ๊น?
์ด์ ์ Signature๋ Header์ Payload์ ์ํฌ๋ฆฟ ํค๋ก HS256 ์ํธํ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ์์ฑํ๋ค๊ณ ํ์ต๋๋ค.
- header
- payload
- secret_key
์๋์ ๊ณผ์ ์ ๊ฑฐ์ณ ํ ํฐ์ ๊ฒ์ฆํ ์ ์์ต๋๋ค.
- ํด๋ผ์ด์ธํธ์์ ๋๊ฒจ์ค ์์ฒญํค๋์ JWT์ header, payload, signature ์ธ๊ฐ์ง๋ก ๋ถ๋ฅํ๋ค.
- header์ payload๋ฅผ base64UrlEncodeํ๋ค.
- secret_key๋ฅผ ๊ฐ์ง๊ณ HMAC256 ์ํธํ๋ฅผ ํ๋ฉด? signature๊ฐ ์์ฑ๋๋ค.
- ์ด์ ๋ฐฉ๊ธ ์์ฑํ Signature์ ํด๋ผ์ด์ธํธ๊ฐ ์ค signature๋ฅผ ๋น๊ตํด๋ณธ๋ค.
์ด์ ์๊ฐ์ ๋ฐฐ์ ๋ Session์ ์ฌ์ฉํ์ ๋๋ณด๋ค ๊ฐ์ฅ ํฐ ์ฅ์ ์ ์๋ฒ๋ง๋ค ์ธ์ ์ ์ฅ์๋ ์คํฐํค ์ธ์ ์ด๋ ๋ญ๋ ํ๋ ์ง์ ์ํด๋ ๋๋ค๋ ๊ฒ์ ๋๋ค.
์?
๋ชจ๋ ์๋ฒ๋ค์ด JWT๋ฅผ ๊ฒ์ฆํ๊ธฐ ์ํด {secret_key} ๋ง ์๊ณ ์์ผ๋ฉด ํด๋น ์๋ฒ์์ ์ธ์ฆ๊น์ง ๋ง์น ์ ์๊ธฐ ๋๋ฌธ์ด๋ค!
๊ฐ์ฌํฉ๋๋ค.
๋ฐ์ํ