1. โ์?โ ๐ค
์ฐ๋ฆฌ๋ MySQL๊ณผ ๊ฐ์ ์ผ๋ฐ DB๋ฅผ ๋ค๋ฃฐ ์ค ์๋๋ฐ ์ฌ๋๋ค์
์ ๊ตณ์ด ๋ฆฌํ๋ ์ ํ ํฐ์ Redis์ ์ ์ฅํ์ฌ ์ฌ์ฉํ๋์ง ์ด์ ๊ฐ ๊ถ๊ธํ์ผ๋ฉฐ,
์ ๋ค๋ค Redis๋ฅผ ์ฌ์ฉํด์ ๋ฆฌํ๋ ์ ํ ํฐ์ ์ ์ฅํ๋ ์ง ๊ถ๊ธํ์ต๋๋ค.
์ฐ์ JWT์ ๋ํด์ ์์ธํ ๋ชจ๋ฅด์๋ ๋ถ๋ค์ ํด๋น ํฌ์คํ
์ ์ฐธ๊ณ ํด์ ํ์ตํด์ฃผ์๋ฉด ๋์์ด ๋ ๊ฒ์
๋๋ค.
2. Redis๊ฐ ๋ญ๋ฐ?
๋ ๋์ค๋ ๋์คํฌ๊ฐ ์๋ ๋ฉ๋ชจ๋ฆฌ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ In-Memory ๋ฐฉ์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์
๋๋ค.
2-1. In-Memory?
In-Memory ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ MySQL๊ณผ ๊ฐ์ ๋ค๋ฅธ ์ผ๋ฐ DB๋ค์ฒ๋ผ SSD, HDD์ ๊ฐ์ ๋ณด์กฐ๊ธฐ์ต์ฅ์น๊ฐ ์๋, ํ๋ก์ธ์๊ฐ ์ง์ ์ก์ธ์คํ ์ ์๋ ์ปดํจํฐ์ ์ฃผ ๋ฉ๋ชจ๋ฆฌ์ธ RAM์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํฉ๋๋ค.
2-2. ๋์คํฌ์ ์ ์ฅํ๋ ๊ฒ๊ณผ ๋ฌด์จ์ฐจ์ด๊ฐ ์๋๋ฐ?
ํน์ ํ๋ก๊ทธ๋จ์ ์คํํ๋ฉด, ์๋์ ๊ฐ์ด ์ปดํจํฐ๋ ๋ณด์กฐ๊ธฐ์ต์ฅ์น์ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ฅผ RAM์ผ๋ก ๋ถ๋ฌ์ CPU๊ฐ ํด๋น ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ๊ณผ์ ์ผ๋ก ์คํ๋ฉ๋๋ค.
์ฌ๊ธฐ์ ์ฅ์ ์ด ํ์ฐํ ๋ณด์ด์ง ์๋์?
RAM์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ์ฌ ์ฌ์ฉํ๊ฒ ๋๋ฉด ๋ณด์กฐ๊ธฐ์ต์ฅ์น์์ ๋ฐ์ดํฐ๋ฅผ Loadํ๋ ๋น์ฉ์ด ์ ์ฝ๋ฉ๋๋ค.
๋๋ฌธ์ ์ธ๋ฉ๋ชจ๋ฆฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฝ๊ธฐ ๋ฐ ์ฐ๊ธฐ ์ฐ์ฐ์ ๊ธฐ์กด ๋์คํฌ ๊ธฐ๋ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ณด๋ค ํจ์ฌ ๋น ๋ฆ
๋๋ค.
ํ์ง๋ง ๋ณด์กฐ๊ธฐ์ต์ฅ์น์๋ ๋ค๋ฅด๊ฒ RAM์ ์ ์์ด ๋์ด์ง๋ฉด ๋ฐ์ดํฐ๊ฐ ์ ๋ถ ์ง์์ง๋ ํ๋ฐ์ฑ ๋ฉ๋ชจ๋ฆฌ(Volatile Memory)๋ผ๋ ํน์ง์ด ์๋ค!
3. Redis์ ํน์ง
- Key-Value์ ํํ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ด๊ธฐ ๋๋ฌธ์ ์ ์ ๋ฉ๋ชจ๋ฆฌ๋ก๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ์ ์์ผ๋ฉฐ, ์์ฑ ์๋๊ฐ ๋น ๋ฆ
- Key-Value ํํ๋ฅผ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ ํค๋ฅผ ์๊ณ ์๋ค๋ฉด ์กฐํ ์ฑ๋ฅ์ด O(1)๊น์ง ๋์จ๋ค๋ ์ฅ์ ์ ๊ฐ์ง
- ์ธ๋ฉ๋ชจ๋ฆฌ DB ๋ฐฉ์์ผ๋ก ๋น ๋ฅด๊ฒ ์ ๊ทผ์ด ๊ฐ๋ฅ
- ํ๋ฐ์ฑ์ธ In-Memory DB๋ ์๊ตฌ์ ์ผ๋ก ์ ์ฅ๋ ํ์๊ฐ ์๋ Refresh token์ ๊ด๋ฆฌํ๊ธฐ์ ์ถฉ๋ถ
- ์บ์์ฒ๋ผ ๋ฐ์ดํฐ ๋ง๋ฃ์ผ์ ์ ํ ์ ์์
3-1. Redis์ ํน์ง์ด Refresh Token ๋ณด๊ด์ ์ด์ ์ด ๋๋ ์ด์
์ด๋ฌํ Redis์ ํน์ง์ ํ ๋๋ก Refresh Token์ ๋ณด๊ดํ๋ ๊ฒ์ด ์ ํฉํ ์ด์ ๋ฅผ ์ค๋ช ํด๋ณด์๋ฉด ์๋์ ๊ฐ์ต๋๋ค.
- ์ฐ์ RDB์๋ ๋ค๋ฅด๊ฒ ๋ฐ์ดํฐ์ ๋ง๋ฃ์ผ์ ์ง์ ํ ์ ์์ต๋๋ค. ์ด๋ฅผ TTL(Time-To-Live)์ด๋ผ๊ณ ํ๋๋ฐ, ์ด๋ฅผ ํ ํฐ์ ๋ง๋ฃ์ผ๊ณผ ๋๊ฐ์ด ๋ง์ถฐ๋์ด ๊ด๋ฆฌํ๋ฉด ํ ํฐ์ด ๋ง๋ฃ๋๋ฉด Redis์์๋ ํ ํฐ์ด ์ญ์ ๋๋๋ก ํ์ฌ ๋ฆฌ์์ค๋ฅผ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์์ต๋๋ค. (๋ง๋ฃ๋ ํ ํฐ๊น์ง ๊ฐ๊ณ ์๋๋ก ํด์ ๋ฆฌ์์ค๋ฅผ ๋ญ๋นํ ํ์๋ ์์์์~)
- ๋์ฒด๋ก 15๋ถ~2์๊ฐ ๋จ์๋ก ๊ฐฑ์ ํ๋ JWT Access Token์ ์๋กญ๊ฒ ๊ฐฑ์ ํ๊ธฐ ์ํด Refresh Token์ด ํ์ํฉ๋๋ค.
์ด๋ ๊ฒ ํธ์ถ์ ๋น๋๊ฐ ๋์ฒด์ ์ผ๋ก ๋์ Refresh Token์ RDB์ ์ ์ฅํ๋ ๊ฒ๋ณด๋ค In-Memory DB์ ์ ์ฅํด๋๊ณ ์ฌ์ฉํ๋ ๊ฒ์ด ํจ์ฌ ์๋๊ฐ ๋น ๋ฅด๊ณ , ํ ํฐ ReIssue ๋ก์ง์ ๋ณ๋ชฉํ์์ ๋ฐฉ์งํ ์ ์๋ค์ต๋๋ค. - ๋ชจ๋ ๊ธฐ์ ์ฌ์ฉ์๋ ํธ๋ ์ด๋ ์คํ๊ฐ ์กด์ฌํฉ๋๋ค. RDB vs In-Memory DB์ ํธ๋ ์ด๋ ์คํ๋ ์๋์ ์์ ์ฑ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
In-Memory ๋ฐฉ์์ ๊ต์ฅํ ๋ฐ์ด๋ ์กฐํ ์๋๋ฅผ ์ป์ ์ ์์ด ํธ์ถ์ ๋น๋๊ฐ ๋์ ํ ํฐ ReIssue ๋ก์ง์ ๋ณ๋ชฉํ์์ ๋ฐฉ์งํ ์ ์์ต๋๋ค. ํ์ง๋ง In-Memory DB๋ ํ๋ฐ์ฑ ๋ฉ๋ชจ๋ฆฌ์ด๊ธฐ ๋๋ฌธ์ ์ ์์ด ๋์ด์ง๋ฉด ๋ฐ์ดํฐ๊ฐ ์ ๋ถ ์ง์์ง๋๋ค.
๊ทธ๋ฐ๋ฐ ๋จ์ง Refresh Token๋ง์ ๊ด๋ฆฌํ๊ธฐ ์ํด Redis๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ์ด ํธ๋ ์ด๋ ์คํ๋ ์์ค๋ณด๋ค ์ด๋์ด ๋ ํด ์๋ ์์ต๋๋ค. Refresh Token์ด ๋ชจ๋ ์ญ์ ๋์์ ๋ ๋ฐ์ํ๋ ๊ฐ์ฅ ํฐ ์ฌ๊ฑด์ ๋ชจ๋ ์ ์ ๊ฐ ์ฌ๋ก๊ทธ์ธ์ ํด์ผํ๋ค๋ ์ ์ธ๋ฐ, ์ฌ๋งํด์ ์ ์์ด ๋์ด์ง ์ผ์ด ์์ฃผ ๋ฐ์ํ์ง ์๊ณ ๋๋ฌธ์ ์ ์ ๊ฒฝํ์ ๊ทธ๋ฆฌ ํฌ๋ฆฌํฐ์ปฌํ๊ฒ ์์ฉํ์ง ์๋๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ฌ์ง์ด Master/Slave ๋ณต์ ๊ตฌ์กฐ๋ฅผ ๋ง๋ค์ด๋์ผ๋ฉด Slave์ Master์ ๋ณ๊ฒฝ์ด ๋ฐ์๋๋ค๊ฐ Master์ ์ฅ์ ๋ฐ์ ์, Slave๋ก FailOver๋์ด ๋ฐ์ดํฐ๋ฅผ ๊ฑฐ์ ๊ทธ๋๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
๊ฒฐ๋ก ์ ์ผ๋ก ์์ ๊ฐ์ ์ด์ ๋ค์ ์ํด In-Memory DB์ ๊ด๋ฆฌํด๋ ์ถฉ๋ถํ ํจ์จ์ ์ด๋ผ๋ ๊ฐ์ธ์ ์๊ฐ์ด ์์ต๋๋ค.
4. ๊ทธ๋ผ RefreshToken์ ์ DB์ ์ ์ฅํด์ ์ฌ์ฉํ๋ ๊ฑด๋ฐ?
์ฐ์ ๋ฆฌํ๋ ์ ํ ํฐ๊ณผ ์์ธ์ค ํ ํฐ์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค.
- ์์ธ์ค ํ ํฐ: ์๋ฒ์ API๋ฅผ ์ง์ ์์ฒญ(Access)ํ ๋ ์ฌ์ฉ
- ๋ฆฌํ๋ ์ ํ ํฐ ์์ธ์ค ํ ํฐ์ด ๋ง๋ฃ๋์์ ๋, ์์ธ์ค ํ ํฐ์ ์ฌ๋ฐ๊ธ(Refresh)ํ ๋ ์ฌ์ฉ
์ด ๋์ด ๋ถ๋ฆฌ๋ ์ด์ ๋ ๋ณด์์
๋๋ค.
ํ ํฐ์ ํ์ทจ๋นํ๋ฉด ๋ค๋ฅธ ์ฌ๋์ด ๋ด ๊ณ์ ์ ๊ถํ์ ์ฌ์ฉํ์ฌ ์๋น์ค๋ฅผ ๋ง์๋๋ก ์ฌ์ฉํ ์ํ์ด ์๊ธฐ ๋๋ฌธ์ ์ ๋ ๋
ธ์ถ๋๋ฉด ์๋ฉ๋๋ค.
JWT ํ ํฐ์ Stateless๋ผ๋ HTTP์ ํน์ง์ ์ํด ํ๋ฒ ๋ฐ๊ธ๋๋ฉด ๊ทธ ๋ค๋ก ํ ํฐ์ ์ํ์ ๋ํด ๊ด๋ฆฌํ ์ ์์ผ๋ฉฐ,
๊ทธ๋ ๋ค๋ณด๋ ํ์์ด ํ ํฐ์ ํตํด ์์ฒญ์ ๋ณด๋ธ ๊ฑด์ง, ํด์ปค๊ฐ ํ ํฐ์ ํ์ทจํด์ ์์ฒญ์ ๋ณด๋ธ ๊ฑด์ง ์ ์ ์์ต๋๋ค.
๋๋ฌธ์ ์ ์ ์ธ์ฆ ์ญํ ์ ๊ฐ์ง ์์ธ์ค ํ ํฐ์ ๋์ฒด๋ก ๋ง๋ฃ์๊ฐ์ ์งง๊ฒ ์ก์ต๋๋ค. (๋ณดํต 30๋ถ ~ 2์๊ฐ ์ ๋๋ก ์๊ฐํ๋๋ฐ, ์๋น์ค์ ๋ฐ๋ผ ๋ค๋ฆ
๋๋ค)
์ด๋ฌํ ์์ธ์ค ํ ํฐ์ด ๋ง๋ฃ๋๋ฉด ๋ฆฌํ๋ ์ ํ ํฐ์ ํตํด ์๋ก์ด ์์ธ์ค ํ ํฐ์ ๋ฐ๊ธ๋ฐ๊ฒ ๋ฉ๋๋ค.
๋๋ฌธ์ ๋ฆฌํ๋ ์ ํ ํฐ์ ์์ธ์ค ํ ํฐ๋ณด๋ค ํจ์ฌ ๊ธด ๋ง๋ฃ์๊ฐ์ ๊ฐ์ง๋๋ค. (์ ๋ ๋ณดํต 1์ฃผ ~ 1๊ฐ์ ์ ๋๋ก ์๊ฐํ๋๋ฐ, ์๋น์ค์ ๋ฐ๋ผ ๋ค๋ฅผ ์ ์์ต๋๋ค)
4-1. ๊ทธ๋ผ ํ ํฐ์ด ํ์ทจ๋นํ๋ฉด ์ด๋ป๊ฒ ๋ ๊น์?
์์ธ์ค ํ ํฐ๋ง ํ์ทจ ๋นํ๋ค๋ฉด 30๋ถ ~ 2์๊ฐ ์ ๋๋ง ์ ์ ์ ๊ถํ์ ๋ง์๋๋ก ์ด์ฉํ๊ณ ๊ทธ ๋ค์ ์ฌ์ฉํ ์ ์์ง๋ง,
์์ธ์ค ํ ํฐ๊ณผ ๋ฆฌํ๋ ์ฌ ํ ํฐ์ด ๋ชจ๋ ํ์ทจ ๋นํ๋ฉด ์ต์
์ ๊ฒฝ์ฐ ํด์ปค๋ ๊ณ์ํด์ ์์ธ์ค ํ ํฐ์ ์ฌ๋ฐ๊ธํ๋ฉฐ ์ ์ ์ ๊ถํ์ ์
์ฉํ ์ ์์ต๋๋ค.
4-2. ์ด๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ์ฐ๋ฆฌ๋ Refresh Token์ DB์ ์ ์ฅํด๋๊ณ ์ฌ์ฉํฉ๋๋ค.
์ฐ์ ์์ ๋ง ์ฒ๋ผ ๋ฐ์ดํฐ๋ฒ ์ด์ค(Redis)์ ์ ์ ์ ๋ณด์ Refresh Token์ ์ ์ฅํ์ฌ ์ฌ์ฉํฉ๋๋ค.
- Key: ์ ์ ๊ณ ์ ์ ๋ณด (ex. member Entity ID)
- Value: RefreshToken
๊ทธ๋ฆฌ๊ณ ์ด์ ํจ๊ป Refresh Token Rotation(RTR) ๋ฐฉ์์ผ๋ก ๋ฆฌํ๋ ์ฌ ํ ํฐ์ ๊ด๋ฆฌํ๋๋ก ์ค์ ํฉ๋๋ค.
RTR ๋ฐฉ์์ RefreshToken์ DB์์ ๊ด๋ฆฌํ ๋ ์ ์ฉํ ์ ์๋ ๋ฐฉ์์
๋๋ค.
ํ๋ก์ฐ๋ฅผ ์ดํด๋ณผ๊น์?
(์ข) ํ ํฐ ์ ์ฅ ๋ฐ ๊ฐฑ์ ํ๋ก์ฐ / (์ฐ) RefreshToken ๋ง๋ฃ ์ ํ๋ก์ฐ
Access Token์ด ๋ง๋ฃ๋์ด ํ ํฐ์ ๊ฐฑ์ ์ํค๋ ์์ ์
ํด๋ผ์ด์ธํธ๋ ํ ํฐ ๊ฐฑ์ ์ ์ํด ํ ํฐ ๊ฐฑ์ API ์ AccessToken, RefreshToken์ ๋ด์ ์ ์กํฉ๋๋ค.
์ ๋ฌ๋ฐ์ ํ ํฐ์ ์ ํจ์ฑ ๊ฒ์ฌ๊ฐ ์๋ฃ๋๋ฉด, AccessToken์ ํตํด ์ ์ ์ ๋ณด(member PK)๋ฅผ ์ป๊ณ ,
DB์์ ์ ์ ์ ๋ณด์ ํด๋นํ๋ Refresh Token ์ ์กฐํํด์ต๋๋ค.
์ด๋ 'DB์์ ์กฐํํด์จ Refresh Token'๊ณผ ํด๋ผ์ด์ธํธ์์ '์์ฒญ์ ๋ด์ ๋ณด๋ธ Refresh Token' ์ด ๋์ผํ๋ค๋ฉด ํ ํฐ์ ์ฌ๋ฐ๊ธํฉ๋๋ค.
์๋ก ๋ฐ๊ธ๋ Access Token, RefreshToken์ ํด๋ผ์ด์ธํธ ์ธก์ ์ ์ก๋๋ฉฐ, ์๋ก์ด RefreshToken์ DB์ ๊ฐฑ์ ๋ฉ๋๋ค.
์ด๋ ๊ฒ ๊ด๋ฆฌํ๋ ๊ฒฝ์ฐ Refresh Token์ 1ํ์ฉ์ผ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
๊ทธ๋ ๋ค๋ฉด ์ด๋ป๊ฒ RTR ๋ฐฉ์์ผ๋ก ์ด๋ป๊ฒ ํ์ทจ๋ก ์ธํ ํผํด๋ฅผ ๋ฐฉ์งํ ์ ์๋๊ฑธ๊น์?
ํ์ทจ ํ๋ก์ฐ๋ฅผ ํตํด ์ดํด๋ณด๊ฒ ์ต๋๋ค.
1. ๋ก๊ทธ์ธ ์์ ์ ์ ๋ Access Token๊ณผ Refresh Token์ ์๋ต๋ฐ์ต๋๋ค.
(์ด๋ Redis์ Refresh Token์ด MemberId(Key):RefreshToken(Value) ํํ๋ก ์ ์ฅ๋ฉ๋๋ค.
2. ์ด๋ ์ ์ ์๊ฒ AccessToken, Refresh Token์ ์ ๋ฌํ๋ ๊ณผ์ ์์ ํด์ปค๊ฐ ํ ํฐ์ ํ์ทจํฉ๋๋ค.
3. ํด์ปค๋ ํ์ทจํ AccessToken์ ํตํด ์ ์ ์ ๊ถํ์ ์ฌ์ฉํ๋ ์ค ํ ํฐ์ด ๋ง๋ฃ๋์์ต๋๋ค.
(์ด๋ ๋น์ฐํ ๊ฐ์ ํ ํฐ์ ์ฌ์ฉํ๋ ์ ์ ๋ ๋ง๋ฃ๊ฐ ๋ฉ๋๋ค.)
์ด๋ ์ ์ ๊ฐ ๋จผ์ ํ ํฐ์ ๊ฐฑ์ ํ๋ ๊ฒฝ์ฐ(4-1)์ ํด์ปค๊ฐ ๋จผ์ ํ ํฐ์ ๊ฐฑ์ ํ๋ ๊ฒฝ์ฐ(4-2) ๋ก ๋ ๊ฐ์ง ์ํฉ์ด ์์ ์ ์์ต๋๋ค.
4-1. ์ด๋ ์ ์ ๊ฐ ๋จผ์ ํ ํฐ์ ๊ฐฑ์ ํ๋ ๊ฒฝ์ฐ, DB์ RefreshToken๋ ๊ฐฑ์ ๋๋ฉฐ
์ดํ์ ํด์ปค๊ฐ ํ ํฐ ๊ฐฑ์ ์ ์์ฒญํ์ ๋ DB์ ์ ์ฅ๋ RefreshToken๊ณผ ํด์ปค๊ฐ ๊ฐฑ์ ์ ์ํด ์์ฒญ์ ๋ด์๋ณด๋ธ RefreshToken์ด ๋ฌ๋ผ์ ํ ํฐ ๊ฐฑ์ ์ ์คํจํฉ๋๋ค.
4-2. ํด์ปค๊ฐ ๋จผ์ ํ ํฐ์ ๊ฐฑ์ ํ๋ ๊ฒฝ์ฐ, DB์ RefreshToken๋ ๊ฐฑ์ ๋๋ฉฐ
์ดํ์ ์ ์ ๊ฐ ํ ํฐ ๊ฐฑ์ ์ ์์ฒญํ์ ๋ DB์ ์ ์ฅ๋ RefreshToken๊ณผ ์ ์ ๊ฐ ๊ฐฑ์ ์ ์ํด ์์ฒญ์ ๋ด์๋ณด๋ธ RefreshToken์ด ๋ฌ๋ผ์ ํ ํฐ ๊ฐฑ์ ์ ์คํจํฉ๋๋ค.
๊ทธ๋ผ ์ ์ ๋ ๋ค์ ๋ก๊ทธ์ธํด์ผ ํ๋ฉฐ, ์ฌ๋ก๊ทธ์ธ ์์ DB์ RefreshToken๋ ๊ฐฑ์ ๋์ด ๊ณต๊ฒฉ์๊ฐ ๊ฐ์ง RefreshToken๊ณผ DB์ RefreshToken์ ์ํ๊ฐ ๋ฌ๋ผ์ง๋๋ค.
๋๋ฌธ์ ํด์ปค๋ ๋ค์ ํ ํฐ ๊ฐฑ์ ์์ ์คํจํ๊ฒ ๋๋ฉฐ ์ ์ ์ ๊ถํ์ ์
์ฉํ ์ ์๊ฒ๋ฉ๋๋ค.
์ด๋ ๋ฏ RTR ๋ฐฉ์์ผ๋ก RefreshToken์ ๊ด๋ฆฌํ๊ฒ ๋๋ฉด
ํด์ปค๊ฐ Refresh Token์ ํ์ทจํด๋, ์ค์ ํ์์ Access Token์ด ๋ง๋ฃ๋์ด ํ ํฐ์ ๊ฐฑ์ ํ๋ ์๊ฐ Redis์ Refresh Token์ด ๋ณ๊ฒฝ๋์ด ํด์ปค๊ฐ ํ์ทจํ ์ด์ ์ Refresh Token์ ๋ง๋ฃ๋์ด ํด์ปค๋ ๋์ด์ ํ ํฐ์ ์ฌ๋ฐ๊ธ ๋ฐ์ ์ ์์ต๋๋ค.
๋ฌผ๋ก ์ค์ ํ์์ด ํ ํฐ ํ์ทจ ์ดํ, ํ๋์ ๋ก๊ทธ์ธ์ ํ์ง ์๊ฒ ๋๋ฉด ๊ทธ ๋์์ ํด์ปค๊ฐ ๊ณ์ํด์ ํ์์ ๊ถํ์ ์ ์ฉํ ์ ์์ต๋๋ค.๋๋ฌธ์ HTTPS ์ค์ ์ด๋ httpOnly, Secure ์ค์ ์ ํ ์ฟ ํค๋ก JWT ํ ํฐ์ ๋ฐ๊ธํ๋ ๋ฑ์ ๋ฐฉ๋ฒ์ผ๋ก
ํต์ ๊ณผ์ ์ ์์ ์ฑ์ ๊ณ ๋ คํด์ผ ํ๋ฉฐ, ํ ํฐ ํ์ทจ ๊ฐ๋ฅ์ฑ์ ๋ฎ์ถ๊ธฐ ์ํด ๋ ธ๋ ฅํด์ผํฉ๋๋ค.
5. Redis๋ @Transactional๋ก ํธ๋์ญ์ ์ค์ ์ด ๊ฐ๋ฅํ๊ฐ์?
Spring Data Redis์ ๊ณต์ ๋ฌธ์๋ฅผ ์ดํด๋ณธ ๊ฒฐ๊ณผ
Redis๋ ํธ๋์ญ์
์ RedisConfig์ ์ถ๊ฐ์ ์ธ ์ค์ ์ ํตํด @Transactional๋ก JPA์ ํ๋์ ํธ๋์ญ์
์ผ๋ก ๋ฌถ์ด ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค๋ ์ ์ ์๊ฒ ๋์์ต๋๋ค.
template.opsForValue().set("thing1", "thing2");
template.opsForValue().get("thing1");
ํ์ง๋ง JPA์ ๊ฐ์ด ์์์ฑ ์ปจํ
์คํธ์ 1์ฐจ ์บ์์ ๊ฐ์ ๊ธฐ๋ฅ์ ์ง์ํ์ง ์๊ธฐ ๋๋ฌธ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด ์์ ๊ฐ์ ์ํฉ์์๋ thing1์ด set() ๋ฉ์๋๋ก Redis์ Insert๋ ํ ํธ๋์ญ์
์ด EXEC(commit) ๋์ง ์์๊ธฐ ๋๋ฌธ์
template.opsForValue().get("thing1"); ์ ๊ฒฐ๊ณผ๊ฐ null์ด ๋ฉ๋๋ค.
JPA๋ DB์ flush ๋์ง ์์๋ 1์ฐจ ์บ์์ ์ ๋ณด๊ฐ ๋ด๊ฒจ์,
์กฐํ ์์ 1์ฐจ ์บ์์ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์ง๋ง Redis๋ 1์ฐจ ์บ์๋ผ๋ ๊ฒ์ด ์กด์ฌํ์ง ์์์
DB์ ์ปค๋ฐ๋๊ธฐ ์ ์๋ ํ๋์ ํธ๋์ญ์ ๋ด์์ ๋ฐ์ํ ๋ณ๊ฒฝ์ ์กฐํํด์ฌ ์ ์์ต๋๋ค.
์์ธํ ๋ด์ฉ์ ์๋ ๊ณต์๋ฌธ์์์ ์ฐธ๊ณ ํ์ค ์ ์์ต๋๋ค.
https://docs.spring.io/spring-data/redis/reference/redis/transactions.html
6. ๊ทธ๋ผ ๊ผญ ์ ์ฉํด์ผํด์?
ํด๋น ๊ธ๋ก ์ธํด ์๋ฌด ๊ทผ๊ฑฐ์์ด Redis๋ฅผ ์ ์ฉํ๋ ์ฌ๋ก๊ฐ ๋ฐ์ํ๊ณ ์๋ ๊ฒ์ ๋ฐ๊ฒฌํด ์ด ๋ด์ฉ์ ์ถ๊ฐํฉ๋๋ค. (2024.11.05)
์ ๋ ์๋์!!!!
๋ชจ๋ ๊ธฐ์ ์ ์์ธ๊ณผ ๊ทผ๊ฑฐ๊ฐ ์์ ๋ ์ ์ฉํด์ผ ํฉ๋๋ค.
Redis์ ๊ฐ์ฅ ํฐ ์ด์ ์ ๋น ๋ฅธ ์ฒ๋ฆฌ ์๋์
๋๋ค.
์๋ก์ด ๊ธฐ์ ์ ๋์
ํ๋ ค๋ฉด ๊ทธ ๊ธฐ์ ์ ์ด์ ์ด ํ์ํ ์ํฉ์ด ์์ด์ผ ํฉ๋๋ค. ์ผ๋ฐ์ ์ธ ์ํฉ์์ RDBMS๋ก๋ Token ReIssue์์ ์ถฉ๋ถํ ๋น ๋ฅธ ์๋๋ฅผ ๋ผ ์ ์์ต๋๋ค.
์ ๊ฐ Redis๋ฅผ ๋์
ํ๊ฒ ๋ ์ด์ ๋ ํ๋ก์ ํธ๋ฅผ ๊ฐ๋ฐํ๋ฉด์ '์ ์ ๋ก๋ถํฐ ๋์์ Token ReIssue ์์ฒญ์ด 3000ํ ๋ฐ์ํ๋ค' ๋ผ๋ Worst Case๋ฅผ ๊ณ ๋ คํ๊ธฐ ๋๋ฌธ์
๋๋ค.
๋น์ ๊ฐ๋ฐํ๋ ํ๋ก์ ํธ์ ์ ์ ๋ฅผ 1๋
๋ด์ 3000๋ช
์ ๋ ๋ชจ์ ๊ฒ์ผ๋ก ์์ธกํ๊ธฐ ๋๋ฌธ์ ๊ทธ ์ง์ ๊น์ง ๊ณ ๋ คํด์ ์ํคํ
์ฒ๋ฅผ ์ค๊ณํ์ต๋๋ค.
Worst Case ์ง์ ์์ Disk I/O์ ๋ฎ์ ์ฑ๋ฅ, ์ฌ์ฉ ๊ฐ๋ฅํ DB Connection ๊ฐ์๊ฐ ์ ํ๋์ด์๋ค๋ ํน์ง์ด ๋ณ๋ชฉ์ ๋ฐ์์ํฌ ์ ์์ ๊ฒ๊ฐ๋ค๊ณ ์์ํ์ด์.
ํด๋น ํ๋ก์ ํธ๋ 2์ฃผ๊ฐ์ ์ฅ๊ธฐ ํด์ปคํค์์ ๊ฐ๋ฐ๋ ํ๋ก์ ํธ์๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ ์์ธก๋ง์ผ๋ก ์ ์ฉํด์ ์์ฌ์ด ๋ถ๋ถ์ด ์์์ต๋๋ค.
ํ์ง๋ง ์ค์ ๋ก ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋์ง ๋ถ์ํ๊ธฐ ์ํด ํ๋ก์ ํธ ๋น์์ ์ฌ์ฉํ EC2 t2.micro ํ๊ฒฝ์ ์๋๋๋ผ๋ MacBook M1 Pro (CPU 10) ํ๊ฒฝ์์ ๋์ผํ ํ๊ฒฝ์ ๊ตฌ์ถํ์ฌ ์ง์ ๋ถํ ํ
์คํธ๋ฅผ ์งํํด๋ณด์์ต๋๋ค.
0.1์ด ์ฃผ๊ธฐ๋ก ์๋ฒ์ ์ด 3000ํ์ Token ReIssue ์์ฒญ์ ์ ๋ฌํ์์ผ๋ฉฐ
๊ทธ ๊ฒฐ๊ณผ RDBMS๋ฅผ ํตํ Token ReIssue๋ 5์ด, Redis๋ 3์ด์ ๊ฑธ์ณ ์ฒ๋ฆฌ๊ฐ ๋๋ ๊ฒ์ ์ ์ ์์์ต๋๋ค.
์ด๋ vCPU๊ฐ 2๊ฐ์ธ t2.micro ํ๊ฒฝ์์๋ ๋ ์๋ฏธ์๋ ์ฐจ์ด๋ฅผ ๋ง๋ค ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ต๋๋ค.
์ฌ์ค ์ ๊ฐ ์ฌ์ฉํ๋ ๊ทผ๊ฑฐ๋ ๋น์ ๊ฐ๋ฐ์ ๊น์ ์ง์์ด ๋ถ์กฑํด ์๋ฒฝํ ๊ทผ๊ฑฐ๋ ์๋์ง ๋ชฐ๋ผ๋ ์ถฉ๋ถํ ์๋ฏธ์๋ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์์์ต๋๋ค.
์ ๊ฐ ๋๋ฆฌ๊ณ ์ถ์ ๋ง์์ ๊ทผ๊ฑฐ๊ฐ ํ๋ฆฌ๋๋ผ๋ ํ์์ ์ํด ์ฌ์ฉํ์๋ฉด ์ข๊ฒ ๋ค๋ ์ด์ผ๊ธฐ์
๋๋ค.
"์ด? Redis ์ฐ๋ฉด ๋น ๋ฅด๋ค! ๋๋ ์จ์ผ์ง!" ๊ฐ ์๋๋ผ "์ด ์ง์ ์์ ๋ณ๋ชฉ์ด ๋ฐ์ํ ์ ์์ผ๋ ํ ๋ฒ ๊ณ ๋ คํด๋ณผ๊น?" ๊ฐ ๋์ด์ผ ํ๋ค๋ ๊ฒ์
๋๋ค.
ํญ์ ์ด ๋ถ๋ถ ๊ณ ๋ คํ์ฌ ์ ์ฉํด๋๊ฐ๋ ๊ฑด๊ฐํ ๊ฐ๋ฐ์ต๊ด์ ๊ฐ์ง ๊ฐ๋ฐ์๋ก ํจ๊ป ์ฑ์ฅํด๋๊ฐ๊ธธ ๋ฐ๋ผ๊ฒ ์ต๋๋ค.
๊ธ์ ๋ง์น๋ฉฐ
๊ฐ๋ฐ์ ํ๋ค๋ณด๋ฉฐ ๋๋ ๊ฒ์ ํญ์ 100% ์ข์ ๊ธฐ์ ์ด๋ ๋ฐฉ๋ฒ์ ์๋ค๋ ์ ์
๋๋ค. ์ ๊ฐ ๋ง์๋๋ฆฐ ๋ถ๋ถ ์ด์ธ์๋ ์ฌ๋ฌ๋ถ๋ค์ด ์์ฝ๋ค๊ณ ๋๋ผ์ ๋ถ๋ถ๋ค์ด ์๋ค๋ฉด ๊ผญ ์ถ๊ฐํด์ ๋์ฑ ๊ฐ์ ๋ ํ๋ก๊ทธ๋จ์ ๋ง๋ค์ด๊ฐ๋ ๊ฐ๋ฐ์๋ก ์ฑ์ฅํ์ค ์ ์์ผ๋ฉด ์ข๊ฒ ์ต๋๋ค.
๊ธด ๊ธ ์ฝ์ด์ฃผ์
์ ๊ฐ์ฌํฉ๋๋ค!
reference
https://puleugo.tistory.com/154
https://kth990303.tistory.com/431
'BackEnd' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
ํ๋ก์(Proxy) ์๋ฒ๋? (0) | 2024.05.19 |
---|---|
ํ ์คํธ๋ฅผ ์ํ ๊ฐ์ฒด, ํ ์คํธ ๋๋ธ(Test Double) (0) | 2024.04.04 |
WAS(Web Application Server)๋ ๋ฌด์์ธ๊ฐ (0) | 2023.01.02 |
์ ์์ผ๊ณผ ํ ์คํธ ๋ฐฉ๋ฒ๋ก (TDD & BDD) (1) | 2022.06.29 |
ํฌ์คํธ๋งจ(Postman) ์ฌ์ฉํด์ ์นด์นด์ค ์์ธ์ค ํ ํฐ ๋ฐ๊ธฐ! (1) | 2022.02.10 |