๐ง MSA ํ๊ฒฝ์์ ๋ก๊ทธ์ธ ์์คํ ์ ์ด๋ป๊ฒ ๊ตฌํํ ๊น?
๋ง์ดํฌ๋ก์๋น์ค ์ํคํ ์ฒ(MSA)๋ ์๋น์ค ๊ฐ ๋ ๋ฆฝ์ฑ์ ์ ์งํ๋ฉด์๋ ์ ๊ธฐ์ ์ผ๋ก ์ฐ๊ฒฐ๋ ๋ถ์ฐ ์์คํ ์ ๊ตฌ์ถํ๋ ๋ฐฉ์์ด๋ค. ํ์ง๋ง ์ฌ๋ฌ ๊ฐ์ ๋ ๋ฆฝ์ ์ธ ์๋น์ค๊ฐ ์กด์ฌํ๋ MSA ํ๊ฒฝ์์๋ "์ฌ์ฉ์ ์ธ์ฆ์ ์ด๋ป๊ฒ ๊ด๋ฆฌํ ๊ฒ์ธ๊ฐ?" ํ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
๊ธฐ์กด ๋ชจ๋๋ฆฌ์ ์ํคํ ์ฒ(Monolithic Architecture)์์๋ ๋จ์ผ ์๋ฒ๊ฐ ์ธ์ ์ ๊ด๋ฆฌํ๋ฉด ๋์์ง๋ง, MSA ํ๊ฒฝ์์๋ ์ธ์ฆ์ ๋ํด ์ด๋ป๊ฒ ์ฒ๋ฆฌํด์ผ ํ ์ง์ ๋ํ ๋ฌธ์ ๊ฐ ์๊ธด๋ค. ๊ฐ ์๋น์ค๊ฐ ๊ฐ๋ณ์ ์ผ๋ก ์ธ์ฆ์ ์ฒ๋ฆฌํด์ผ ํ ๊น? ๊ทธ๋ ๋ค๋ฉด ์๋น์ค๋ง๋ค ๋ก๊ทธ์ธ ๋ก์ง์ ๊ตฌํํด์ผ ํ ๊น? ์๋๋ฉด ์ค์ ์ง์ค์ ์ธ์ฆ ์์คํ ์ ๊ตฌ์ถํด์ผ ํ ๊น?
์ฐ๋ฆฌ๊ฐ ๊ธฐ์กด์ ์ฐ๋ ๋ก๊ทธ์ธ ๊ตฌํ ๋ฐฉ์์ ๋ค์๊ณผ ๊ฐ์ด ํฌ๊ฒ ์ธ ๊ฐ์ง๋ก ๋ถ๋ฅํ ์ ์๋ค.
- ์ธ์ ๊ธฐ๋ฐ ์ธ์ฆ ์์คํ
- ํ ํฐ ๊ธฐ๋ฐ ์ธ์ฆ ์์คํ
- OAuth 2.0, ์ 3์ ๋ก๊ทธ์ธ, ์์ ๋ก๊ทธ์ธ ์์คํ
์์ ๋ก๊ทธ์ธ ๊ตฌํ ๋ฐฉ์ ์ค ์ธ์ ๊ธฐ๋ฐ๊ณผ ํ ํฐ ๊ธฐ๋ฐ์ ๋น๊ตํ์ฌ MSA ํ๊ฒฝ์ผ๋ก ๋ค์ด์๋ฉด ์๊ธฐ๋ ๋ฌธ์ ์ ๊ณผ ํด๊ฒฐ๋ฐฉ์์ ๋ํด ์์๋ณด๊ฒ ๋ค.
1๏ธโฃ ์ธ์ ๊ธฐ๋ฐ ์ธ์ฆ ์์คํ
์ธ์ ๊ธฐ๋ฐ ์ธ์ฆ์ ๋์์ ์์ ๊ฐ๋ค.
- ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธํ๋ฉด ์๋ฒ์์ ์ธ์ ์ ์์ฑํ๊ณ , ์ธ์ ID๋ฅผ ์ฟ ํค์ ์ ์ฅํ์ฌ ํด๋ผ์ด์ธํธ์๊ฒ ๋ฐํ
- ์ดํ ์์ฒญ์์ ํด๋ผ์ด์ธํธ๊ฐ ์ฟ ํค๋ฅผ ํจ๊ป ์ ์กํ๋ฉด, ์๋ฒ์์ ํด๋น ์ธ์ ์ ๋ณด๋ฅผ ์กฐํํ์ฌ ์ธ์ฆ ์ฒ๋ฆฌ
๊ทธ๋ ๋ค๋ฉด MSA ํ๊ฒฝ์์๋ ์ด๋ป๊ฒ ๋์ํด์ผ ํ ๊น?
Session ๊ธฐ๋ฐ ์ธ์ฆ ์๋ฒ์์ ์ธ์ ์ DB์ ์ ์ฅํ๊ธฐ์ MSAํ๊ฒฝ์ผ๋ก ๋ค์ด์๊ฒ ๋๋ฉด Client๊ฐ Session ID๋ฅผ ๋ฐ์ ์๋ฒ๊ฐ ์๋ ๋ค๋ฅธ ์๋ฒ์ ์ ๊ทผํ ๋ Session Id๋ฅผ ์ธ์ฆํ ์๊ฐ ์๋ ๋ฌธ์ ์ ์ด ๋ฐ์ํ๋ค.
์ฆ ์ธ์ ์ ์ ์งํ๋ ค๋ฉด ์ฌ์ฉ์๋ ๊ฐ์ ์๋ฒ๋ก ์ ๊ทผํด์ผ ํ๋ค.
์ด์ ๋ํ ํด๊ฒฐ ๋ฐฉ์์ผ๋ก, ๋ชจ๋ ์๋ฒ๊ฐ ์ธ์ ๋ฐ์ดํฐ๋ฅผ ๊ณต์ ํ ์ ์๋๋ก ์ค์ DB๋ฅผ ํ์ฉํ๋ ๋ฐฉ๋ฒ์ด ์๋ค.
๐ข ๋ฌธ์ ์
1. ์ค์ ์ง์คํ DB์ ๋ฌธ์ ์
DB๊ฐ ๋จ์ผ ์ฅ์ ์ (Single Point of Failure, SPOF)์ด ๋ ์ํ์ด ์์ผ๋ฉฐ, ์ฅ์ ๋ฐ์ ์ ๋ชจ๋ ์๋ฒ๊ฐ ์ํฅ์ ๋ฐ์ ์ ์๋ค.
2. DB ๊ณผ๋ถํ
์ฌ๋ฌ ์๋ฒ๊ฐ ํ๋์ DB์ ๋์ ์ ๊ทผํ๊ฒ ๋๋ฏ๋ก ํธ๋ํฝ ์ฆ๊ฐ์ ๋ฐ๋ฅธ ์ฑ๋ฅ ์ ํ์ ๋์์ฑ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ด ๋๋ค.
2๏ธโฃ ํ ํฐ ๊ธฐ๋ฐ ์ธ์ฆ ์์คํ
ํ ํฐ ๊ธฐ๋ฐ ์ธ์ฆ ์์คํ ์ MSA ํ๊ฒฝ์ ์ ํฉํ ํน์ง์ ์ง๋๊ณ ์๋ค.
ํ ํฐ ๊ธฐ๋ฐ ์ธ์ฆ ์์คํ ์ ๋์ ๋ฐฉ์์ ์์ ๊ฐ๋ค.
- ๋ก๊ทธ์ธ ์ Access Token๊ณผ Refresh Token์ ๋ฐ๊ธ
- ํด๋ผ์ด์ธํธ๋ ์ดํ ์์ฒญ ์ Authorization ํค๋์ Access Token์ ํฌํจํ์ฌ ์ ์ก
- ์๋ฒ๋ ํ ํฐ์ ๊ฒ์ฆํ์ฌ ์ธ์ฆ ์ฒ๋ฆฌ (DB ์กฐํ ์์ด๋ ์ธ์ฆ ๊ฐ๋ฅ)
- Access Token์ด ๋ง๋ฃ๋๋ฉด Refresh Token์ ์ด์ฉํด ์๋ก์ด Access Token์ ๋ฐ๊ธ
JWT๋ MSA ํ๊ฒฝ์์ ์ด๋ป๊ฒ ๋์ํ ๊น?
JWT์ ํน์ง ์ค ํ๋๋ ๋ฐ๋ก Stateless ํ๋ค๋ ํน์ง์ด๋ค.
JWT๋ ํ ํฐ ์์ฒด์ ์ฌ์ฉ์ ์ ๋ณด(Claims)๋ฅผ ํฌํจํ๊ธฐ ๋๋ฌธ์ ๋ณ๋ ์๋ฒ ์ํ(State) ์ ์ง๊ฐ ํ์ ์๋ค.
์ฆ, ์ด๋ค ์๋ฒ์์ ์์ฒญ์ ๋ฐ์๋ ๋์ผํ ์ธ์ฆ ์ฒ๋ฆฌ ๊ฐ๋ฅํ์ฌ ์ํ ํ์ฅ์ ์ต์ ํ๋์ด ์๋ค.
์์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด, Gateway์์ Access token์ ๋ํ ๊ฒ์ฆ ๋ก์ง๋ง ์ํํ๊ณ , Client๋ Auth ์๋ฒ๋ก๋ถํฐ Access token์ ๋ฐ๊ธ๋ฐ์์ ํด๋น ํ ํฐ์ผ๋ก ๋ค๋ฅธ ์๋ฒ์ ์ ๊ทผํ ์ ์๋ค.
๐ข ๋ฌธ์ ์
1. Access ํ ํฐ ํ์ทจ ์ํ
ํด๋ผ์ด์ธํธ๋ ์ ํจํ Access Token๋ง ์์ผ๋ฉด ์ด๋ ์๋ฒ๋ ์ฝ๊ฒ ์ ๊ทผํ ์ ์๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ํ ํฐ์ ํ์ทจ๋นํ๋ฉด ๋ชจ๋ ์๋ฒ์ ๋ํ ์ ๊ทผ์ด ๋ซ๋ฆฌ๊ฒ ๋๋ค. ๋ํ Access Token์ Stateless ํ๊ธฐ ๋๋ฌธ์ ๊ฐ์ ๋ก ๋ง๋ฃ์ํค๊ธฐ๋ ์ด๋ ต๋ค.
2. Refresh ํ ํฐ ํ์ทจ ์ํ
๋ง์ฝ Refresh ํ ํฐ์ด Stateless ํ๊ฒ ์ค์ ์ด ๋์ด์๋ค๋ฉด, ํ์ทจ๋์์ ๋, ์ ํจํ ๊ธฐ๊ฐ ๋์ ๊ณ์ํด์ Access Token์ ๋ฐ๊ธ๋ฐ์ ์ฌ๋ฌ ์๋ฒ์ ์ ๊ทผ์ด ๊ฐ๋ฅํด์ง๋ค.
MSAํ๊ฒฝ์์ JWT๋ฅผ ์ ์ฉํ๊ธฐ ์ํด ์ด๋ฌํ ๋ฌธ์ ์ ์ ํด๊ฒฐํ๊ธฐ ์ํด ์ ์ฉํ ์ ์๋ ๋ฐฉ๋ฒ๋ค์ ๋ค๋ฃจ๊ณ ์ ํ๋ค.
โ MSA ํ๊ฒฝ์์ JWT ๋ฌธ์ ์ ํด๊ฒฐํ๊ธฐ
1๏ธโฃ RTR ๋์ ํ๊ธฐ
RTR(Refresh Token Rotation, ๋ฆฌํ๋ ์ ํ ํฐ ์ํ)๋?
Refresh Token์ ์ฌ์ฌ์ฉํ์ง ์๊ณ , ํ ๋ฒ ์ฌ์ฉํ ๋๋ง๋ค ์๋ก์ด Refresh Token์ ๋ฐ๊ธํ๋ ๋ฐฉ์์ด๋ค.
์ฆ, ๋งค๋ฒ Access Token์ ๊ฐฑ์ ํ ๋ ์๋ก์ด Refresh Token๋ ํจ๊ป ๋ฐ๊ธ๋๋ฉฐ, ๊ธฐ์กด Refresh Token์ ํ๊ธฐ๋๋ค.
RTR์ ๋์ ํ๋ ๊ฐ์ฅ ํฐ ์ด์ ๋ Refresh Token ํ์ทจ ๋ฐฉ์ง ๋ฐ ๋ณด์ ๊ฐํ์ด๋ค.
MSA ํ๊ฒฝ์์ Refresh Token์ด ์ ์ถ๋๋ฉด, ๊ณต๊ฒฉ์๊ฐ ๊ณ์ Access Token์ ์ฌ๋ฐ๊ธ๋ฐ์ ์ ์๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ Refresh Token์ ๋ง๋ฃ๊ธฐ๊ฐ์ด ๊ธธ๋ฉด ๊ธธ์๋ก, ๋ณด์์ ์ทจ์ฝํด์ง๋ค.
RTR์ ๋์๋ฐฉ์์ ๊ธฐ์กด์ JWT ๋ฐฉ์๊ณผ ํฌ๊ฒ ๋ค๋ฅธ ์ ์ด ์๋ค.
์ค์ํ ๋ถ๋ถ์ Access Token์ ๋ฐ๊ธ๋ฐ์ ๋ Refresh Token๋ ์๋กญ๊ฒ ๋ฐ๊ธ๋ฐ๊ณ ๊ธฐ์กด์ Refresh Token์ ํ๊ธฐํ๋ค๋ ์ ์ด๋ค. ์ด๋ ๊ฒ RTR์ ๋์ ํจ์ผ๋ก์จ Refresh Token ํ์ทจ ๋ฐ ์ฌ์ฌ์ฉ ๊ณต๊ฒฉ์ ํจ๊ณผ์ ์ผ๋ก ๋ฐฉ์ดํ ์ ์๋ค.
2๏ธโฃ UUID vs JWT Refresh Token
Refresh Token์ ๊ตฌํํ๋ ๋ฐฉ์์๋ ํฌ๊ฒ ๋ ๊ฐ์ง๊ฐ ์๋ค.
๐น1. JWT
JWT๋ Json Web Token์ ์ฝ์์ด๋ค.
์ฆ, ์ฌ์ฉ์์ ๋ํ ์ ๋ณด๋ฅผ payload์์ json์ ํํ๋ก ์ง์ด๋ฃ์ด์ ๊ด๋ฆฌํ๋ค.
ํด๋ ์ ๋ด๋ถ์ ์ ์ ์ ๋ณด(sub). ๋ง๋ฃ ์๊ฐ(exp)๋ฑ์ ํฌํจํ์ฌ Stateless ํ ๋ฐฉ์์ผ๋ก ๋์ํ๋๋ก ๊ตฌ์ฑํ๋ ๊ฒ์ด๋ค.
์ด๋, ์๋ฒ๋ Refresh Token์ payload๋ฅผ ๊ฒ์ฆ๋ง ํ๋ฉด ๋๋ฏ๋ก ๋ณ๋์ ์ ์ฅ์๊ฐ ํ์ํ์ง ์๋ค.
์์ ๋ฐฉ์์ผ๋ก ๊ด๋ฆฌํ๊ฒ ๋๋ค๋ฉด, ๋จ์ํ ํด๋ผ์ด์ธํธ์๊ฒ Refresh Token์ ๋ฐ๊ธํ๊ฒ ๋์์ ๋, ์ ํจ๊ธฐ๊ฐ์ด ๋ง๋ฃ๋ ๋๊น์ง ๊ณ์ํด์ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค. ๋ํ Statelessํ ๋ฐฉ์์ ์ง๋๊ณ ์๊ธฐ์ ์๋ฒ์ ๋ถํ๋ฅผ ์ฃผ์ง ์์ผ๋ฉฐ, MSA ํ๊ฒฝ์์ ํ์ฅ์ฑ์ด ๋ฐ์ด๋๋ค.
ํ์ง๋ง, ๋ณด์์์ ๋ฌธ์ ๋ก๋ ์ทจ์ฝํ๋ค.
Refresh Token์ด ํ์ทจ๋๋ฉด ๋ง๋ฃ๋ ๋๊น์ง ๊ณ์ ์ฌ์ฉ๊ฐ๋ฅํ๋ฉฐ, ํด๋ผ์ด์ธํธ๊ฐ ๋ก๊ทธ์์์ ์๋ํ์ ๋ Refresh Token์ ๋ฌด๋ ฅํ์ํฌ ์ ์๋ค. ๋ํ ์์ ๊ฐ์ด ๊ตฌํํ๊ฒ ๋๋ฉด RTR์ ์ ์ฉํ๊ธฐ๊ฐ ์ด๋ ต๊ฒ ๋๋ค.
๐น2. UUID
๊ทธ๋์ ์กฐ๊ธ ๋ ๋ณด์์ฑ์ ๋ถ๋ถ์ ์ ๊ฒฝ์ ์ด ๋ถ๋ถ์ด ๋ฐ๋ก UUID๋ฅผ ํ์ฉํ๋ ๋ฐฉ์์ด๋ค.
UUID: ์ ์ญ์์ ๊ณ ์ ํ ๊ฐ์ ์์ฑํ๋ ์๋ณ์์ด๋ค. ์์ธก์ด ์ด๋ ต๊ณ ์ํธํ์ ์ผ๋ก ์์ ํ ๋์๋ฅผ ์์ฑ ๊ฐ๋ฅํ๋ค.
๊ธฐ์กด์ JWT์ ๋ฐฉ์๊ณผ๋ ๋ค๋ฅด๊ฒ DB์ Refresh Token์ ์ ์ฅํ๊ณ Refresh Token์ด ํ์ํ ๋๋ง๋ค DB์์ ํด๋น Token์ ์กฐํํด ์ ํจ์ฑ์ ๊ฒ์ฆํ๋ ๋ฐฉ์์ด๋ค.
Refresh Token์ ์๋ฒ์์ ๊ด๋ฆฌํ๋ฏ๋ก ๋ณด์์ฑ์ด ๋๋ค. ๋ํ Access Token์ ๋ฐ๊ธ๋ฐ์ ๋ RTR์ ์ ์ฉํจ์ผ๋ก์จ Refresh Token์ ์ฌ๋ฐ๊ธํ๊ณ ์ด์ ์ Refresh Token์ ๋ํด์๋ DB์์ ์ญ์ ํจ์ผ๋ก์จ ๋ฌด๋ ฅํ์ํฌ ์ ์๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก ํด๋ผ์ด์ธํธ์์ ๋ก๊ทธ์์์ ์๋ํ์ ๋ ํด๋น Refresh Token์ ์ญ์ ํ ์ ์๋ค.
๋ค๋ง ์ด๋ ๊ฒ ๋ณด์์ฑ์ด ๋์์ง ๋์ ๊ธฐ์กด JWT์ Stateless์ ํน์ง์ ์์ด๋ฒ๋ฆฌ๊ณ Redis์ ๊ฐ์ ๋ณ๋์ ์ ์ฅ์๊ฐ ํ์ํ๋ค.
๋ํ MSA ํ๊ฒฝ์์ ์์ ๊ฐ์ ๊ตฌ์กฐ๋ก ๊ตฌํํ๋ ค๋ฉด Auth์ ๋ํ ์๋ฒ๋ฅผ ๋ณ๋๋ก ๋์ด ์งํํด์ผ ํ๋ค.
๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ UUID๋ก Refresh Token์ ๊ตฌํํ๋ ๋ฐฉ์์ ๊ธฐ์กด์ JWT ๋ฐฉ์์ ๋ณด์์ ์ธ ๋จ์ ์ ๋ณด์ํ ์ ์๋ ๋ฐฉ์์ด๋ฉฐ RTR์ ์ ์ฉํ ์ ์๋ ๋ฐฉ์์ด๋ค.
๐งUUID ๋ฐฉ์, Redis์ ์ ์ฅํ ๋ Key ์ ๋ต?
Redis์ ์ ์ฅํ ๋, Key์ ๋ต์ ์ด๋ป๊ฒ ๊ฐ์ ธ๊ฐ ๊ฒ์ธ์ง์ ๋ํ ๊ณ ๋ฏผ์ ํด๋ณด์๋ค.
์ด๋ฅผ ํตํด ์ผ๊ด๋ ํค ํจํด์ ์ฌ์ฉํ์ฌ ๊ด๋ฆฌ ๋ฐ ์กฐํ๋ฅผ ์ฝ๊ฒ ํ๋ ์ ๋ต์ ๋ฌ์ฑํ๊ณ ์ ํ์๋ค.
RedisConfig.kt
@Bean
fun redisTemplate(redisConnectionFactory: RedisConnectionFactory): RedisTemplate<String, Any> {
return RedisTemplate<String, Any>().apply {
connectionFactory = redisConnectionFactory
keySerializer = StringRedisSerializer()
hashKeySerializer = StringRedisSerializer(
valueSerializer = GenericJackson2JsonRedisSerializer()
hashValueSerializer = GenericJackson2JsonRedisSerializer()
}
}
์ฐ์ , UUID๋ก ์ ์ฅํ๊ธฐ ์ํด HashSet์ผ๋ก ๋ค์๊ณผ ๊ฐ์ด ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ๊ณ ์ ํ์๋ค.
(์ด๋, RefreshToken์ UUID ๊ธฐ๋ฐ์ผ๋ก ์์ฑ๋๋ ๋ฌธ์์ด์ด๋ค.)
Key | Filed | Value |
"RT::${refreshToken}-v1" | refreshToken | userId |
- Key = "RT::${refreshToken}-v1"
- RT: Refresh Token์ ์ ์ฅํ๋ Key์์ ๋ช ํํ๊ฒ ๋ํ๋ด๊ธฐ ์ํด Prefix(RT::)๋ฅผ ์ถ๊ฐํ์๋ค.
- ${refreshToken}: ๊ฐ Refresh Token์ด ๊ณ ์ ํ ๊ฐ์ ๊ฐ์ง๋๋ก UUID๋ฅผ Key์ ํฌํจํ์๋ค.
- v1: ๋ฒ์ ์ ๋ณด๋ฅผ ํฌํจํ์ฌ ํฅํ Refresh Token ๋ก์ง์ ๋ณ๊ฒฝํ ๋ ์ฝ๊ฒ ๊ด๋ฆฌ ๊ฐ๋ฅํ๋๋ก ํ๊ณ , ๋ฒ์ ์
ํ ๋ ํ ๋ฒ์ evict ํ ์ ์๋๋ก ํ์๋ค.
- ์: DEL RT::*-v1 → v1 Refresh Token ์ ์ฒด ์ญ์
- Filed = refreshToken
- refreshToken: ๊ณ ๊ฐ์ Filed์ ๋ฃ์์ผ๋ก์จ value๋ฅผ ์ฐพ๊ณ ์ ํ์๋ค.
(์์ ํ์ : ๊ตณ์ด Filed๊ฐ์ ํ์ ์๊ณ Key-Valueํ์์ผ๋ก ๊ตฌํํด๋ ์ข์ ๋ณด์ธ๋ค.)
- refreshToken: ๊ณ ๊ฐ์ Filed์ ๋ฃ์์ผ๋ก์จ value๋ฅผ ์ฐพ๊ณ ์ ํ์๋ค.
- Value = userId
- value์ userId๋ฅผ ์ง์ด๋ฃ์ด ์ถํ์ ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ํ ๋ userId๋ฅผ ๊บผ๋ด์ด ๋น๊ตํ ์ ์๋๋ก ํ์๋ค.
TokenService.kt
fun generateRefreshToken(userId: Long): String {
val expiryDate = Date(Date().time + jwtProperties.refreshTokenExpiration)
val refreshToken = UUID.randomUUID().toString()
val key = "RT::${refreshToken}-v1"
refreshTokenRepository.saveHash(key, refreshToken, userId, expiryDate.time);
return refreshToken
}
์์ ๊ฐ์ด Key, Filed, Value๋ฅผ ์์๋๋ก redis์ ์ ์ฅํจ์ผ๋ก์จ refreshToken์ ๊ด๋ฆฌํ ์ ์๋ค.
๋ํ Redis์ ttl์ ์ด์ฉํ์ฌ ์ ํจ๊ธฐ๊ฐ ๋ํ ์ค์ ํ ์ ์๋ค.
๐จํ ํฐ ๊ธฐ๋ฐ ์ธ์ฆ ๋ฐฉ์ ๋ณด์์ฑ ๊ฐํํ๋ ๋ค๋ฅธ ๋ฐฉ์๋ค
ํ ํฐ ๊ธฐ๋ฐ ์ธ์ฆ์ MSA ํ๊ฒฝ์์ ํ์ฅ์ฑ๊ณผ ์ฑ๋ฅ ๋ฉด์์ ๋ฐ์ด๋ ์ฅ์ ์ ์ ๊ณตํ์ง๋ง, ๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ ์ฌ์ ํ ๋ณด์์ ์ทจ์ฝํ ๋ถ๋ถ๋ค์ด ์กด์ฌํ๋ค.
ํนํ Refresh Token์ด ํ์ทจ๋ ๊ฒฝ์ฐ ๊ณต๊ฒฉ์๊ฐ ์ ํจํ Access Token์ ๋ฌดํ์ ์ฌ๋ฐ๊ธ๋ฐ์ ์ ์๊ธฐ ๋๋ฌธ์, ์ด๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํ ์ถ๊ฐ์ ์ธ ๋ณด์ ์กฐ์น๊ฐ ํ์ํ๋ค.
์์์ ๋ค๋ฃฌ RTR ๋ฐฉ์, Redis ๊ธฐ๋ฐ ์ ์ฅ ๋ฐฉ์ ์ด์ธ์๋, ๋ค์ํ ๋ณด์ ๊ฐํ ๊ธฐ๋ฒ์ ์ ์ฉํ์ฌ ๋ณด๋ค ์์ ํ ์ธ์ฆ ์์คํ ์ ๊ตฌ์ถํ ์ ์๋ค.
1. IP ๋ฐ ๋๋ฐ์ด์ค ์ ๋ณด๋ฅผ ํ์ฉํ Refresh Token ๊ฒ์ฆ
- Refresh Token์ ๊ฒ์ฆํ ๋, ์ฌ์ฉ์์ IP ์ฃผ์๋ User-Agent(๋ธ๋ผ์ฐ์ , ๋๋ฐ์ด์ค ์ ๋ณด)๋ฅผ ํจ๊ป ์ ์ฅํ๊ณ ๋น๊ตํ์ฌ ๋ณด์์ ๊ฐํํ ์ ์๋ค.
- ๋ง์ฝ Refresh Token ์์ฒญ ์ ๊ธฐ์กด์ ์ ๋ณด์ ๋ค๋ฅด๋ฉด, ์ถ๊ฐ์ ์ธ ์ธ์ฆ(OTP, ์ด๋ฉ์ผ ์ธ์ฆ)์ ์๊ตฌ
2. JWT ๋ฐฉ์์์ AccessToken์ RefreshToken์ Secret Key ๋ค๋ฅด๊ฒ ์ค์
- Access Token์ Refresh Token์ Secret Key๋ฅผ ๋ถ๋ฆฌํ์ฌ ๊ด๋ฆฌํ์ฌ ๋ณด์์ฑ ๊ฐํ
- Refresh Token์ Secret Key๋ Access Token์ Secret Key๋ฅผ ํ ๋ฒ ๋ ์ธ์ฝ๋ฉํด์ ์์ฑํ์ฌ,
Access Token์ด ์ ์ถ๋๋๋ผ๋ Refresh Token ๊ฒ์ฆ์ ๊ฐํํ ์ ์๋๋ก ์ค๊ณ