JWT๋ ์ฌ์ค ์ธ์ , ์ฟ ํค ๋ฐฉ์์ ์ธ์ฆ ๋ฐฉ๋ฒ์์ ์์ฃผ ๊ฑฐ๋ก ๋๋ ์ธ์ฆ, ์ธ๊ฐ ๊ตฌํ ๊ธฐ์ ์ค ํ ๊ฐ์ง์ด๋ค.
์ด๋ฆ์ ๋ง์ด ๋ค์ด์์ง๋ง ์ ํํ ์์ธํ ์๋ฆฌ๋ ์์ง ๋ชปํ๋ ์ํ๋ผ ์ด๋ฒ ๊ธฐํ์ ๊น๊ฒ ํ๊ตฌํด๋ณด๊ณ ์๊ฒ ๋ ๋ด์ฉ๋ค์ ์ ๋ฆฌํด๋ณด๋ ค ํ๋ค.
1. JWT๋
JWT(Json Web Token)๋ ์๋ฒ, ํด๋ผ์ด์ธํธ ๊ฐ ๊ถํ์ ํ์ธํ๊ณ ์ธ๊ฐ (Authorization)๋ฅผ ํ ๋ ์ฌ์ฉํ์ฌ ์น์์์ Jsonํํ๋ก ์ฃผ๊ณ ๋ฐ๋ ํ ํฐ์ ์๊ธฐํ๋ค.
๊ธฐ์กด์ ์ธ์ (Session)๊ณผ ์ฟ ํค(Cookie) ๋ฐฉ์์ผ๋ก ํด๋ผ์ด์ธํธ์ ์ธ๊ฐ(Authorization)๋ฅผ ๊ตฌํํ๋ฉด์ ์ฌ๊ฒจ์ง๋ ๋ถํธํ ์ ์ ๊ฐ์ ํ๊ณ ์์คํ ์์์ ์ฌ์ฉ๋์ด ์ค์ด๊ฒ ๋์ด, ์๋๊ฐ ์ค์์๋๋ ํด๋ผ์ด์ธํธ์ API ๊ฐ๋ฐ์ ํ ๋ ๋ง์ด ์ฌ์ฉ๋๋ ๋ฐฉ์์ด๋ค.
2. JWT์ ๊ตฌ์กฐ
JWT๋ ์ฃผ๋ก Header, Payload, Signature๋ก ๊ตฌ์ฑ์ด ๋์ด์๋ค.
์๋์ ๊ทธ๋ฆผ์ ํ์ธํด๋ณด๋ฉฐ ์ค๋ช ์ ์งํํ๋๋ก ํ๊ฒ ๋ค.
2-1) Header
๋จผ์ Header๋ถ๋ถ์์๋ ์ธ์ฆ๋ฐฉ์(Type)์ ๋ํ๋ด๋ "typ"์ ์ํธํ ์๊ณ ๋ฆฌ์ฆ(Algorithm)์ ๋ํ๋ด๋ "alg"๋ก ๊ตฌ์ฑ์ด ๋์ด์๋ค. Type์ ๊ฒฝ์ฐ ํด๋น ๊ตฌํ ๋ฐฉ์์ ์ธ์ ๋ JWT๋ก ๋์ด์๊ธฐ ๋๋ฌธ์ ํญ์ JWT๋ก ๊ณ ์ ์ด ๋์ด์๊ณ Algorithm์ ๊ฒฝ์ฐ์๋ Header์ Playload๋ฅผ ์์ด Signature๋ก ์ํธํํ ์ํธํ ์๊ณ ๋ฆฌ์ฆ์ ํ์ํ๊ณ ์๋ค.
์ด๋ฐ๊ฐ ๋ค์ ์ค๋ช ์ ํ๊ฒ ์ง๋ง Header, Payload, Signature 3๊ฐ์ง ๊ตฌ์ฑ์์๋ ๋ชจ๋ ์ํธํ๋์ด์์ง๋ง Signature๋ฅผ ์ ์ธํ ๋ชจ๋ ๋ถ๋ถ์ ๋๊ตฌ๋ ํด์์ด ๊ฐ๋ฅํ๊ฒ ๋์ด์๊ณ
Header์ ๊ฒฝ์ฐ๋ Base64๋ก ์ํธํ๋์ด ์ ์ฅ์ด ๋์ด์๋ค.
2-2) Payload
Payload๋ถ๋ถ์์๋ ํด๋น ํ ํฐ์ ํฌํจ์ํฌ ํด๋ ์(Claim) ์ ๋ณด๋ฅผ ํฌํจํ๊ณ ์๋ค.
์ฃผ๋ก ์ฌ์ฉ์์ ์ ๋ณด์ ํ '์กฐ๊ฐ'์ผ๋ก ๋๋์ด ๋ณด๊ดํ๋ฉฐ Json๋ฐฉ์์ผ๋ก key : value์ ์์ผ๋ก ์ด๋ฃจ์ด์ ธ ์๋ค.
์๋ฒ ์ธก์์ ํด๋น ํ ํฐ์ ํ์ธํ ๋ ์ด๋ค ์ฌ์ฉ์๊ฐ ์ด๋ค ์ ๋ณด๋ก ์์ฒญํ ๊ฑด์ง ์ ์ ์๊ฒ ํด์ฃผ๋ ๊ฒ์ด ๊ฐ๋ฅํ๋ฉฐ, ๋ณดํต userNo ๋ userName ๋๋ userLevel ๋ฑ์ ํฌํจ์ํฌ ์ ์๋ Custom Claim๊ณผ ํด๋น ํ ํฐ์ ๋ฐ๊ธ์(iss), ๋ง๋ฃ์ผ(iat) ๊ฐ์ด ๊ท๊ฒฉ์ด ์ ํด์ ธ ํฌํจ๋๋ Reserved Claim์ผ๋ก ๊ตฌ๋ถ์ด ๋๋ค.
์ฃผ์ํ ์ ์ ํ ํฐ์ ์ฌ์ฉ์์ ์ ๋ณด๋ฅผ ์ฐธ๊ณ ํ ์ ์์ ์ต์ํ์ ์ ๋ณด๋ฅผ ํฌํจํด์ผ ํ๊ณ , ID ๋ Password ๊ฐ์ ๋ฏผ๊ฐํ ์ ๋ณด๋ ์ ๋๋ก ํฌํจํด์๋ ์๋๋ค.
2-3) Signature
์ด์ ๊น์ง๋ ์๋ฌด๋ ์ด์ด๋ณด๊ณ Decode ํ ์ ์๋ Header์ Payload ๋ถ๋ถ์ ๋ํด ์ค๋ช ํ๋ค๋ฉด Signature์ ๋ชน์ ๋น๋ฐ์ค๋ฌ์ด ๋ ์์ด๋ค. ๋ง์ฝ ํด๋ผ์ด์ธํธ์ ์๋ฒ ๊ฐ ํต์ ์ ํ ๋ ๋๊ตฌ๋ ํด์์ด ๊ฐ๋ฅํ๊ณ ์กฐ์์ด ๊ฐ๋ฅํ Header์ Payload๋ง์ ์ด์ฉํ์ฌ ์ธ๊ฐ(Authorization)๊ฐ ์ด๋ฃจ์ด์ง๋ค๋ฉด JWT๋ฅผ ์ฌ์ฉํ ์ด์ ๋ฐ์ ์ฌ์ค ์๋ค๊ณ ๋ด์ผ ํ๋ค.
๊ทธ๋์ ๋๋ JWT๊ตฌํ์์ ๊ฐ์ฅ ์ค์ํ ๋ ์์ด ์ด Signature๋ผ๊ณ ์๊ฐํ๋ค.
Signature๋ Header์ Payload ๊ทธ๋ฆฌ๊ณ ์๋ฒ ๊ฐ๋ฐ์๋ฅผ ์ ์ธํ ๊ทธ ๋๊ตฌ๋ ์์์ ์ ๋๋ Secret Key๋ฅผ Header์ ์ํธํ ์๊ณ ๋ฆฌ์ฆ์ ๋ฐ๋ผ ์ ์งฌ๋ฝ์์ผ๋ ๋ ์์ด๋ค. ๋ฐ๋ผ์ ๋๊ตฐ๊ฐ Header๋ Payload๋ฅผ ์์๋ก ์กฐ์ํ๋ค ํ๋ค ์๋ฒ ์ธก์์๋ Signature์ ๋ค์ด๊ฐ ์ ๋ณด์ ๋น๊ตํ์ฌ ๋ค๋ฅด๊ฒ ํ๋จ์ด ์ฃ๋ฉด ์ฆ์ ์กฐ์๋ ํ ํฐ์ด๋ผ๋ ๊ฒ์ ์ ์ ์๊ฒ ๋๋ค.
3. JWT์ ์๋ ๋ฐฉ์
์์ ๊ทธ๋ฆผ์์ ๋ณด์ด๋ ๊ฒ์ฒ๋ผ ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธ์ ์งํํ์ ๊ฒฝ์ฐ ์๋ฒ๋ DB์ ์ ์ฅ๋ ์ฌ์ฉ์ ์ ๋ณด ์กฐ๊ฐ(Claim)๋ค์ ๊ฐ์ ธ์ JWTํ ํฐ์ ์์ฑํด ์ค์ผ ํ๊ณ ๊ทธ๋ ๊ฒ ์์ฑ๋ ํ ํฐ์ ๋ค์ ํด๋ผ์ด์ธํธ์๊ฒ ์ ๋ฌํด์ค์ผ ํ๋ค.
๊ทธ๋ฆฌ๊ณ ๋งค๋ฒ ํด๋ผ์ด์ธํธ๊ฐ ์์ฒญํ ๋๋ง๋ค ์๋ฒ๋ JWTํ ํฐ์ ์ ํจ์ฑ๊ณผ ๊ทธ ์์ ํฌํจ๋์ด์๋ ์ ๋ณด๋ฅผ ํ์ธํ๋๋ก ํ๋ค.
์ต๋ํ ๋งค๋๋ฌ์ด ์ดํด๋ฅผ ์ํด ์์ ๊ทธ๋ฆผ์ฒ๋ผ ๋จ์ํ๊ฒ ์ค๋ช ์ ํ์ง๋ง, ์ค์ ๋ก๋ ํ ํฐ์ ๋ณดํธ๋ฅผ ์ํด
JWT๋ฐฉ์์ ์ฌ์ฉํ ๋ Access Token๊ณผ Refresh Token์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ํด๋น ๋ถ๋ถ์ ๋ํด์๋ ์ค๋ช ์ ํ๋๋ก ํ๊ฒ ๋ค.
4. Access Token & Refresh Token
๋ง์ฝ ํด๋ผ์ด์ธํธ๊ฐ ๋ฉฐ์น ๋์ ๊ฐ์ ํ ํฐ์ ์ด์ฉํ์ฌ API๋ฅผ ์ฌ์ฉํ๋ค๊ณ ๊ฐ์ ํด๋ณด์.
๋ชป๋ ํด์ปค ํ๋๊ฐ ํด๋น ํด๋ผ์ด์ธํธ์ ํ ํฐ์ ์ด๋ป๊ฒ ์ ๋นผ์์ ์๋ฌด๋ ๋์น ๋ชป ์ฑ๊ฒ ๋ชฐ๋ ์๋ฒ๋ฅผ ์ด์ฉํ๋ค๊ณ ๊ฐ์ ํ๋ฉด
ํด๋ผ์ด์ธํธ๋ ์๋ฒ๋ ํด๋น ํ ํฐ์ ๋ฉ์ถ ๋ฐฉ๋ฒ์ด ์๊ฒ ๋๋ค.
์ด๋ฌํ ๋ฌธ์ ๊ฐ ์๊ธฐ ๋๋ฌธ์, ์ ๊ทผ์ฉ ํ ํฐ์ธ Access Token๊ณผ ์๋ก์ด Access Token์ ๋ฐ๊ธํ ๋ ์ฌ์ฉํ๋ Refresh Token์ ๋๋์ด ์ฌ์ฉํด์ผ ํ๋ค.
4-1) Access Token
์์์ ์ค๋ช ํ๋ userNo, userLevel๊ณผ ๊ฐ์ด ์์ฃผ ์ฌ์ฉ๋๋ ์ ๋ณด๋ค์ ๋ด์๋๋๋ก ํ๊ณ ๋งค๋ฒ ์๋ฒ๋ก ์์ฒญ์ ํ ๊ฒฝ์ฐ Access Token ํ๋๋ง ๊ฐ์ง๊ณ ์ธ๊ฐ(Authorization)๋ฅผ ํ๋๋ก ํ๋ค. ํ์ง๋ง ํด๋น Access Token ์ ์ ๋ง๋ก ์ฌ์ฉ์ ๋ณธ์ธ์ด ๋ง๋์ง ํ์ธํ ๋ฐฉ๋ฒ์ด ์์ด ์๋์ ๊ฐ์ ํน์ง๋ค์ ๊ฐ์ง๊ณ ์ ์ถ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋๋ก ํ๋ค.
* ์ต๋ 10๋ถ ~ 1์๊ฐ ์ ๋์ ์งง์ ์๊ฐ์ ์ ํจ์๊ฐ์ผ๋ก ์ค์ ํ๋ค
* ํด์ปค ๋์ Access Token์ ์ ํ์ณ๊ฐ๋ค ํด๋ 10๋ถ์ด๋ 1์๊ฐ์ด ์ง๋ ์ํ์ด๊ธฐ ๋๋ฌธ์ ์ด๋ฏธ ํ ํฐ์ ์ ํจํ ์ํ๊ฐ ์๋๋ค.
* ์ ์ ์ฌ์ฉ์๋ Refresh Token์ ์ด์ฉํด 10๋ถ์ด ์ง๋ฌ๋ค๋ฉด ์๋ก์ด Access Token์ ๋ฐ๊ธ๋ฐ์ ์ฌ์ฉํ๋ค.
4-2) Refresh Token
Access Token์ด ๋ง๋ฃ๋์์ ๊ฒฝ์ฐ ์๋ก์ด Access Token์ ๋ฐ๊ธ๋ฐ์ ์๋จ์ด ์๋ค.
๋ฐ๋ก Refresh Token์ ์ด์ฉํ๋ ๊ฒ์ด๋ค.
์์ฃผ ๋ ธ์ถ์ด ๋์ด ๋ง๋ฃ์ผ์ด ๋งค์ฐ ์งง์ Access Token๊ณผ๋ ๋ค๋ฅด๊ฒ Refresh Token์ ๋ ธ์ถ์ด ์ ๊ณ
์ค์ง ์๋ก์ด Access Token์ ๋ฐ๊ธ๋ฐ๊ธฐ ์ํ์ฌ ์ฌ์ฉํ๋ค
ํน์ง์ ์๋์ ๊ฐ๋ค..
* ์ต๋ 150์ผ ์ ๋์ ๊ธด ์๊ฐ์ ์ ํจ์๊ฐ์ผ๋ก ์ค์ ํ๋ค
* Refresh Token์ ์ํ ์ฌ๋ถ๋ฅผ ์ํด ์๋ฒ ์ธก DB ๋ด์ ๋ณ๋๋ก ์ ์ฅํ๋ค.
* Access Token ๊ฐฑ์ ์ด์ธ์๋ ์ฌ์ฉํ ์ผ์ด ์์ด์ผ ํ๋ค.
4-3) Access Token๊ณผ Refresh Token์ ์๋ ์์
์ฌ๊ธฐ๊น์ง ์ ๋ฆฌํ ๋ด์ฉ์ ๊ธฐ๋ฐ์ผ๋ก ํด๋ผ์ด์ธํธ App๊ณผ ์๋ฒ๊ฐ JWT, Access Token & Refresh Token์ ํตํด ์ธ๊ฐ(Authenticate)๋ฅผ ๊ตฌํํ๋ค๋ฉด ์๋์ ๊ฐ์ ์์๋ก ์๋์ด ๋ ๊ฒ์ด๋ค.
(1) ์ฌ์ฉ์๊ฐ App์์ ๋ก๊ทธ์ธ์ ์งํํ๋ค
(2) ์๋ฒ๋ ๋ก๊ทธ์ธ ID, PW ์ ๋ณด๋ฅผ ํ์ธํ๋ค.
(3) ์ดํ userNo, userLevel ๋ฑ๊ณผ ๊ฐ์ Claim์ ๋ณด๋ฅผ ํฌํจํ Access Token๊ณผ Refresh Token์ ๋ฐํํ๋ค.
(4) Refresh Token์ ์๋ฒ๋ DB์ ์ ์ฅ์ ํด๋๋๋ก ํ๋ค.
(5) ์ฌ์ฉ์์ App์์๋ Access Token๊ณผ Refresh Token์ ์ ์ฅํ๋ค.
(6) ์ฌ์ฉ์๋ ์๋ฒ์ API๋ฅผ ์ฌ์ฉํ ๋๋ง๋ค Access Token์ Authorization Header์ ๋ฃ์ด ์์ฒญ์ ํ๋ค.
(7) ์ดํ ์ค์ปท ์ฌ์ฉํ๋ค๊ฐ ๋ง๋ฃ๊ธฐ๊ฐ์ด ์ง๋๋ฒ๋ฆฐ Access Token์ผ๋ก ์๋ฒ์ ์์ฒญ์ ํ๋ค.
(8) ์๋ฒ๋ ๋ง๋ฃ๋ Access Token์ ๋ฐ์ ๊ฒฝ์ฐ 419 ๊ฐ์ ์ค๋ฅ๋ก ์๋ต์ ํ๋ค.
(9) ์ฌ์ฉ์ App์ 419 ์ค๋ฅ๋ฅผ ์๋ต๋ฐ๊ณ Refresh Token์ผ๋ก /refresh๋ผ๋ url์ ์์ฒญ์ ํ๋ค.
(10) ์๋ฒ๋ Refresh Token์ด ๋ง๋ฃ๋์๋์ง ๊ทธ๋ฆฌ๊ณ DB์ ์ ์ฅ๋ ์ํ ์ฌ๋ถ ํ์ธํ๊ณ ์๋ก์ด Access Token์ ๋ฐํํ๋ค.
(11) ์ฌ์ฉ์ App์ ๋ฐ๊ธ๋ฐ์ Access Token์ ์๋ก ์ ์ฅํ๊ณ ๋ฐ๋ก ์ด์ ์ ํ๋ ค๋ ์์ฒญ์ ๋ค์ ์์ํ๋ค.
(12) (6) ๋ฒ ์ดํ๋ก ๋์๊ฐ ๋ค์ ์ค์ปท ์ฌ์ฉํ๋ค
(13) ์ด๋ฒ์๋ ์๋ฒ ์ธก์์ ์ ๋ฌ๋ฐ์ Refresh Token์ด ๋ง๋ฃ๋์๊ฑฐ๋ DB์์ ์ฌ์ฉ ๊ธ์ง ์ํ๋ก ๋์ด์๋ค.
(14) /refresh๋ผ๋ url ๊ฒฐ๊ณผ๋ก 419 ๊ฐ ๋ฐํ๋๊ฒ ๋๋ค.
(15) ์ฌ์ฉ์ App์ /refresh๋ผ๋ url์ Refresh Token์ ๋ฃ๊ณ ์์ฒญ์ ํด๋ 419๊ฐ ๋ฐํ๋์ผ๋ฏ๋ก ์ฌ๋ก๊ทธ์ธ ์ ๋.
5. ๊ฒฐ๋ก
JWT๋ฅผ ๊ตฌํํ๋ฉด์ Refresh๋ผ๋ ๊ฐ๋ ๊น์ง ์ ์ฉ์ด ๋์ด ๊ตฌํํ๋ ๋์ด๋๊ฐ ๊ฝค ๋ฒ๊ฑฐ๋ก์์ง ๊ฒ์ ์ฌ์ค์ด๋ค.
ํ์ง๋ง ๊ทธ๋งํผ ๋ณด์์ฑ์ ์์ด ๋งค์ฐ ์ ์ตํ๊ธฐ ๋๋ฌธ์ ๋นผ๋ ค์ผ ๋บ ์ ์๋ ๋ ์์ด๊ธฐ๋ ํ๋ค.
๊ธฐ์กด์ Session ๋ฐฉ์์ด๋ Cookie๋ฐฉ์์ ์ธ๊ฐ(Authenticate)๋ฅผ ์ฌ์ฉํ๋ JWT๋ฅผ ์ฌ์ฉํ๋ ๊ฐ๊ฐ ์ฅ๋จ์ ์ ์กด์ฌํ๊ธฐ ๋๋ฌธ์
์์ผ๋ก ์ฌ์ฉํ ์๋น์ค์ ๋ฐ๋ผ JWT๋ฅผ ์ด์ฉํ๋ Session ๋ฐฉ์์ ์ด์ฉํ๋ ์๋๋ฉด ๋ ๊ฐ์ง๋ฅผ ํผํฉํ์ฌ ์ ์ ํ๊ฒ ์ด์ฉํ๋ ,
์ ์ ์ธ์ง์ ํ๋ฉฐ ๊ตฌํ์ ํ๋ฉด ์ข์ ๊ฒ ๊ฐ๋ค.
๊ฝค ๊ธฐ๋ค๋ ๋ด์ฉ์ ํฌ์คํ ์ด ๋์๋ ๊ฒ ๊ฐ์๋ฐ ์ด๋ฒ ๊ธฐํ์ JWT๋ฐฉ์์ ๋ํด ๊น๊ฒ ๊ณต๋ถ๋ฅผ ํ ์ ์๋ ๊ธฐํ๊ฐ ๋์๋ ๊ฒ ๊ฐ๋ค.
์ฌ๊ธฐ์ ๋ง์น๋๋ก ํ๊ฒ ๋ค.
'๐ฌ ๊ฐ๋ฐ์ด๋ก ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๊ฐ๋ฐ์ด๋ก ] MVVM ํจํด ๊ณผ Flutter (0) | 2022.08.25 |
---|