[์ธ์ฆ/์ธ๊ฐ] RefreshToken์ ์ Redis๋ฅผ ์ฌ์ฉํด ๊ด๋ฆฌํ ๊น? (with. RTR ๋ฐฉ์)
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
๊ธ์ ๋ง์น๋ฉฐ
๊ฐ๋ฐ์ ํ๋ค๋ณด๋ฉฐ ๋๋ ๊ฒ์ ํญ์ 100% ์ข์ ๊ธฐ์ ์ด๋ ๋ฐฉ๋ฒ์ ์๋ค๋ ์ ์
๋๋ค. ์ ๊ฐ ๋ง์๋๋ฆฐ ๋ถ๋ถ ์ด์ธ์๋ ์ฌ๋ฌ๋ถ๋ค์ด ์์ฝ๋ค๊ณ ๋๋ผ์ ๋ถ๋ถ๋ค์ด ์๋ค๋ฉด ๊ผญ ์ถ๊ฐํด์ ๋์ฑ ๊ฐ์ ๋ ํ๋ก๊ทธ๋จ์ ๋ง๋ค์ด๊ฐ๋ ๊ฐ๋ฐ์๋ก ์ฑ์ฅํ์ค ์ ์์ผ๋ฉด ์ข๊ฒ ์ต๋๋ค.
๊ธด ๊ธ ์ฝ์ด์ฃผ์
์ ๊ฐ์ฌํฉ๋๋ค!
reference
https://puleugo.tistory.com/154
https://kth990303.tistory.com/431