1. “์?” ๐ค
์ฐ๋ฆฌ๋ MySQL๊ณผ ๊ฐ์ ์ผ๋ฐ DB๋ฅผ ๋ค๋ฃฐ ์ค ์๋๋ฐ ์ฌ๋๋ค์
์ ๊ตณ์ด ๋ฆฌํ๋ ์ ํ ํฐ์ Redis์ ์ ์ฅํ์ฌ ์ฌ์ฉํ๋์ง ์ด์ ๊ฐ ๊ถ๊ธํ์ผ๋ฉฐ,
์ ๋ค๋ค Redis๋ฅผ ์ฌ์ฉํด์ ๋ฆฌํ๋ ์ ํ ํฐ์ ์ ์ฅํ๋ ์ง ๊ถ๊ธํ์ต๋๋ค.
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์์๋ ํ ํฐ์ด ์ญ์ ๋๋๋ก ํ์ฌ ๋ฐ์ดํฐ๋ฅผ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
- ๋์ฒด๋ก 30๋ถ~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์ด ๋ชจ๋ ์ญ์ ๋์์ ๋ ๋ฐ์ํ๋ ๊ฐ์ฅ ํฐ ์ฌ๊ฑด์ ๋ชจ๋ ์ ์ ๊ฐ ์ฌ๋ก๊ทธ์ธ์ ํด์ผํ๋ค๋ ์ ์ธ๋ฐ, ์ฌ๋งํด์ ์ ์์ด ๋์ด์ง ์ผ์ด ์์ฃผ ๋ฐ์ํ์ง ์๊ณ ๋๋ฌธ์ ์ ์ ๊ฒฝํ์ ๊ทธ๋ฆฌ ํฌ๋ฆฌํฐ์ปฌํ๊ฒ ์์ฉํ์ง ์๋๋ค๊ณ ์๊ฐํฉ๋๋ค.
๊ฒฐ๋ก ์ ์ผ๋ก ์์ ๊ฐ์ ์ด์ ๋ค์ ์ํด In-Memory DB์ ๊ด๋ฆฌํด๋ ์ถฉ๋ถํ ํจ์จ์ ์ด๋ผ๋ ๊ฐ์ธ์ ์๊ฐ์ด ์์ต๋๋ค.
4. ๊ทธ๋ผ RefreshToken์ ์ DB์ ์ ์ฅํด์ ์ฌ์ฉํ๋ ๊ฑด๋ฐ?
์ฐ์ ๋ฆฌํ๋ ์ ํ ํฐ๊ณผ ์์ธ์ค ํ ํฐ์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค.
- ์์ธ์ค ํ ํฐ ์๋ฒ์ API๋ฅผ ์ง์ ์์ฒญ(Access)ํ ๋ ์ฌ์ฉ
- ๋ฆฌํ๋ ์ ํ ํฐ ์์ธ์ค ํ ํฐ์ด ๋ง๋ฃ๋์์ ๋, ์์ธ์ค ํ ํฐ์ ์ฌ๋ฐ๊ธ(Refresh)ํ ๋ ์ฌ์ฉ
์ด ๋์ด ๋ถ๋ฆฌ๋ ์ด์ ๋ ๋ณด์์ ๋๋ค.
ํ ํฐ์ ํ์ทจ๋นํ๋ฉด ๋ค๋ฅธ ์ฌ๋์ด ๋ด ๊ณ์ ์ ๊ถํ์ ์ฌ์ฉํ์ฌ ์๋น์ค๋ฅผ ๋ง์๋๋ก ์ฌ์ฉํ ์ํ์ด ์๊ธฐ ๋๋ฌธ์ ์ ๋ ๋ ธ์ถ๋๋ฉด ์๋ฉ๋๋ค.
JWT ํ ํฐ์ Stateless๋ผ๋ API ์๋ฒ์ ํน์ง์ ์ํด ํ๋ฒ ๋ฐ๊ธ๋๋ฉด ๊ทธ ๋ค๋ก ํ ํฐ์ ์ํ์ ๋ํด ๊ด๋ฆฌํ ์ ์์ผ๋ฉฐ,
๊ทธ๋ ๋ค๋ณด๋ ํ์์ด ํ ํฐ์ ํตํด ์์ฒญ์ ๋ณด๋ธ ๊ฑด์ง, ํด์ปค๊ฐ ํ ํฐ์ ํ์ทจํด์ ์์ฒญ์ ๋ณด๋ธ ๊ฑด์ง ์ ์ ์์ต๋๋ค.
๋๋ฌธ์ ์ ์ ์ธ์ฆ ์ญํ ์ ๊ฐ์ง ์์ธ์ค ํ ํฐ์ ๋์ฒด๋ก ๋ง๋ฃ์๊ฐ์ ์งง๊ฒ ์ก์ต๋๋ค. (๋ณดํต 30๋ถ ~ 2์๊ฐ ์ ๋๋ก ์๊ฐํ๋๋ฐ, ์๋น์ค์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค)
์ด๋ฌํ ์์ธ์ค ํ ํฐ์ด ๋ง๋ฃ๋๋ฉด ๋ฆฌํ๋ ์ ํ ํฐ์ ํตํด ์๋ก์ด ์์ธ์ค ํ ํฐ์ ๋ฐ๊ธ๋ฐ๊ฒ ๋ฉ๋๋ค.
๋๋ฌธ์ ๋ฆฌํ๋ ์ ํ ํฐ์ ์์ธ์ค ํ ํฐ๋ณด๋ค ํจ์ฌ ๊ธด ๋ง๋ฃ์๊ฐ์ ๊ฐ์ง๋๋ค. (์ ๋ ๋ณดํต 1์ฃผ ~ 1๊ฐ์ ์ ๋๋ก ์๊ฐํ๋๋ฐ, ์๋น์ค์ ๋ฐ๋ผ ๋ค๋ฅผ ์ ์์ต๋๋ค)
4-1. ๊ทธ๋ผ ํ ํฐ์ด ํ์ทจ๋นํ๋ฉด ์ด๋ป๊ฒ ๋ ๊น์?
์์ธ์ค ํ ํฐ๋ง ํ์ทจ ๋นํ๋ค๋ฉด 30๋ถ ~ 2์๊ฐ ์ ๋๋ง ์ ์ ์ ๊ถํ์ ๋ง์๋๋ก ์ด์ฉํ๊ณ ๊ทธ ๋ค์ ์ฌ์ฉํ ์ ์์ง๋ง,
์์ธ์ค ํ ํฐ๊ณผ ๋ฆฌํ๋ ์ฌ ํ ํฐ์ด ๋ชจ๋ ํ์ทจ ๋นํ๋ฉด ํด์ปค๋ ๋ฆฌํ๋ ์ฌ ํ ํฐ์ด ๋ง๋ฃ๋๊ธฐ ์ ๊น์ง ๊ณ์ํด์ ์์ธ์ค ํ ํฐ์ ์ฌ๋ฐ๊ธํ๋ฉฐ ์ ์ ์ ๊ถํ์ ์ ์ฉํ ์ ์์ต๋๋ค.
4-2. ์ด๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ์ฐ๋ฆฌ๋ Refresh Token์ DB์ ์ ์ฅํด๋๊ณ ์ฌ์ฉํฉ๋๋ค.
์ฐ์ ์์ ๋ง ์ฒ๋ผ ๋ฐ์ดํฐ๋ฒ ์ด์ค(Redis)์ ์ ์ ์ ๋ณด์ Refresh Token์ ์ ์ฅํ์ฌ ์ฌ์ฉํฉ๋๋ค.
- Key: ์ ์ ์ ๋ณด
- Value: RefreshToken
๊ทธ๋ฆฌ๊ณ ์ด์ ํจ๊ป Refresh Token Rotation(RTR) ๋ฐฉ์์ผ๋ก ๋ฆฌํ๋ ์ฌ ํ ํฐ์ ๊ด๋ฆฌํ๋๋ก ์ค์ ํฉ๋๋ค.
RTR๋ฐฉ์์ Access Token์ด ๋ง๋ฃ๋์ด ์๋ก ๊ฐฑ์ ๋๋ ์์ ์ Refresh Token๋ ํจ๊ป ๊ฐฑ์ ์ํค๋๋ก ํ์ฌ Refresh Token์ 1ํ์ฉ์ผ๋ก ์ฌ์ฉํ๋ ๋ฐฉ์์ ๋๋ค.
์์ธํ ์์๋ณผ๊น์?
- ๋ก๊ทธ์ธ ์์ ์ ์ ๋ Access Token๊ณผ Refresh Token์ ์๋ต๋ฐ์ต๋๋ค.
(์ด๋ Redis์ Refresh Token์ด UserInfo:RefreshToken ํํ๋ก ์ ์ฅ๋ฉ๋๋ค.) - Access Token์ด ๋ง๋ฃ๋๋ฉด Refresh Token์ ํตํด Access Token๊ณผ Refresh Token์ ๊ฐฑ์ ํฉ๋๋ค.
(๊ฐฑ์ ๋ Refresh Token์ Redis์๋ ๋ฐ์๋ฉ๋๋ค.)
์ด๋ ๊ฒ ๊ด๋ฆฌํ๊ฒ ๋๋ฉด ํด์ปค๋ Refresh Token์ ํ์ทจํด๋, ์ค์ ํ์์ Access Token์ด ๋ง๋ฃ๋์ด ํ ํฐ์ ๊ฐฑ์ ํ๋ ์๊ฐ Redis์ Refresh Token์ด ๋ณ๊ฒฝ๋์ด ํด์ปค๊ฐ ํ์ทจํ ์ด์ ์ Refresh Token์ ๋ง๋ฃ๋์ด ํด์ปค๋ ๋์ด์ ํ ํฐ์ ์ฌ๋ฐ๊ธ ๋ฐ์ ์ ์์ต๋๋ค.
๋ฌผ๋ก ์ค์ ํ์์ด ํ ํฐ ํ์ทจ ์ดํ, ํ๋์ ๋ก๊ทธ์ธ์ ํ์ง ์๊ฒ ๋๋ฉด ๊ทธ ๋์์ ํด์ปค๊ฐ ๊ณ์ํด์ ํ์์ ๊ถํ์ ์ ์ฉํ ์ ์์ต๋๋ค.๋๋ฌธ์ Jwt Token์ ์ฌ์ฉํ ์์ฒญ์ ์ต๋ํ ์์ ํ๊ฒ ๋ง๋ค๊ธฐ ์ํด, HTTPS ์ค์ ๊ณผ JWT ํ ํฐ ๋ฐ๊ธ ์ httpOnly, Secure ์ค์ ์ ํ ์ฟ ํค๋ก ๋ฐ๊ธํ๋ ๋ฑ์ ๋ฐฉ์์ ํตํด์ ํ ํฐ ํ์ทจ ๊ฐ๋ฅ์ฑ์ ๋ฎ์ถฐ์ผํฉ๋๋ค.
5. Redis๋ @Transactional๋ก ํธ๋์ญ์ ์ค์ ์ด ๊ฐ๋ฅํ๊ฐ์?
Spring Data Redis์ ๊ณต์ ๋ฌธ์๋ฅผ ์ดํด๋ณธ ๊ฒฐ๊ณผ
Redis๋ ํธ๋์ญ์ ์ RedisConfig์ ์ถ๊ฐ์ ์ธ ์ค์ ์ ํตํด @Transactional๋ก ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค๋ ์ ์ ์๊ฒ ๋์์ต๋๋ค.
template.opsForValue().set("thing1", "thing2");
template.opsForValue().get("thing1");
ํ์ง๋ง JPA์ ๊ฐ์ด ์์์ฑ ์ปจํ ์คํธ์ 1์ฐจ ์บ์์ ๊ฐ์ ๊ธฐ๋ฅ์ ์ง์ํ์ง ์๊ธฐ ๋๋ฌธ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด ์์ ๊ฐ์ ์ํฉ์์๋ thing1์ด set() ๋ฉ์๋๋ก Redis์ Insert๋ ํ ํธ๋์ญ์ ์ด EXEC(commit) ๋์ง ์์๊ธฐ ๋๋ฌธ์
template.opsForValue().get("thing1"); ์ ๊ฒฐ๊ณผ๊ฐ null์ด ๋ฉ๋๋ค.
์์ธํ ๋ด์ฉ์ ์๋ ๊ณต์๋ฌธ์์์ ์ฐธ๊ณ ํ์ค ์ ์์ต๋๋ค.
https://docs.spring.io/spring-data/redis/reference/redis/transactions.html
๊ธ์ ๋ง์น๋ฉฐ
๊ฐ๋ฐ์ ํ๋ค๋ณด๋ฉฐ ๋๋ ๊ฒ์ ํญ์ 100% ์ข์ ๊ธฐ์ ์ด๋ ๋ฐฉ๋ฒ์ ์๋ค๋ ์ ์ ๋๋ค. ์ ๊ฐ ๋ง์๋๋ฆฐ ๋ถ๋ถ ์ด์ธ์๋ ์ฌ๋ฌ๋ถ๋ค์ด ์์ฝ๋ค๊ณ ๋๋ผ์ ๋ถ๋ถ๋ค์ด ์๋ค๋ฉด ๊ผญ ์ถ๊ฐํด์ ๋์ฑ ๊ฐ์ ๋ ํ๋ก๊ทธ๋จ์ ๋ง๋ค์ด๊ฐ๋ ๊ฐ๋ฐ์๋ก ์ฑ์ฅํ์ค ์ ์์ผ๋ฉด ์ข๊ฒ ์ต๋๋ค.
๊ธด ๊ธ ์ฝ์ด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค!
reference
'BackEnd > DB' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ชฝ๊ณ DB, ์คํ๋ง๋ถํธ] Springboot, MongoDB ์ฐ๋ (0) | 2023.01.22 |
---|---|
[MySQL] MySQL ์ํฌ๋ฒค์น ์ค์น ๋ฐ RDS ์ฐ๊ฒฐ (3) | 2022.04.14 |
[๋ฐ์ดํฐ๋ฒ ์ด์ค] ERD cloud ์ฌ์ฉ๋ฒ - ๋ฌด๋ฃ ERD ๋ชจ๋ธ๋ง ๋๊ตฌ (8) | 2022.01.10 |