JWT(JSON Web Token)๋ ์ธ์ฆ์ ํ์ํ ์ ๋ณด๋ค์ ์ํธํ์ํจ JSON ํ ํฐ์ด๋ค. JWT ํ ํฐ(Access Token)์ HTTP ํค๋์ ์ค์ด ์๋ฒ๊ฐ ํด๋ผ์ด์ธํธ๋ฅผ ์๋ณํ๋ ๋ฐฉ์์ผ๋ก ์ธ์ฆํ๋ค.
JWT๋ JSON ๋ฐ์ดํฐ๋ฅผ Base64 URL-safe Encode ๋ฅผ ํตํด ์ธ์ฝ๋ฉํ์ฌ ์ง๋ ฌํํ ๊ฒ์ด๋ฉฐ, ํ ํฐ ๋ด๋ถ์๋ ์๋ณ์กฐ ๋ฐฉ์ง๋ฅผ ์ํด ๊ฐ์ธํค๋ฅผ ํตํ ์ ์์๋ช ๋ ๋ค์ด์๋ค. ๋ฐ๋ผ์ ์ฌ์ฉ์๊ฐ JWT ๋ฅผ ์๋ฒ๋ก ์ ์กํ๋ฉด ์๋ฒ๋ ์๋ช ์ ๊ฒ์ฆํ๋ ๊ณผ์ ์ ๊ฑฐ์น๊ฒ ๋๋ฉฐ ๊ฒ์ฆ์ด ์๋ฃ๋๋ฉด ์์ฒญํ ์๋ต์ ๋๋ ค์ค๋ค.
โ Base64 URL-safe Encode
์ผ๋ฐ์ ์ธ Base64 Encode ์์ URL ์์ ์ค๋ฅ์์ด ์ฌ์ฉํ๋๋ก '+', '/' ๋ฅผ ๊ฐ๊ฐ '-', '_' ๋ก ํํํ ๊ฒ์ด๋ค.
๐ก JWT์ ๊ตฌ์กฐ
JWT๋ . ์ ๊ตฌ๋ถ์๋ก ๋๋์ด์ง๋ ์ธ ๊ฐ์ง ๋ฌธ์์ด์ ์กฐํฉ์ด๋ค. . ์ ๊ธฐ์ค์ผ๋ก ์ข์ธก๋ถํฐ Header, Payload, Signature๋ฅผ ์๋ฏธํ๋ค.
- ํค๋(Header) : JWT ์์ ์ฌ์ฉํ ํ์ (ํ ํฐ ์ ํ)๊ณผ ํด์ ์๊ณ ๋ฆฌ์ฆ์ ์ข ๋ฅ(์๋ช ์ํธํ ์๊ณ ๋ฆฌ์ฆ)
- ๋ด์ฉ(Payload) : ์๋ฒ์์ ์ฒจ๋ถํ ์ฌ์ฉ์ ๊ถํ ์ ๋ณด์ ๋ฐ์ดํฐ
- ์๋ช (Signature) : Header, Payload ๋ฅผ Base64 URL-safe Encode ํ ํ Header ์ ๋ช ์๋ ํด์ํจ์๋ฅผ ์ ์ฉํ๊ณ , ๊ฐ์ธํค(Private Key)๋ก ์๋ช ํ ์ ์์๋ช
์ ์์๋ช ์๋ ๋น๋์นญ ์ํธํ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๋ฏ๋ก ์ํธํ๋ฅผ ์ํ ํค์ ๋ณตํธํ๋ฅผ ์ํ ํค๊ฐ ๋ค๋ฅด๋ค. ์ํธํ(์ ์์๋ช )์๋ ๊ฐ์ธํค๋ฅผ, ๋ณตํธํ(๊ฒ์ฆ)์๋ ๊ณต๊ฐํค๋ฅผ ์ฌ์ฉํ๋ค.
Header์ Payload๋ ๋จ์ํ ์ธ์ฝ๋ฉ๋ ๊ฐ์ด๊ธฐ ๋๋ฌธ์ ์ 3์๊ฐ ๋ณตํธํ ๋ฐ ์กฐ์ํ ์ ์์ง๋ง, Signature๋ ์๋ฒ ์ธก์์ ๊ด๋ฆฌํ๋ ๋น๋ฐํค๊ฐ ์ ์ถ๋์ง ์๋ ์ด์ ๋ณตํธํํ ์ ์๋ค. ๋ฐ๋ผ์ Signature๋ ํ ํฐ์ ์๋ณ์กฐ ์ฌ๋ถ๋ฅผ ํ์ธํ๋๋ฐ ์ฌ์ฉ๋๋ค.
๐ก JWT ์ธ์ฝ๋ฉ / ๋์ฝ๋ฉ ํด๋ณด๊ธฐ
์ง์ JWT ํ ํฐ์ ์์ฑํด ์ฐ์ตํด๋ณด๊ณ ์ถ๋ค๋ฉด, ์๋ ๊ณต์์ฌ์ดํธ์์ ์ฝ๊ฒ JWT ํ ํฐ์ ์ธ์ฝ๋ฉ(์์ฑ) ํ๊ฑฐ๋ ๋์ฝ๋ฉ ํ ์ ์๋ค.
๐ก ์ธ์ฆ ๋ฐฉ์
- ์ฌ์ฉ์๊ฐ ID, PW๋ฅผ ์ ๋ ฅํ์ฌ ์๋ฒ์ ๋ก๊ทธ์ธ ์ธ์ฆ์ ์์ฒญํ๋ค.
- ์๋ฒ์์ ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ์ธ์ฆ ์์ฒญ์ ๋ฐ์ผ๋ฉด, Header, PayLoad, Signature๋ฅผ ์ ์ํ๋ค.
- Hedaer, PayLoad, Signature๋ฅผ ๊ฐ๊ฐ Base64๋ก ํ ๋ฒ ๋ ์ํธํํ์ฌ JWT๋ฅผ ์์ฑํ๊ณ ์ด๋ฅผ ์ฟ ํค์ ๋ด์ ํด๋ผ์ด์ธํธ์๊ฒ ๋ฐ๊ธํ๋ค.
- ํด๋ผ์ด์ธํธ๋ ์๋ฒ๋ก๋ถํฐ ๋ฐ์ JWT๋ฅผ ๋ก์ปฌ ์คํ ๋ฆฌ์ง์ ์ ์ฅํ๋ค. (์ฟ ํค๋ ๋ค๋ฅธ ๊ณณ์ ์ ์ฅํ ์๋ ์์) API๋ฅผ ์๋ฒ์ ์์ฒญํ ๋ Authorization header์ Access Token์ ๋ด์์ ๋ณด๋ธ๋ค.
- ์๋ฒ๊ฐ ํ ์ผ์ ํด๋ผ์ด์ธํธ๊ฐ Header์ ๋ด์์ ๋ณด๋ธ JWT๊ฐ ๋ด ์๋ฒ์์ ๋ฐํํ ํ ํฐ์ธ์ง ์ผ์น ์ฌ๋ถ๋ฅผ ํ์ธํ์ฌ ์ผ์นํ๋ค๋ฉด ์ธ์ฆ์ ํต๊ณผ์์ผ์ฃผ๊ณ ์๋๋ผ๋ฉด ํต๊ณผ์ํค์ง ์์ผ๋ฉด ๋๋ค.
- ์ธ์ฆ์ด ํต๊ณผ๋๋ฉด PayLoad์ ๋ค์ด์๋ ์ ์ ์ ์ ๋ณด๋ค์ selectํด์ ํด๋ผ์ด์ธํธ์ ๋๋ ค์ค๋ค.
- ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ์ ์์ฒญ์ ํ๋๋ฐ, ๋ง์ผ ์ก์ธ์ค ํ ํฐ์ ์๊ฐ์ด ๋ง๋ฃ๋๋ฉด ํด๋ผ์ด์ธํธ๋ ๋ฆฌํ๋์ ํ ํฐ์ ์ด์ฉํด์ ์๋ฒ๋ก๋ถํฐ ์๋ก์ด ์์ธ์ค ํ ํฐ์ ๋ฐ๊ธ ๋ฐ๋๋ค.
โ Refresh Token
์๋ก์ด Access Token์ ๋ฐ๊ธํด์ฃผ๊ธฐ ์ํด ์ฌ์ฉํ๋ ํ ํฐ์ผ๋ก ์งง์ ์๋ช ์ ๊ฐ์ง๋ Access Token์๊ฒ ์๋ก์ด ํ ํฐ์ ๋ฐ๊ธํด์ฃผ๊ธฐ ์ํด ์ฌ์ฉ๋๋ค. ํด๋น ํ ํฐ์ ๋ณดํต ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ ์ ๋ณด์ ๊ฐ์ด ๊ธฐ๋กํ๋ค.
๐ก ์ฅ์
- Header์ Payload๋ฅผ ๊ฐ์ง๊ณ Signature๋ฅผ ์์ฑํ๋ฏ๋ก ๋ฐ์ดํฐ ์๋ณ์กฐ๋ฅผ ๋ง์ ์ ์๋ค.
- ์ธ์ฆ ์ ๋ณด์ ๋ํ ๋ณ๋์ ์ ์ฅ์๊ฐ ํ์์๋ค.
- JWT๋ ํ ํฐ์ ๋ํ ๊ธฐ๋ณธ ์ ๋ณด์ ์ ๋ฌํ ์ ๋ณด ๋ฐ ํ ํฐ์ด ๊ฒ์ฆ๋ฌ์์ ์ฆ๋ช ํ๋ ์๋ช ๋ฑ ํ์ํ ๋ชจ๋ ์ ๋ณด๋ฅผ ์์ฒด์ ์ผ๋ก ์ง๋๊ณ ์๋ค.
- ํด๋ผ์ด์ธํธ ์ธ์ฆ ์ ๋ณด๋ฅผ ์ ์ฅํ๋ ์ธ์ ๊ณผ ๋ค๋ฅด๊ฒ, ์๋ฒ๋ ๋ฌด์ํ(StateLess)๊ฐ ๋์ด ์๋ฒ ํ์ฅ์ฑ์ด ์ฐ์ํด์ง ์ ์๋ค.
- ํ ํฐ ๊ธฐ๋ฐ์ผ๋ก ๋ค๋ฅธ ๋ก๊ทธ์ธ ์์คํ ์ ์ ๊ทผ ๋ฐ ๊ถํ ๊ณต์ ๊ฐ ๊ฐ๋ฅํ๋ค. (์ฟ ํค์ ์ฐจ์ด)
- OAuth์ ๊ฒฝ์ฐ Facebook, Google ๋ฑ ์์ ๊ณ์ ์ ์ด์ฉํ์ฌ ๋ค๋ฅธ ์น์๋น์ค์์๋ ๋ก๊ทธ์ธ์ ํ ์ ์๋ค.
- ๋ชจ๋ฐ์ผ ์ดํ๋ฆฌ์ผ์ด์ ํ๊ฒฝ์์๋ ์ ๋์ํ๋ค. (๋ชจ๋ฐ์ผ์ ์ธ์ ์ฌ์ฉ ๋ถ๊ฐ๋ฅ)
๐ก ๋จ์
- Self-contained : ํ ํฐ ์์ฒด์ ์ ๋ณด๋ฅผ ๋ด๊ณ ์์ผ๋ฏ๋ก ์๋ ์ ๊ฒ์ด ๋ ์ ์๋ค.
- ํ ํฐ ๊ธธ์ด : ํ ํฐ์ Payload์ 3์ข ๋ฅ์ ํด๋ ์์ ์ ์ฅํ๊ธฐ ๋๋ฌธ์, ์ ๋ณด๊ฐ ๋ง์์ง์๋ก ํ ํฐ์ ๊ธธ์ด๊ฐ ๋์ด๋ ๋คํธ์ํฌ์ ๋ถํ๋ฅผ ์ค ์ ์๋ค.
- Payload ์ธ์ฝ๋ฉ : payload ์์ฒด๋ ์ํธํ ๋ ๊ฒ์ด ์๋๋ผ BASE64๋ก ์ธ์ฝ๋ฉ ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์, ์ค๊ฐ์ Payload๋ฅผ ํ์ทจํ์ฌ ๋์ฝ๋ฉํ๋ฉด ๋ฐ์ดํฐ๋ฅผ ๋ณผ ์ ์์ผ๋ฏ๋ก, payload์ ์ค์ ๋ฐ์ดํฐ๋ฅผ ๋ฃ์ง ์์์ผ ํ๋ค.
- Store Token : stateless ํน์ง์ ๊ฐ์ง๊ธฐ ๋๋ฌธ์, ํ ํฐ์ ํด๋ผ์ด์ธํธ ์ธก์์ ๊ด๋ฆฌํ๊ณ ์ ์ฅํ๋ค. ๋๋ฌธ์ ํ ํฐ ์์ฒด๋ฅผ ํ์ทจ๋นํ๋ฉด ๋์ฒํ๊ธฐ๊ฐ ์ด๋ ต๊ฒ ๋๋ค.
๐ก ํด๋ผ์ด์ธํธ ์ธ์ฆ ๋ฐฉ์(Cookie & Session & JWT)์ ์ฅ๋จ์
โ JWT(Jason Web Token) ์์๋ณด๊ธฐ
๋ด์ฉ ๋ฐ ์ฌ์ง ์ถ์ฒ