๐น JWT๋ ?
- JWT(Json Web Token)์ด๋, JSON ํฌ๋งท์ ์ด์ฉํ์ฌ ์ฌ์ฉ์์ ๋ํ ์์ฑ์ ์ ์ฅํ๋ Claim ๊ธฐ๋ฐ์ Web ํ ํฐ์ด๋ค.
- JWT๋ ํ์ํ ์ ๋ณด๋ฅผ ์์ฒด์ ์ผ๋ก ์ง๋๋ Self-Contained ๋ฐฉ์์ผ๋ก ์ ๋ณด๋ฅผ ์์ ์ฑ ์๊ฒ ์ ๋ฌํ๋ค.
๐น JWT ๊ตฌ์ฑ
JWT๋ ์์ ๊ฐ์ด Header, Payload, Signature ์ธ ๋ถ๋ถ์ผ๋ก ๊ตฌ์ฑ๋๋ค.
๊ฐ๊ฐ์ ๊ตฌ์ฑ ์์๋ .์ ๊ธฐ์ค์ผ๋ก ๊ตฌ๋ถ๋๋ฉฐ, Json์ผ๋ก ํฌ๋งท๋ ๊ฐ ๋ถ๋ถ์ Base64๋ก ์ธ์ฝ๋ฉ ๋์ด ํํ๋๋ค.
[ Header (ํค๋) ]
- alg์ typ๋ก ๊ตฌ์ฑ๋๋ค.
- alg : ํด์ฑ ์๊ณ ๋ฆฌ์ฆ, ์๋ช (Signature) ๋ฐ ํ ํฐ ๊ฒ์ฆ์ ์ฌ์ฉ๋๋ค. (์๋ช ์ ํด์ฑํ๊ธฐ ์ํ ์๊ณ ๋ฆฌ์ฆ ์ง์ )
- typ : ํ ํฐ์ ํ์
[ Payload (ํ์ด๋ก๋) ]
- ํ ํฐ์์ ์ฌ์ฉํ ์ ๋ณด์ ์กฐ๊ฐ๋ค์ธ ํด๋ ์(Claim)์ด ๋ด๊ฒจ์๋ค.
- ํด๋ ์์ ๋ฑ๋ก๋ ํด๋ ์(Registered Claim), ๊ณต๊ฐ ํด๋ ์(Pubilic Claim), ๋น๊ณต๊ฐ ํด๋ ์(Private Claim)์ผ๋ก ๋๋์ด์ง๋ฉฐ, key-value ํํ๋ก ์กด์ฌํ๋ค.
โฝ ๋ฑ๋ก๋ ํด๋ ์ (Registered Claim)
๋ฑ๋ก๋ ํด๋ ์์ ํ ํฐ ์ ๋ณด๋ฅผ ํํํ๊ธฐ ์ํด ์ด๋ฏธ ์ ํด์ง ์ข ๋ฅ์ ๋ฐ์ดํฐ๋ค๋ก, ๋ชจ๋ ์ ํ์ ์ผ๋ก ์์ฑ์ด ๊ฐ๋ฅํ์ฌ ์ฌ์ฉํ ๊ฒ์ ๊ถ์ฅํ๋ค.
- iss : ํ ํฐ ๋ฐ๊ธ์(issuer)
- sub : ํ ํฐ ์ ๋ชฉ(subject), unique ํ ๊ฐ์ ์ฌ์ฉํ๋ค. (์ฌ์ฉ์ ์ด๋ฉ์ผ)
- aud : ํ ํฐ ๋ง๋ฃ ์๊ฐ(expiration), ์๊ฐ์ NumericDate ํ์(1480849147370)์ผ๋ก ๋์ด์์ด์ผ ํ๋ฉฐ, ์ธ์ ๋ ํ์ฌ ์๊ฐ๋ณด๋ค ์ดํ๋ก ์ค์ ๋์ด ์์ด์ผ ํ๋ค.
- nbf : ํ ํฐ ํ์ฑ ๋ ์ง(not before), ๋ ์ง๋ NumericDate ํ์(1480849147370)์ผ๋ก ๋์ด์์ด์ผ ํ๋ฉฐ, ์ค์ ๋ ๋ ์ง๊ฐ ์ง๋์ง ์ ๊น์ง๋ ํ ํฐ์ด ์ฒ๋ฆฌ๋์ง ์๋๋ค.
- iat : ํ ํฐ ๋ฐ๊ธ ์๊ฐ(issued at), ํ ํฐ ๋ฐ๊ธ ์ดํ์ ๊ฒฝ๊ณผ ์๊ฐ
- jti : JWT ํ ํฐ ์๋ณ์(JWT ID), ์ค๋ณต ๋ฐฉ์ง๋ฅผ ์ํด ์ฌ์ฉํ์ฌ, ์ผํ์ฉ ํ ํฐ(Access Token) ๋ฑ์ ์ฌ์ฉ๋๋ค.
โฝ ๊ณต๊ฐ ํด๋ ์ (Pubilic Claim)
๊ณต๊ฐ ํด๋ ์์ ์ฌ์ฉ์ ์ ์ ํด๋ ์์ผ๋ก, ๊ณต๊ฐ์ฉ ์ ๋ณด๋ฅผ ์ํด ์ฌ์ฉ๋๋ค.
์ถฉ๋ ๋ฐฉ์ง๋ฅผ ์ํด URI ํฌ๋งท์ ์ด์ฉํ๋ค.
{
"https://je0ng-dev-log.tistory.com": true
}
โฝ ๋น๊ณต๊ฐ ํด๋ ์(Private Claim)
๋น๊ณต๊ฐ ํด๋ ์์ ์ฌ์ฉ์ ์ ์ ํด๋ ์์ผ๋ก, ์๋ฒ์ ํด๋ผ์ด์ธํธ ์ฌ์ด์ ์์๋ก ์ง์ ํ ์ ๋ก๋ฅผ ์ ์ฅํ๋ค.
{
"access_token": access
}
[ Signature (์๋ช ) ]
- ํ ํฐ์ ์ธ์ฝ๋ฉํ๊ฑฐ๋ ์ ํจ์ฑ ๊ฒ์ฆ์ ํ ๋ ์ฌ์ฉํ๋ ๊ณ ์ ํ ์ํธํ ์ฝ๋์ด๋ค.
- ์๋ช ์ ํค๋์ ํ์ด๋ก๋, ๋น๋ฐ ํค๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์์ฑ๋๋ฉฐ, ํด๋น ํ ํฐ์ด ๋ณ์กฐ๋์ง ์์์์ ํ์ธํ๊ธฐ ์ํ ๋ฉ์ปค๋์ฆ์ด๋ค.
- ์๋ช
์์ฑ ๊ณผ์ ์ ์๋์ ๊ฐ๋ค.
- ํค๋์ ํ์ด๋ก๋์ ๊ฐ์ ๊ฐ๊ฐ BASE64๋ก ์ธ์ฝ๋ฉ
- ์ธ์ฝ๋ฉํ ๊ฐ์ ๋น๋ฐ ํค๋ฅผ ์ด์ฉํด ํค๋์์ ์ ์ํ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ํด์ฑ
- ํด์ฑํ ๊ฐ์ ๋ค์ BASE64๋ก ์ธ์ฝ๋ฉํ์ฌ ์์ฑ
๐น JWT ์ฅ๋จ์
์ฅ์
-
JWT๋ ํ์ค ๊ท๊ฒฉ์ ๋ฐ๋ฅด๊ธฐ ๋๋ฌธ์ ์ฌ๋ฌ ์๋น์ค ๊ฐ ํตํฉ์ด ์ฉ์ดํ๊ณ , ๋ค์ํ ์์คํ ์์ ํ์ฅ์ฑ ์๊ฒ ์ฌ์ฉํ ์ ์๋ค.
- ์๋ฒ ์ธก ๋ถํ๋ฅผ ๋ฎ์ถ ์ ์์ผ๋ฉฐ, JWT๋ ๋ ๋ฆฝ์ ์ผ๋ก ์๋ํ๊ธฐ ๋๋ฌธ์ ํจ์จ์ ์ธ ์ ๊ทผ ๊ถํ ๊ด๋ฆฌ๊ฐ ๊ฐ๋ฅํฉ๋๋ค. ๋ํ, ๋ถ์ฐ/ํด๋ผ์ฐ๋ ๊ธฐ๋ฐ ์ธํ๋ผ์์๋ ์ ์๋ํฉ๋๋ค.
- ๋ณ๋์ ์ธ์ฆ ์ ์ฅ์๊ฐ ํ์ํ์ง ์์, ์ธ์ฆ ์๋ฒ๋ DB์ ๋ํ ์์กด์ฑ์ ์ค์ผ ์ ์๋ค.
๋จ์
- ์๋ฒ๋ก๋ถํฐ ๋ฐ์ ํ ํฐ์ด ์ฟ ํค ๋๋ ๋ก์ปฌ ์คํ ๋ฆฌ์ง, ์ธ์ ์คํ ๋ฆฌ์ง์ ์ ์ฅ๋๋ฏ๋ก ํ์ทจ๋นํ ์ํ์ด ์๋ค. ๋ฐ๋ผ์ token์ ์ค์ ์ ๋ณด๋ฅผ ํฌํจํด์๋ ์๋๋ค.
- ํ ํฐ์ ํฌํจ๋ ๋ฐ์ดํฐ๊ฐ ๋ง์์ง์๋ก ํ ํฐ์ด ํฌ๊ธฐ๊ฐ ์ปค์ง๋ฉฐ, API ํธ์ถ ์๋ง๋ค ์ด๋ฅผ ์๋ฒ์ ์ ๋ฌํด์ผ ํ๋ฏ๋ก ๋คํธ์ํฌ ๋์ญํญ์ ๋ญ๋นํ ์ ์๋ค.
- ํ๋ฒ ๋ฐ๊ธ๋ token์ ์์ ์ด๋ ํ๊ธฐ๊ฐ ๋ถ๊ฐ๋ฅํ๋ค.
- Access token์ ๋ง๋ฃ ์๊ฐ์ ์งง๊ฒ ์ค์ ํ๊ณ , Refresh token์ ์ฌ์ฉํ์ฌ Access token์ ์ฃผ๊ธฐ์ ์ผ๋ก ์ฌ๋ฐ๊ธํจ์ผ๋ก์จ, Access token์ด ํ์ทจ๋๋๋ผ๋ ํด์ปค๊ฐ ์ด์ฉํ ์ ์๋ ์๊ฐ์ ์ต์ํํ ์ ์๋ค.
๐ธ Redis (์ฐธ๊ณ )
๐ค Redis ์ฌ์ฉ ?
- ๋ก๊ทธ์ธํ ์ฌ์ฉ์์ ์์ฒญ์ด ๋ค์ด์ฌ ๋๋ง๋ค ํ ํฐ์ ๊ฒ์ฆํด์ผ ํ๋ค.
- ์ด๋, Redis๋ฅผ ์ฌ์ฉํ๋ฉด ํ ํฐ ๋น ๋ฅด๊ฒ ๊ฒ์ฆํ๊ณ , ํ ํฐ์ด ํ์ทจ๋ ๊ฒฝ์ฐ๋ฅผ ๋๋นํ ์ ์๋ค.
๐ค Redis์ refreshToken๋ง ์ ์ฅ ?
- Redis์ refreshToken๋ง ์ ์ฅํจ์ผ๋ก์จ, ํ ํฐ์ด ํ์ทจ๋๊ฑฐ๋ ์
์ฉ๋ ๊ฒฝ์ฐ, ์๋ฒ ์ธก์์ ํด๋น refreshToken์ ๋ฌดํจํํ ์ ์๋ ์๋จ์ ๊ฐ๊ฒ ๋๋ค.
- ๋ณด์ : accessToken์ด ํ์ทจ๋๋๋ผ๋ refreshToken์ด ์๋ค๋ฉด ์๋ก์ด accessToken์ ๋ฐ๊ธ๋ฐ์ ์ ์๊ธฐ ๋๋ฌธ์, refreshToken์ Redis์ ์ ์ฅํ๋ฉด ๋ณด์์ฑ์ ๋์ผ ์ ์๋ค.
- ํ ํฐ ์ฌ๋ฐ๊ธ ๊ด๋ฆฌ : accessToken์ด ๋ง๋ฃ๋์์ ๋, ์๋ฒ๋ Redis์ ์ ์ฅ๋ refreshToken๊ณผ ํด๋ผ์ด์ธํธ๊ฐ ๋ณด๋ด๋ refreshToken์ ๋น๊ตํ์ฌ ์ ํจ์ฑ์ ๊ฒ์ฌํ๊ณ , ์๋ก์ด accessToken์ ์ฌ๋ฐ๊ธํ๋ค.
๐ค refreshToken ๋ง๋ฃ ?
- Redis์ TTL(Time To Live) ์ค์ ์ผ๋ก ํด๊ฒฐํ ์ ์๋ค.
- refreshToken์ด ๋ง๋ฃ๋๋ฉด, ์ฌ์ฉ์๋ ์ฌ๋ก๊ทธ์ธ์ ํตํด ์๋ก์ด accessToken๊ณผ refreshToken์ ๋ฐ๊ธ๋ฐ๊ฒ ๋๋ค.
- ์ด๋, ์๋ก์ด refreshToken์ Redis์ ์ ์ฅ๋๋ฉฐ, ๊ธฐ์กด refreshToken์ ์๋์ผ๋ก ๋ง๋ฃ๋๋ค.
๐ reference