JWT
๐ก JWT ๊ณต์ ์ฌ์ดํธ : https://jwt.io/
JWT(JSON Web Token)๋
๋ฐ์ดํฐ๋ฅผ ์์ ํ๊ณ ๊ฐ๊ฒฐํ๊ฒ ์ ์กํ๊ธฐ ์ํด ๊ณ ์๋ ์ธํฐ๋ท ํ์ค ์ธ์ฆ ๋ฐฉ์์ผ๋ก์จ
ํ ํฐ ์ธ์ฆ ๋ฐฉ์์์ ๊ฐ์ฅ ๋ฒ์ฉ์ ์ผ๋ก ์ฌ์ฉ๋๋ฉฐ JSON ํฌ๋งท์ ํ ํฐ ์ ๋ณด๋ฅผ ์ธ์ฝ๋ฉ ํ,
์ธ์ฝ๋ฉ ๋ ํ ํฐ ์ ๋ณด๋ฅผ Secret Key๋ก ์๋ช (Sign)ํ ๋ฉ์์ง๋ฅผ Web Token์ผ๋ก์จ ์ธ์ฆ ๊ณผ์ ์ ์ฌ์ฉ
JWT์ ์ข ๋ฅ
- ์ก์ธ์ค ํ ํฐ(Access Token)
- ๋ฆฌํ๋ ์ ํ ํฐ(Refresh Token)
Access Token์ ๋ณดํธ๋ ์ ๋ณด๋ค(์ฌ์ฉ์์ ์ด๋ฉ์ผ, ์ฐ๋ฝ์ฒ, ์ฌ์ง ๋ฑ)์ ์ ๊ทผํ ์ ์๋ ๊ถํ ๋ถ์ฌ์ ์ฌ์ฉ
ํด๋ผ์ด์ธํธ๊ฐ ์ฒ์ ์ธ์ฆ์ ๋ฐ๊ฒ ๋ ๋(๋ก๊ทธ์ธ ์), Access Token๊ณผ Refresh Token ๋ ๊ฐ์ง๋ฅผ ๋ค ๋ฐ์ง๋ง, ์ค์ ๋ก ๊ถํ์ ์ป๋ ๋ฐ ์ฌ์ฉํ๋ ํ ํฐ์ Access Token์ ๋๋ค.
๊ถํ์ ๋ถ์ฌ๋ฐ๋ ๋ฐ์ Access Token๋ง ๊ฐ์ง๊ณ ์์ผ๋ฉด ๋์ง๋ง
์ด Access Token์ ๋ง์ฝ ์ ์์ ์ธ ์ฌ์ฉ์๊ฐ ํ์ทจํ๋ค๋ฉด? ๐คย ๋ฌธ์ ๊ฐ ๋๊ธฐ๋๋ฌธ์
โญ Access Token์๋ ๋น๊ต์ ์งง์ ์ ํจ ๊ธฐ๊ฐ์ ์ฃผ์ด ํ์ทจ๋๋๋ผ๋
์ค๋ซ๋์ ์ฌ์ฉํ ์ ์๋๋ก ํฉ๋๋ค
Access Token์ ์ ํจ๊ธฐ๊ฐ์ด ๋ง๋ฃ๋๋ค๋ฉด Refresh Token์ ์ฌ์ฉํ์ฌ
์๋ก์ด Access Token์ ๋ฐ๊ธ๋ฐ์ต๋๋ค. ์ด๋, ์ฌ์ฉ์๋ ๋ค์ ๋ก๊ทธ์ธ ์ธ์ฆ์ ํ ํ์๊ฐ ์์ต๋๋ค.
Refresh Token ๋ ํ์ทจ๋นํ๋ค๋ฉด? ๐ค
์ ํจ๊ธฐ๊ฐ์ด ๊ธด Refresh Token ๋ง์ ํ์ทจ๋นํ๋ฉด ๋ ํฐ ๋ฌธ์ ๊ฐ ๋ฉ๋๋ค
Refresh Token์ ์ด์ฉํด Access Token์ ๋ค์ ๋ฐ๊ธ๋ฐ์ผ๋ฉด ์ฌ์ฉ์์๊ฒ ํผํด๋ฅผ ์ ํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ฌ์ฉ์์ ํธ์๋ณด๋ค ์ ๋ณด๋ฅผ ์งํค๋ ๊ฒ์ด ๋ ์ค์ํ ์น ์ ํ๋ฆฌ์ผ์ด์
์
Refresh Token์ ์ฌ์ฉํ์ง ์๋๋ก ํฉ๋๋ค
JWT ๊ตฌ์กฐ
Header
Header๋ ์ด๊ฒ์ด ์ด๋ค ์ข ๋ฅ์ ํ ํฐ์ธ์ง ์ด๋ค ์๊ณ ๋ฆฌ์ฆ์ผ๋ก Signํ ์ง ์ ์ํฉ๋๋ค.
JSON Web Token์ด๋ฏ๋ก JSON ํฌ๋งท ํํ๋ก ์ ์ํฉ๋๋ค
1 2 3 4
{ "alg": "HS256", "typ": "JWT" }
์ด JSON ๊ฐ์ฒด๋ฅผ base64 ๋ฐฉ์์ผ๋ก ์ธ์ฝ๋ฉํ๋ฉด JWT์ ์ฒซ ๋ฒ์งธ ๋ถ๋ถ์ด ์์ฑ๋ฉ๋๋ค.
Payload
Payload์๋ ์๋ฒ์์ ํ์ฉํ ์ ์๋ ์ฌ์ฉ์์ ์ ๋ณด๊ฐ ๋ด๊ฒจ ์์ต๋๋ค.
์ด๋ค ์ ๋ณด์ ์ ๊ทผ ๊ฐ๋ฅํ์ง์ ๋ํ ๊ถํ์ ๋ด์ ์๋ ์๊ณ , ์ฌ์ฉ์์ ์ด๋ฆ ๋ฑ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ๋ด์ ์ ์์ต๋๋ค.
Payload๋ ๋ค์์ผ๋ก ์ค๋ช ํ Signature๋ฅผ ํตํด ์ ํจ์ฑ์ด ๊ฒ์ฆ๋ ์ ๋ณด์ด๊ธด ํ์ง๋ง, ๋ฏผ๊ฐํ ์ ๋ณด๋ ๋ด์ง ์๋ ๊ฒ์ด ์ข์ต๋๋ค.
1 2 3 4 5
{ "sub": "someInformation", "name": "phillip", "iat": 151623391 }
์ฒซ ๋ฒ์งธ ๋ถ๋ถ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก, ์ JSON ๊ฐ์ฒด๋ฅผ base64๋ก ์ธ์ฝ๋ฉํ๋ฉด JWT์ ๋ ๋ฒ์งธ ๋ธ๋ก์ด ์์ฑ๋ฉ๋๋ค.
Signature
base64๋ก ์ธ์ฝ๋ฉ ๋ ์ฒซ ๋ฒ์งธ, ๊ทธ๋ฆฌ๊ณ ๋ ๋ฒ์งธ ๋ถ๋ถ์ด ์์ฑ๋์๋ค๋ฉด,
Signature์์๋ ์ํ๋ ๋น๋ฐ ํค(Secret Key)์ Header์์ ์ง์ ํ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ์ฌ
Header์ Payload์ ๋ํด์ ๋จ๋ฐฉํฅ ์ํธํ๋ฅผ ์ํํฉ๋๋ค.
์ด๋ ๊ฒ ์ํธํ๋ ๋ฉ์์ง๋ ํ ํฐ์ ์๋ณ์กฐ ์ ๋ฌด๋ฅผ ๊ฒ์ฆํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
์๋ฅผ ๋ค์ด, ๋ง์ฝ HMAC SHA256 ์๊ณ ๋ฆฌ์ฆ(์ํธํ ๋ฐฉ๋ฒ ์ค ํ๋)์ ์ฌ์ฉํ๋ค๋ฉด
Signature๋ ์๋์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์์ฑ๋ฉ๋๋ค.
JWT๋ฅผ ํตํ ์ธ์ฆ์ ์ฅ์
์ํ๋ฅผ ์ ์งํ์ง ์๊ณ (Stateless),
ํ์ฅ์ ์ฉ์ดํ(Scalable) ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌํํ๊ธฐ ์ฉ์ดํฉ๋๋ค.
์๋ฒ๋ ํด๋ผ์ด์ธํธ์ ๋ํ ์ ๋ณด๋ฅผ ์ ์ฅํ ํ์ ์์ต๋๋ค.
(ํ ํฐ์ด ์ ์์ ์ผ๋ก ๊ฒ์ฆ๋๋์ง๋ง ํ๋จํฉ๋๋ค)
ํด๋ผ์ด์ธํธ๋ request๋ฅผ ์ ์กํ ๋๋ง๋ค ํ ํฐ์ ํค๋์ ํฌํจ์ํค๋ฉด ๋ฉ๋๋ค.
์ฌ๋ฌ ๋์ ์๋ฒ๋ฅผ ์ด์ฉํ ์๋น์ค๋ผ๋ฉด ํ๋์ ํ ํฐ์ผ๋ก ์ฌ๋ฌ ์๋ฒ์์ ์ธ์ฆ์ด ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ JWT๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ํจ๊ณผ์ ์ ๋๋ค.
๋ง์ฝ์ ์ธ์ ๋ฐฉ์์ด๋ผ๋ฉด ๋ชจ๋ ์๋ฒ๊ฐ ํด๋น ์ฌ์ฉ์์ ์ธ์ ์ ๋ณด๋ฅผ ๊ณต์ ํ๊ณ ์์ด์ผ ํฉ๋๋ค.
- ํด๋ผ์ด์ธํธ๊ฐ request๋ฅผ ์ ์กํ ๋๋ง๋ค ์๊ฒฉ ์ฆ๋ช
์ ๋ณด๋ฅผ ์ ์กํ ํ์๊ฐ ์์ต๋๋ค.
HTTP Basic ๊ฐ์ ์ธ์ฆ ๋ฐฉ์์ request๋ฅผ ์ ์กํ ๋๋ง๋ค ์๊ฒฉ ์ฆ๋ช ์ ๋ณด๋ฅผ ํฌํจํด์ผ ํ์ง๋ง
JWT์ ๊ฒฝ์ฐ ํ ํฐ์ด ๋ง๋ฃ๋๊ธฐ ์ ๊น์ง๋ ํ ๋ฒ์ ์ธ์ฆ๋ง ์ํํ๋ฉด ๋ฉ๋๋ค.
- ์ธ์ฆ์ ๋ด๋นํ๋ ์์คํ
์ ๋ค๋ฅธ ํ๋ซํผ์ผ๋ก ๋ถ๋ฆฌํ๋ ๊ฒ์ด ์ฉ์ดํฉ๋๋ค.
์ฌ์ฉ์์ ์๊ฒฉ ์ฆ๋ช ์ ๋ณด๋ฅผ ์ง์ ๊ด๋ฆฌํ์ง ์๊ณ ,
Github, Google ๋ฑ์ ๋ค๋ฅธ ํ๋ซํผ์ ์๊ฒฉ ์ฆ๋ช ์ ๋ณด๋ก ์ธ์ฆํ๋ ๊ฒ์ด ๊ฐ๋ฅํฉ๋๋ค.
ํ ํฐ ์์ฑ์ฉ ์๋ฒ๋ฅผ ๋ง๋ค๊ฑฐ๋, ๋ค๋ฅธ ํ์ฌ์์ ํ ํฐ ๊ด๋ จ ์์ ์ ๋งก๊ธฐ๋ ๊ฒ ๋ฑ
๋ค์ํ ํ์ฉ์ด ๊ฐ๋ฅํฉ๋๋ค.
- ๊ถํ ๋ถ์ฌ์ ์ฉ์ดํ๋ค
- ํ ํฐ์ Payload(๋ด์ฉ๋ฌผ) ์์ ํด๋น ์ฌ์ฉ์์ ๊ถํ ์ ๋ณด๋ฅผ ํฌํจํ๋ ๊ฒ์ด ์ฉ์ดํฉ๋๋ค.
JWT๋ฅผ ํตํ ์ธ์ฆ์ ๋จ์
- Payload๋ ๋์ฝ๋ฉ์ด ์ฉ์ดํฉ๋๋ค.
Payload๋ base64๋ก ์ธ์ฝ๋ฉ ๋๊ธฐ ๋๋ฌธ์ ํ ํฐ์ ํ์ทจํ์ฌ Payload๋ฅผ ๋์ฝ๋ฉํ๋ฉด
ํ ํฐ ์์ฑ ์ ์ ์ฅํ ๋ฐ์ดํฐ๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
๋ฐ๋ผ์ Payload์๋ ๋ฏผ๊ฐํ ์ ๋ณด๋ฅผ ํฌํจํ์ง ์์์ผ ํฉ๋๋ค.
- ํ ํฐ์ ๊ธธ์ด๊ฐ ๊ธธ์ด์ง๋ฉด ๋คํธ์ํฌ์ ๋ถํ๋ฅผ ์ค ์ ์์ต๋๋ค.
ํ ํฐ์ ์ ์ฅํ๋ ์ ๋ณด์ ์์ด ๋ง์์ง์๋ก ํ ํฐ์ ๊ธธ์ด๋ ๊ธธ์ด์ง๋๋ค.
๋ฐ๋ผ์ request๋ฅผ ์ ์กํ ๋๋ง๋ค ๊ธธ์ด๊ฐ ๊ธด ํ ํฐ์ ํจ๊ป ์ ์กํ๋ฉด ๋คํธ์ํฌ์ ๋ถํ๋ฅผ ์ค ์ ์์ต๋๋ค.
- ํ ํฐ์ ์๋์ผ๋ก ์ญ์ ๋์ง ์์ต๋๋ค.
- ์ฆ ํ ๋ฒ ์์ฑ๋ ํ ํฐ์ ์๋์ผ๋ก ์ญ์ ๋์ง ์๊ธฐ ๋๋ฌธ์ ํ ํฐ ๋ง๋ฃ ์๊ฐ์ ๋ฐ๋์ ์ถ๊ฐํด์ผ ํฉ๋๋ค.
๋ํ ํ ํฐ์ด ํ์ทจ๋ ๊ฒฝ์ฐ ํ ํฐ์ ๊ธฐํ์ด ๋ง๋ฃ๋ ๋๊น์ง ํ ํฐ ํ์ทจ์๊ฐ ํด๋น ํ ํฐ์ ์ ์์ ์ผ๋ก
์ด์ฉํ ์ ์์ผ๋ฏ๋ก ๋ง๋ฃ ์๊ฐ์ ๋๋ฌด ๊ธธ๊ฒ ์ค์ ํ์ง ์์์ผ ํฉ๋๋ค.