1. JWT๋ ๋ฌด์์ธ๊ฐ?
๊ธฐ๋ณธ์ ์ธ ํ ํฐ ์ธ์ฆ ๋ฐฉ์์ ๋ฐ๋ฅด๊ณ , ๊ฑฐ๊ธฐ์ ํ ํฐ ์์ฒด๋ฅผ ๊ฐํํ ๋ฐฉ์์ด๋ผ ์๊ฐํ๋ฉด ๋๋ค.
์๋์ ํ ํฐ ์ธ์ฆ ๊ธฐ๋ฐ์์ ์์ฒญ์๊ฐ ๋ณด๋ด์จ ID/PW ๊ฐ DB์ ์กด์ฌํ๋ฉด (์ฐ๋ฆฌ ํ์์ด ๋ง์ผ๋ฉด) ๊ทธ ์์ฒญ์์๊ฒ ์์ ๋ค์ API๋ฅผ ์ธ ์ ์๋ ํ๊ฐ์ฆ์ธ ํ ํฐ์ ์ ํด์คฌ์๋ค.
์ฌ๊ธฐ์ ๋ํด JWT์ ๊ฒฝ์ฐ ํ ํฐ์ ๋ง๋ค ๋, ์ฌ์ฉ์์ ์ ๋ณด(๊ฐ๋จํ ๊ฐ์ธ์ ๋ณด ๋ฑ +@)๋ฅผ ์ํธํํ์ฌ ๋ง๋ ๋ค.
์ด๋ ๊ฒ ๋๋ฉด ๋ฌด์์ด ์ข์๊น?
์๊น ํ ํฐ ์์ฒด๊ฐ ์ฌ์ฉ์์ ๋ํ ๊ฐ์ธ ์ ๋ณด๋ผ๊ณ ํ์๋ค. ํ์๊ฐ์
์ ํ์ฌ ํ ํฐ์ ๋ฐ์๋ค๋ฉด, ์ดํ API ์์ฒญ์ ํ ๋, ํ ํฐ์ Header๋ Cookie์ ๋ฃ์ด์ ๋ณด๋ธ๋ค. ๋ง์ฝ ํด๋ผ์ด์ธํธ๊ฐ ์ํ๋ ์์ฒญ์ด ์ฌ์ฉ์์ ๊ฐ์ธ์ ๋ณด์ ๋ํ ์์ฒญ์ด๋ผ๋ฉด, ์๋ฒ์์๋ DB๋ฅผ ์กฐํํ ํ์์์ด ํ ํฐ์ ๋ณตํธํ ํ์ฌ ๊ทธ ์์ ๊ฐ์ ๋ค์ ๋ณด๋ด์ค๋ ๋๋ค. ์ด๋ ์๋๋ฅผ ๋น ๋ฅด๊ฒ ํด์ค๋ค. ์ด์ธ์๋ ๋ง์ ์ฅ์ ์ด ์์ผ๋ฏ๋ก ํ์ ํ๊ฒ ๋ค.
2. JWT์ ๊ตฌ์กฐ
- Header
header๋ถ๋ถ์๋ JWT์ ํ์ ๊ณผ,
JWT ํ ํฐ ์๋ณ์กฐ ๋ฐฉ์ง๋ฅผ ์ํ ์ ์ ์๋ช ๋ง๋ค ๋, ์ฌ์ฉ๋ ํด์ ์๊ณ ๋ฆฌ์ฆ์ด ๋ฌด์์ธ์ง ์ ํ์๋ค. - Payload
์๊น 1๋ฒ์์ ๋งํ๋ ์ฌ์ฉ์์ ๋ํ ๊ฐ๋จํ ๊ฐ์ธ์ ๋ณด๊ฐ ๋ค์ด์๋ค. ํด๋น ์ ๋ณด๋ค์ด BASE64-URL-safe Encode๋ฅผ ํตํด ์ํธํ๋ ์ํ์ด๋ค. ๊ทธ ๋ด์ฉ์ ๋ณตํธํ ํ๋ฉด ์์ ๊ฐ์ JSON ํํ๋ก ๋ฐ๊ฟ ์ ์๋ค. - Signiture
- ์ธ์ฝ๋ฉ๋ header, ์ธ์ฝ๋ฉ๋ payload, server๊ฐ ๊ฐ์ง๊ณ ์๋ secret-key๋ฅผ Header์ ํ๊ธฐ๋ ํด์ฌ ์๊ณ ๋ฆฌ์ฆ์ ๋ฃ์ด์ ๋์จ ๊ฐ์ด๋ค. ์ฐ๋ฆฌ๋ ์ด ๊ฐ์ ํตํด ์์ฒญ์ผ๋ก ๋ค์ด์จ JWT๊ฐ ์๋ณ์กฐ ๋์๋์ง ์๋์ง๋ฅผ ์ฒดํฌํ ์ ์๋ค. (์ด๋ป๊ฒ ์๋ณ์กฐ ์ฒดํฌ๋ฅผ ํ๋์ง๋ ๋ค์์ ์์๋ณด์.)
3. JWT๋ฅผ ์ด์ฉํ ํ ํฐ ์ธ์ฆ ๋ฐฉ์์ ๊ณผ์
๊ธฐ์กด ํ ํฐ ์ธ์ฆ ๋ฐฉ์๊ณผ ํฐ ํ์ ๋๊ฐ๋ค.
- ํด๋ผ์ด์ธํธ๊ฐ ์์ฒญ์ ๋ณด๋ด๊ณ , ์ง์ง ์ฐ๋ฆฌ ํ์์ธ์ง ํ์ธํ๋ค.
- ์ฐ๋ฆฌ ํ์์ด ๋ง์ผ๋ฉด ํ ํฐ์ ๋ณด๋ธ๋ค.
๋ค๋ง ์ด ๋ ๋ณด๋ด๋ ํ ํฐ์ด Access Token(์ดํ AT), Refresh Token(์ดํ RT)๋ก ๋ ๊ฐ์ด๋ค. AT๋ ์ฐ๋ฆฌ๊ฐ ์ฐ๋ ๊ทธ๋๋ก Server์ API ์์ฒญ์ ํ๊ธฐ ์ํด ์ฐ์ธ๋ค.
RT๋ ์ธ์ ์ฐ์ผ๊น?
ํ ํฐ ์ธ์ฆ ๋ฐฉ์์ ์ทจ์ฝ์ ์ผ๋ก ํญ์ ๋๋๋์๋ ๊ฒ์ด, ์ค๊ฐ์ AT๋ฅผ ํ์ทจ ๋นํ๋ฉด ์๋ฌด ์๊ด์๋ ์ 3์๋ ์ ์ฃผ์ธ์ ๊ฐ์ธ์ ๋ณด์ ๊ธฐ๋ฐํ API๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋ค๋ ๊ฒ์ด์๋ค. ๊ฑฐ๊ธฐ์ ๋ํ ๋ณด์์ ์ผ๋ก JWT๊ฐ ๋ด๋์ ๋๋ต์ AT ์์ฒด์ ์๋ช
์ ์งง๊ฒ ๋๋ ๊ฒ์ด๋ค. ์ด๋ ๊ฒ ๋๋ค๋ฉด ๋๊ฐ AT๋ฅผ ํ์ทจํ์ฌ๋ ๊ธ๋ฐฉ ๋ง๋ฃ๋์ด ์ฐ์ง ๋ชปํ๊ฒ ๋๋ค.
๊ทธ๋ฌ๋ฉด ์ฐ๋ฆฌ์ ์ ๋ํ ์ฌ์ฉ์๋ AT ์๋ช
์ด ๋ค ํ ๋๋ง๋ค ์๋์ ๋ก๊ทธ์ธ ์ ์ฐจ๋ฅผ ๋ค์ ๋ฐ์์ผ ํ๋๊ฐ? ํ์ฌ ๋ง์ ์๋น์ค์ AT ์๋ช
์ ํ ์๊ฐ์ธ๋ฐ, ์ด๋ ๋ค๋ฉด ์ฐ๋ฆฌ๋ ์ฝํ
๋ฌธ์ ๋ฅผ ํ๋ค๊ฐ ํ ์๊ฐ์ด ์ง๋๋ฒ๋ ธ์ ๊ฒฝ์ฐ, ์ ์ถ๋ฒํผ์ ๋๋ ๋๋ฐ, ๋ก๊ทธ์ธ ์ฐฝ์ผ๋ก ๊ฐ๋ฒ๋ ค์ ์ฝ๋ฉ ๋ด์ญ์ ๋ค ๋ ๋ ค๋ฒ๋ฆด ๊ฒ์ด๋ค!
์ด๋ฌํ ์งง์ AT ์๋ช
์ ๋ํ ๋ณด์์ ์ผ๋ก RT๊ฐ ๋ฑ์ฅํ์๋ค.RT ๋ํ JWT ํ ํฐ์ธ๋ฐ, ์ค์ง AT๋ฅผ ์ฌ๋ฐ๊ธ ํ๋ ์ฉ๋๋ก๋ง ์ด๋ค. RT์ ๊ฒฝ์ฐ ์ฌ์ฉ์ ์ ๋ณด์ ๊ฐ์ด DB์ ์ ์ฅํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค. ๋ฐ๋ผ์ ์ฌ์ฉ์๊ฐ RT๋ฅผ ํตํด ์ฌ๋ฐ๊ธ ์์ฒญ์ ํ๋ฉด, Server๋ ํด๋น ์ฌ์ฉ์ ๋ ์ฝ๋์ ์ ํ RT์ ๋์กฐํ์ฌ ์ผ์นํ๋ฉด AT๋ฅผ ๋ค์ ์ ๊ณตํด์ค๋ค. ์ด๋ ๊ฒ RT๋ AT๊ฐ ๋ง๋ฃ๋ ๊ฒฝ์ฐ์๋ง ์์ฒญ์ ๋ฑ์ฅํ๊ธฐ ๋๋ฌธ์ ๊ฐํ์ ์ด๋ผ ํ์ทจ๊ฐ ์ฝ์ง ์์ ๊ฒ์ด๋ค. RT์ ํ๊ท ์๋ช
์ ํ๋ฌ ~ ๋๋ฌ ์ ๋๋ก ๋๋ํ๋ค.
4. JWT ํ ํฐ ์ธ์ฆ ๋ฐฉ์์ด ์ ๋ขฐ์ฑ์ ๊ฐ์ง๋ ์ด์
JWT ํ ํฐ ์ธ์ฆ ๋ฐฉ์์ด ์ ๋ขฐ์ฑ์ ๊ฐ์ง๋ ์ด์ ๋ JWT ํ ํฐ์ ์๋ณ์กฐ ์ฌ๋ถ๋ฅผ Server์์ ๊ฐ๋ ค๋ผ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค. ์ด๋ป๊ฒ ๊ฐ๋ ค๋ผ๊น? JWT ํ ํฐ์ ๊ฒฝ์ฐ ํฌ๊ฒ 3๊ฐ์ง ๋ถ๋ถ์ผ๋ก ๋๋ ์ ์์๋ค.
A (์ธ์ฝ๋ฉ๋ Header) + B (์ธ์ฝ๋ฉ๋ Payload) + C(์ ์์๋ช
)
C์ ์ ์์๋ช
์ (ํด๋น A, B + server์ ์กด์ฌํ๋ Secret Key)๋ฅผ ํด์ฌ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ์ํธํ ํ์ ๋์ ๋ฐํ๊ฐ์ด์๋ค.
Server์์ C๋ฅผ ์ฌํํ ์ ์์๊น?
์๋ค. server์ ์์ฒญ์ด ๋ค์ด์๋ค๋ฉด ํค๋์ JWT(A+B+C) ๋ ๋ค์ด์๋ค๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ C๋ฅผ ๋ง๋ค ์ ์๋ ๋งค๊ฐ ๋ณ์๊ฐ ๋ชจ๋ ์กด์ฌํ๋ค.
ex) HSA256(A,B,server-key) = C
๋ง์ฝ, ๋์ ๋ง์์ ๋จน์ ๋๊ตฐ๊ฐ๊ฐ JWT๋ฅผ ํ์ทจํด์ A๋ B์ค ์ ๋ณด๋ฅผ ์๋ณ์กฐ ํ๋ค๊ณ ์น์, JWT ์ธ์ฆ ์ ์ฐจ๋ฅผ ๊ฑฐ์น์ง ์๊ณ ์๋ณ์กฐ๋ ํ ํฐ์ด ๊ทธ๋๋ก Server์์ ์ฐ์ธ๋ค๋ฉด, DB๋ฅผ ํค์ง์ด์ ๋์ฅํ์ผ๋ก ๋ง๋ค ๊ฐ๋ฅ์ฑ์ด ์๋ค. (ํ์ ์ ๋ณด์ ์๋ชป๋ ๊ฐ insert ๋ฑ) ๋ฐ๋ผ์ ์ํํ๋ค. ์ด๋ฌํ ์๋ณ์กฐ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด JWT ๊ตฌ์กฐ ์ค C(์ ์์๋ช ) part๊ฐ ์ฐ์ธ๋ค.
๋๊ตฐ๊ฐ payload๋ฅผ ์์กฐํด์ JWT๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ๋ง๋ค์๋ค๊ณ ํ์. Payload B๋ฅผ ์์กฐํ ์๋ก์ด Payload๋ฅผ B'๋ผ๊ณ ํ๋ฉด,
JWT2(A+B'+C)
์ด๊ฑธ๋ก ์ ์์๋ช ์ ์ฌํํ๋ ค๊ณ ๋ค๋ฉด, HSA256(A,B',Server-key)๋ก ๋ค์ด๊ฐ๊ฒ ๋๊ณ , ์ธ์๊ฐ ๋ฌ๋ผ์ง๋, ๋ฐํ๊ฐ๋ ์๋์ JWT์ ์์ ํ ๋ฌ๋ผ์ง ๊ฒ์ด๋ค.
ex) HSA256(A,B',server-key) = %%)@$(#(
์ด๋ JWT์ C part์ ๋ค๋ฅธ ๊ฐ์ด๋ค. ์ด๋ ๊ฒ, ๋ค์ด์จ JWT ๊ฐ์ ์ด์ฉํ์ฌ C๋ฅผ ์ฌํํ๋ ค ํ์ ๋, ์ฌํ์ด ๋์ง ์๋๋ค๋ฉด, ํด๋น JWT๋ ์๋ณ์กฐ ๋ ๊ฒ์ผ๋ก ํ๋จํ ์ ์๋ค.
์ด๋ฐ ์์ผ๋ก JWT๋ ์๋ณ์กฐ์ ๊ฐํ๊ธฐ์, JWT ํ ํฐ ์ธ์ฆ ๋ฐฉ์์ ์ผ๋ฐ ํ ํฐ ์ธ์ฆ๋ฐฉ์๋ณด๋ค ์ ๋ขฐ์ฑ์ ๊ฐ์ง๋ค.