2023. 4. 21. 15:33ใ๐ Web
I. ์๋ก
- JWT์ Session ๋น๊ต ๋ฐ JWT์ ์ฅ์ ์๊ฐ
II. ๋ณธ๋ก
- Access Token๊ณผ Refresh Token์ ๋์ ์ด์ Refresh Token ์ ์ด๋ป๊ฒ Access Token์ ์ฌ๋ฐ๊ธ์ ๋์์ฃผ๋ ๊ฑธ๊น?
- Refresh Token Rotation Redis ์ ์ฅ ๋ฐฉ์ ๋ณ๊ฒฝ
III. ๊ฒฐ๋ก
- ์ ๋ฆฌ
- ์๊ฐํด ๋ณผ ์ ์๋ ๋ฌธ์
ํด๊ฒฐํ๊ณ ์ ํ ๋ฌธ์
JWT๋ก ์ธ์ฆ์ ๊ตฌํํ ๊ฐ๋ฐ์๋ผ๋ฉด ์๋์ ๋ฌธ์ ๋ฅผ ์๊ฐํด ๋ณผ ์ ์๋ค.
1. ์ ํจ๊ธฐ๊ฐ์ด ๊ธด Refresh Token์ด ํ์ทจ๋ ๊ฒฝ์ฐ.
-> ์ด ๊ฒฝ์ฐ๋ ๊ฐ๋จํ refresh token rotation ์ ๋ ์ฌ๋ฆด ์ ์๋ค. ํ์ง๋ง ์๋์ ๋ฌธ์ ๊น์ง ์ปค๋ฒํ ์ ์์์ง ์๋ฌธ์ด๋ค.
2. ํ์ทจํ Refresh Token์ผ๋ก ์ ์ ์ ์ ๋ณด๋ค ๋จผ์ Access Token์ ์ฌ๋ฐ๊ธ๋ฐ๋ ๊ฒฝ์ฐ
-> Refresh Token Rotation ํด๋, ์ ์์ ์ ๋ณด๋ค ๋จผ์ refresh token์ ์ฌ๋ฐ๊ธ๋ฐ์ผ๋ฉด ์ด๋กํ ๊ฒ์ธ๊ฐ?
3. (ํ ํฐ ํ์ทจ๋ ๊ฒฝ์ฐ) ํ ๋ช ์ ์ฌ์ฉ์์ refresh token์ด ์ฌ๋ฌ๊ฐ ์์ฑ๋๋ ๊ฒฝ์ฐ
์๋ ๋ก๊ทธ์ธ ์์คํ ์ ๊ตฌํํ๋ฉด์ ์ 3๊ฐ์ง ๋ฌธ์ ์ ๋ํ ๊ณ ๋ฏผ์ ์ด๋ป๊ฒ ์ ๊ทผํ๋์ง ๋จ๊ณ์ ์ผ๋ก ํ์ด๋ณด๊ฒ ๋ค.
I. ์๋ก
JWT์ Session ๋น๊ต ๋ฐ JWT์ ์ฅ์ ์๊ฐ ํ ํฐ ๊ธฐ๋ฐ ์ธ์ฆ์ ์ ํํ ์ด์
์ธ์ฆ(Authorization)์ ํฌ๊ฒ ์ธ์ ๊ณผ ํ ํฐ ๊ธฐ๋ฐ ๋ฐฉ์์ผ๋ก ๋๋๋ค. ๊ฐ๋ตํ๊ฒ ๋ ๋ฐฉ์์ ํน์ง์ ์์๋ณด์๋ฉด,
1) ์ธ์ ๊ธฐ๋ฐ
์ฌ์ฉ์์ ์ธ์ฆ ์ ๋ณด๊ฐ ์๋ฒ ๋ฉ๋ชจ๋ฆฌ(=์ธ์ ์ ์ฅ์)์ ์ ์ฅ๋๋ ๋ฐฉ์. ์ฌ๊ธฐ์ ๋ฉ๋ชจ๋ฆฌ๋ Database๊ฐ ์๋ ์๋ฒ ์์ฒด์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋ฏธํ๋ค.
๋ก๊ทธ์ธ ์ ์ฌ์ฉ์์ ์ธ์ฆ ์ ๋ณด๋ฅผ ์ธ์ ์ ์ฅ์์ ์ ์ฅํ๊ณ Session ID ๋ผ๋ ์๋ณ์๋ฅผ ์ฌ์ฉ์์๊ฒ ๋ฐ๊ธํ๋ค.
ํด๋ผ์ด์ธํธ(์ฌ์ฉ์)๊ฐ HTTP Cookie Header์ Session ID๋ฅผ ์ ์ฅํ์ฌ ์ ์กํ๋ฉด, ์๋ฒ๋ ์ ๋ฌ๋ฐ์ Session ID๋ก ์ธ์ ์ ์ฅ์๋ฅผ ์กฐํํ์ฌ ์ฌ์ฉ์๋ฅผ ๊ฒ์ฆํ๋ค.
์ฆ ์ธ์ ๊ธฐ๋ฐ์ ํน์ง์ ์ฌ์ฉ์์ ์ ๋ณด๊ฐ ์๋ฒ ๋ฉ๋ชจ๋ฆฌ์ ๋ณด๊ด ๋๋ค๋ ์ ์ด๋ค.
2) ํ ํฐ ๊ธฐ๋ฐ
์๋ฒ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ์ฉํ๋ ์ธ์ ๋ฐฉ์๊ณผ ๋ฌ๋ฆฌ, ํ ํฐ ๊ธฐ๋ฐ ์ธ์ฆ์ ์ธ์ฆ ์ ๋ณด๋ฅผ ํด๋ผ์ด์ธํธ๊ฐ ์ง์ ๋ค๊ณ ์๋ค. ๋จ ์์ ๋ ๊ฒ์ ์ ๋ณด๊ฐ ์๋ ํ ํฐ์ ํํ๋ก ์ ๋ณด๋ฅผ ๊ฐ์ถฐ ๋ณด๊ดํ๋ค.
์ด ํ ํฐ์ ์๋ฒ๋ก๋ถํฐ ์์ฑ๋์ด ํด๋ผ์ด์ธํธ์๊ฒ ์ ๋ฌ๋๋๋ฐ, ์ฌ์ฉ์๋ฅผ ์ธ์ฆํ ์ ์๋ ์ ๋ณด(์ฌ์ฉ์ ์ด๋ฉ์ผ, id๊ฐ ๋ฑ)๋ฅผ ๋ด๊ณ ์๋ค. ํด๋ผ์ด์ธํธ๋ HTTP ์์ฒญ ์ Authorization Header์ ํ ํฐ์ ๋ด์ ๋ณด๋ด๊ณ , ์๋ฒ๋ ํ ํฐ์ ์ ํจ๊ธฐ๊ฐ๊ณผ ์ ํจ์ฑ์ ๊ฒ์ฆํ์ฌ ํ ํฐ์ ์ ๋ณด๋ฅผ ํ์ด ํด๋ผ์ด์ธํธ๋ฅผ ์ธ์ฆํ๋ค.
์ฆ ํ ํฐ ๊ธฐ๋ฐ์ ํน์ง์, ์ธ์ ๊ธฐ๋ฐ๊ณผ ๋ฌ๋ฆฌ ๋ณ๋๋ก ์ธ์ ์ ์ ์ฅํ ๋ฉ๋ชจ๋ฆฌ๊ฐ ํ์ํ์ง ์๋ค. ๊ทธ์ ํ ํฐ์ ์์ฑํ๊ณ , ์ ๋ฌ๋ฐ์ ํ ํฐ์ ๋ค์ resolve ํ ์ ์๋ ๊ธฐ๋ฅ๋ง ๊ฐ์ถ๋ฉด ๋๋ค.
๋ ๋ฐฉ์์ ์ฐจ์ด์
์ฐ์ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ๋ณด์ ํ ์์น์ ์ฐจ์ด๊ฐ ์๋ค.
์ธ์ ๊ธฐ๋ฐ์ ์๋ฒ์์ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ๋ชจ๋ ๋ณด์ ํ ๋ฐ๋ฉด, ํ ํฐ ๊ธฐ๋ฐ์์ ๊ฐ๋ณ ํด๋ผ์ด์ธํธ๊ฐ ํ ํฐ์ ํํ๋ก ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ๋ณด์ ํ๋ค. ์ธ์ ์ธ์ฆ๋ฐฉ์์ ์ฌ์ฉ์ ์ ๋ณด๊ฐ ์๋ฒ ์ธก์ ์์ด ๋ณด์ ์ธก๋ฉด์์ ์ฐ์์ ์์ง๋ง, ์ฌ์ฉ์๊ฐ ๋์ด๋ ์๋ก ์๋ฒ ๋ฉ๋ชจ๋ฆฌ์ ๋ถํ๊ฐ ์ปค์ง ์ ์๋ค. ๋ํ ๋ค์ค ์๋ฒ๋ฅผ ์ฌ์ฉํ๋ค๋ฉด, ๊ฐ๋ณ ์๋ฒ๊ฐ ๊ฐ์ง ์ธ์ ์ ๋ณด๊ฐ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ์ธ์ ๋ถ์ผ์น ๋ฌธ์ ๋ฅผ ๊ฒช๊ฒ ๋๋ค. ๋ฐ๋ฉด ํ ํฐ ๊ธฐ๋ฐ ์ธ์ฆ์ ์๋ฒ ์ธก์ ์ ์ฅ๋ ์ธ์ฆ ์ ๋ณด๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ธ์ ๋ถ์ผ์น ๋ฌธ์ ๋ก๋ถํฐ ์์ ๋ก์ ์๋ฒ ํ์ฅ์ฑ์ ์ด์ ์ ๊ฐ์ง๋ค.
ํ์ง๋ง ์์ ์ฑ ์ธก๋ฉด์์๋ ์ธ์ ๊ธฐ๋ฐ์ด ํ์คํ ์ด์ ์ ๊ฐ์ง๋ค. ํ ํฐ์ ๊ฒฝ์ฐ ์ ์์ ์ธ ๊ณต๊ฒฉ์ ์ํด ํ์ทจ ๋นํ๋ฉด ๋ต์ด ์์ง๋ง, ์ธ์ ๊ธฐ๋ฐ์ ์๋ฒ ๋ฉ๋ชจ๋ฆฌ์ ์ ๋ณด๊ฐ ์ ์ฅ๋๊ธฐ ๋๋ฌธ์ ์๋์ ์ผ๋ก ์์ ์ฑ์ด ๋๋ค.
์์ ์ด์ ๋ก ํ ํฐ ๊ธฐ๋ฐ ์ธ์ฆ์ ํํ๊ณ , ๋ํ์ ์ธ ํ ํฐ ์ธ์ฆ ๋ฐฉ์์ธ JWT๋ฅผ ์ฌ์ฉํ๋ค.
II. ๋ณธ๋ก
JWT : Access Token๊ณผ Refresh Token์ ๋์ ์ด์
์ฌ์ฉ์ ์ ๋ณด๋ฅผ ์ธ์ฆํ๊ธฐ ์ํด์๋ ์ฐ์ ํ๋์ ํ ํฐ๋ง ์์ผ๋ฉด ๋๋ค.
ํด๋ผ์ด์ธํธ๊ฐ (์ฌ์ฉ์ ์ ๋ณด๋ฅผ ๋ด๊ณ ์๋) ํ ํฐ์ ์๋ฒ์ ๋ณด๋ด๋ฉด, ์๋ฒ๋ ์ ํจํ ์ฌ์ฉ์์ธ์ง ๊ฒ์ฆํ ์ ์๋ค.
Access Token
Access Token ์ ์ฌ์ฉ์ ์ธ์ฆ์ ๋ณด๋ฅผ ๋ด๋๋ค. ํ์ง๋ง ํ์ทจ์ ์ํ๊ณผ ํน์ฌ๋ ํ ํฐ ๋ด์ฉ์ ํ์ด๋ฒ๋ฆด ์ ์๋ค๋ ์ํ ๋๋ฌธ์ ์ต์ํ์ ์ฌ์ฉ์ ์ ๋ณด๋ง ๋ด๋ ๊ฒ์ ๊ถ์ฅํ๋ค. ํ์์ ๊ฒฝ์ฐ ์ฌ์ฉ์ ์ด๋ฉ์ผ ์ ๋ณด๋ง ํ ํฐ์ ๋ด์๋ค.
ํ ํฐ ๊ธฐ๋ฐ ๋ฐฉ์์ ๋จ์ ์ ํ ํฐ์ด ํ์ทจ๋ ๊ฒฝ์ฐ์ ์๋ฒ์์ ์ด๋ฅผ ์๋ณํ์ง ๋ชปํ๋ค.
์ ์ ์ ์ A ์ ๊ทธ์ ํ ํฐ(T1)์ ํ์ทจํ ํด์ปค H๊ฐ ์๋ค๊ณ ํ์.
์ ์์ ์ ๋ Access Token์ ์ฌ์ฉํด ์๋ฒ ์ธ์ฆ์ ๊ฑฐ์ณ ์๋น์ค๋ฅผ ์ฌ์ฉํ๋ค. ํ ํฐ์ stateless ํ ํน์ง์ผ๋ก ์๋ฒ์์ ํ ํฐ์ ์ธ์ฆํ ๋ ์ด๋ค ์ฌ์ฉ์๊ฐ ํ ํฐ์ ๋ณด๋๋์ง ์ ์ ์๋ค. ์ฝ๊ฒ ๋งํ๋ฉด A ์ฌ์ฉ์๊ฐ B ์ฌ์ฉ์์ ํ ํฐ์ ์์ ์ ํค๋์ ๋ฃ๊ณ ์๋ฒ์ ๋์ ธ๋, ์๋ฒ ์ธก์์ ๋ญ๊ฐ ์๋ชป๋๋์ง ์ ์ ์๋ค.
๊ทธ๋ผ ์ด Access Token(T1) ์ ํด์ปค H ๊ฐ ํ์ทจํ๋ค๊ณ ๊ฐ์ ํ์. H๊ฐ T1์ ์์ ์ Header์ ๋ด์ ์๋ฒ์ ์์ฒญ์ ๋ณด๋ด๋, ์๋ฒ๋ A๊ฐ ์๋ H์ ์์ฒญ์ด๋ ๊ฑธ ์ ๊ธธ์ด ์๋ค. ์ด๋ฐ ๋ฌธ์ ๋ก ์ธํด Access Token์ ์ ํจ๊ธฐ๊ฐ์ ์งง๊ฒ ์ค์ ํ๋ค. ํ ํฐ์ด ํ์ทจ๋ผ๋ ์ ํจ๊ธฐ๊ฐ์ด ์งง๊ธฐ ๋๋ฌธ์ ๊ธ๋ฐฉ ๋ง๋ฃ๋์ด ๋์ด์ ์๋ฒ์ ์ธ์ฆ์ ํ ์ ์๋ค.
๊ทธ๋ผ ์ ์ ์ ์ A ๋ ์ด๋ป๊ฒ ํด์ผ ํ ๊น?
Access Token ์ด ๋ง๋ฃ๋ ๋๋ง๋ค ๋งค๋ฒ ๋ก๊ทธ์ธ ๊ณผ์ ์ ๊ฑฐ์ณ Access Token ์ ์ฌ๋ฐ๊ธ๋ฐ์์ผ ํ๋ค. ํ์ง๋ง ์งง์์ง Access Token ์ ํจ๊ธฐ๊ฐ์ผ๋ก ์ธํด ๋งค๋ฒ ๋ก๊ทธ์ธ์ ํด์ผ ํ๋ ์๋น์ค๊ฐ ์ข์ ์ฌ์ฉ์ ๊ฒฝํ์ ์ค ์ ์์๊น? ์ด๋ฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด Refresh Token์ด ๋ฑ์ฅํ๋ค.
Refresh Token ์ ๋ฑ์ฅ
Refresh Token์ Access Token ๋ง๋ฃ ์ ์ฌ๋ฐ๊ธ ๊ณผ์ ์ ์ฌ์ฉ๋๋ค. Refresh Token ์ Access Token์ ์ฌ๋ฐ๊ธ์ ์ฌ์ฉ๋์ด ์ฌ์ฉ์๊ฐ ๋งค๋ฒ ๋ก๊ทธ์ธ ๊ณผ์ ์ ๊ฑฐ์น์ง ์๋๋ก ํ๋ค. ์ ๋ฆฌํ๋ฉด Access Token ์ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ๋ด์ ์ธ์ฆ๊ณผ์ ์ ์ฌ์ฉ๋๊ณ , Refresh Token ์ ์ ํจ๊ธฐ๊ฐ์ด ์งง์์ง Access Token์ ์ฌ๋ฐ๊ธ์ ์ฌ์ฉ๋ผ ์ฆ์ ๋ก๊ทธ์์ ๊ณผ์ ์ ํผํ๊ฒ ํด ์ค๋ค.
์์ Access Token์ ์ค๋ช ํ ๋ Access Token ์ ์ฌ์ฉ์์ ์ ๋ณด๋ฅผ ๋ด๋๋ค๊ณ ํ๋๋ฐ, Refresh Token์ ์ฌ์ฉ์ ๊ฐ์ธ ์ ๋ณด์๋ ๊ด๊ณ์๋ ์๋ณ์์ฉ UUID๋ฅผ ๋ด์๋ ๋๊ณ , Access Token์ฒ๋ผ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ๋ด์๋ ๋๋ค.
์ ํจ๊ธฐ๊ฐ
refresh Token ์ access token ์ด ๋ง๋ฃ๋์ ๋ ์ฌ๋ฐ๊ธ์ ๋์์ค์ผ ํ๊ธฐ์, access token ๋ณด๋ค ๊ธด ์ ํจ๊ธฐ๊ฐ์ ๊ฐ๋๋ค. ํ์๋ Access Token์ 2์๊ฐ, Refresh Token์ 2์ฃผ์ ์ ํจ๊ธฐ๊ฐ์ ๊ฐ๋๋ก ์ค์ ํ๋ค.
Refresh Token ์ ์ด๋ป๊ฒ Access Token์ ์ฌ๋ฐ๊ธ์ ๋์์ฃผ๋ ๊ฑธ๊น?
์ด์ Access Token(์ดํ AT) ์ด ๋ง๋ฃ๋์ ๋ Refresh Token(RT) ์ด ์ด๋ป๊ฒ AT๋ฅผ ์ฌ๋ฐ๊ธํ๋์ง ์ดํด๋ณด์.
์ฐ์ AT๋ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ๋ด๊ณ ์๋ค. AT๋ฅผ ์ฌ๋ฐ๊ธํ๋ค๋ ๊ฒ์ ์ด๋ค ํ ํฐ์ ๋ง๋ค ๋ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ๋ฃ์ด์ค๋ค๋ ๋ป์ผ๋ก, ์ฆ ์ฌ์ฉ์ ์ ๋ณด๊ฐ ์ค๋น๋ผ์ผ ํ๋ค. RT๋ ์๋ฒ์ ์ ์ก๋์ด ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ฌ key ์ญํ ์ ํ๋๋ฐ, ์ฌ์ฉ์ ์ ์ฅ์(RDB or Redis)์์ RT๋ก ์กฐํํ์ฌ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ๊บผ๋ด์ฌ ์ ์๋ค. ๊ทธ ํ ๊ฐ์ ธ์จ ์ ๋ณด๋ฅผ ๋งค๊ฐ๋ก AT๋ฅผ ์ฌ๋ฐ๊ธํ ์ ์๋ค.
์ฌ๊ธฐ๊น์ง๋ ๋๊ตฌ๋ ์๋ ์ด์ผ๊ธฐ๋ค.
์์์ AT๊ฐ ํ์ทจ๋ ๊ฒฝ์ฐ๋ฅผ ๊ณ ๋ คํด ์ ํจ๊ธฐ๊ฐ์ ์งง๊ฒ ์ค์ ํ๋ค๊ณ ๋ฐํ๋ค.
๊ทธ๋ผ A-T์ R-T๊ฐ ๋ชจ๋ ํ์ทจ๋ ์ํฉ์ ๊ฐ์ ํด ๋ณด์. RT๋ AT ์ฌ๋ฐ๊ธ ์ฉ๋๋ก ์ฌ์ฉ๋๊ธฐ ๋๋ฌธ์ ์ ํจ๊ธฐ๊ฐ๋ ๊ธธ์ด์, ํ๋ฒ ํ์ทจ๋๋ฉด ๋ง๋ฃ ์๊น์ง ํด์ปค๊ฐ ๊ณ์ ์ฌ์ฉํ ์ ์๋ค. ์ฌ์ง์ด ํ ํฐ ๊ธฐ๋ฐ ์ธ์ฆ์ stateless ํน์ง ๋๋ฌธ์ ์๋ฒ๋ ํ ํฐ์ด ํ์ทจ๋ ์ง๋ ๋ชจ๋ฅธ ์ฑ ๊ณ์ ์ธ์ฆ์ ํ๊ฐํด ์ค๋ค.
์ด๋ฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด Refresh Token Rotation ๊ธฐ๋ฒ์ ๋์ ํ๋ค.
Refresh Token Rotation ๋์
๊ธฐ์กด์๋ RT๋ฅผ ์ด์ฉํด AT๋ง ์ฌ๋ฐ๊ธํ์ง๋ง, Refresh Token Rotation ์ AT ๋ฟ๋ง ์๋๋ผ RT ๋ ๊ฐ์ด ์ฌ๋ฐ๊ธํ๋ค. ์๋ฒ ์ธก์์ RT๋ฅผ ์ฌ๋ฐ๊ธ ์ Redis๋ RDB์ ์ ์ฅ๋ Refresh Token๋ Update ํ๊ธฐ ๋๋ฌธ์, RT๊ฐ ํ์ทจ๋๋ค ํ๋๋ผ๋ ์๋ฒ ์ธก์์ ์ด๋ฅผ ์ธ์งํ ์ ์๋ค.
ํ์ง๋ง ๊ณผ์ฐ ์ด๊ฑธ๋ก ๋์ผ๊น?
์ด ๋ฌธ์ ์ ํจ์ ์ ํ ํฐ ํ์ทจ๋ฒ์ด ์ ์ ์ ์ ๋ณด๋ค ๋จผ์ Refresh token์ Rotation ํ ๋ ๋ฐ์ํ๋ค.
๊ธฐ์กด์ AT์ RT๋ ์๋ก์ด ํ ํฐ์ผ๋ก ๊ฐฑ์ ๋๊ณ , ์ ์ฅ์์ ํด์ปค๊ฐ ์ฌ๋ฐ๊ธ๋ฐ์ Refresh Token์ด ์ ์ฅ๋๋ค.
๊ทธ๋ฌ๋ฉด ์ ์์ ์ ๊ฐ AT๋ฅผ ์ฌ๋ฐ๊ธ ๋ฐ์ผ๋ ค ํด๋ (์ ์์ด์๋)Refresh Token์ด Redis์ ์กด์ฌํ์ง ์๊ธฐ ๋๋ฌธ์ ์ฌ๋ฐ๊ธ์ ๋ฐ์ ์ ์๋ค. ์ ์๋ฅผ ๋บ๊ธธ ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ ๊ฒ์ด๋ค.
์ฆ Refresh token Rotation ๊ธฐ๋ฒ์ ํ ํฐ ํ์ทจ๋ฒ์ด ์ ์๋ฅผ ์น ๋ ์ํฉ์ด ๊ผฌ์ฌ๋ฒ๋ฆฐ๋ค.
Redis ์ ์ฅ ๋ฐฉ์ ๋ณ๊ฒฝ
Refresh Token์ ๋จ์ ํ ํฐ์ด ์๋ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ๋ด์ JWT ํํ๋ฅผ ์ฌ์ฉํ๊ณ ์ด๋ฅผ ์ ์ฅํ๊ธฐ ์ํด Redis ์ ์ฅ์๋ฅผ ์ ํํ๋ค.
๋ณดํต์ Redis key๋ก Refresh Token์ ์ฌ์ฉํด value์ธ ์ฌ์ฉ์์ ์ ๋ณด๋ฅผ ์ ์ฅ, ์กฐํํ๋ค. Access Token์ ์ฌ๋ฐ๊ธ ๋ฐ์์ผ ํ ๋, Refresh Token ์ผ๋ก Redis ์์ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ์กฐํํ๊ณ ๊ทธ ๊ฒฐ๊ณผ๋ก Access Token์ ์ฌ๋ฐ๊ธ ๋ฐ๋ ํ๋ก์ธ์ค๋ค.
ํ์๋ ์ด ๊ตฌ์กฐ๋ฅผ ์ญ์ผ๋ก ๋ฐ๊ฟ, "key : value = userPk : refresh token" ํํ๋ก ์ ์ฅํ๋ค.
์ฅ ๋ฐ๋๋ก ํ๋๊ฒ ๋ง์ง ์๋๊ณ ๋ฐ๋ฌธํ ์ ์๋ค. ์ฌ์ค ํ์๋ ์ฒ์์ "key:value = refresh token: userPk" ํํ๋ก ์ ์ฅํ๋๋ฐ, ๊ฒฐ๊ตญ์ ๋ฐ๋๋ก ์ ์ฅํ ์ด์ ๊ฐ ์๋ค.
์ฐ์ ์ ์ ์ ์ ์ ์ ์ฆ์ผ์ด์ค
์ ์ ์ ์ ๋ ์ต์ด ๋ก๊ทธ์ธ ์ AT ์ RT๋ฅผ ๋ฐ๊ธ๋ฐ๊ณ , Redis ์ {userEmail : RT} ํํ๋ก ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ์ ์ฅํ๋ค.
AT๊ฐ ๋ง๋ฃ๋๋ฉด Refresh Token Rotation ๋ฐฉ๋ฒ์ ์ฌ์ฉํ์ฌ RT์ AT๋ฅผ ๋ชจ๋ ์ฌ๋ฐ๊ธ ๋ฐ๋๋ค.
์ด ๊ณผ์ ์ ์์ธํ ๋ณด๋ฉด,
์์ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ๋ด์ Refresh Token์ ์์ฑํ๋ค๊ณ ๋ฐํ๋ค. Refresh Token ์์ User์ ์ ๋ณด(email)์ ๊บผ๋ธ๋ค.
user email ์ key ๋ก Redis๋ฅผ ์กฐํํ๋ค. ์ ์์ ์ผ๋ก ์กฐํ๋๋ฉด ํด๋น user ์ refresh token(value)๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋ค.
Redis์์ ์กฐํํ refresh token๊ณผ ํด๋ผ์ด์ธํธ๊ฐ ๋ณด๋ธ refresh Token์ ๋น๊ตํ๋ค.
๋ ํ ํฐ ๊ฐ์ด ๋งค์นญ๋๋ฉด ์ ์ ์ ์ ๋ก ๊ฐ์ฃผํ๊ณ , access token ๊ณผ refresh token์ ๋ชจ๋ ์ฌ๋ฐ๊ธ ํ๋ค. (AT -> AT`, RT -> RT`)
Redis์ ์ ์ฅ๋ user email์ ๋งคํ ๊ฐ์ ๊ฐฑ์ ํ๋ค. {user email : RT => RT`}
๋ญ์ฌ ๋ณ๋ก ๋ค๋ฅผ๊ฒ ์๋๋ฐ์ ์ ์๋?
์์ ์ด์ ํ ํฐ ํ์ทจ๋ฒ์ด RT, AT๋ฅผ ๋ชจ๋ ํ์ทจํ๊ณ ์ฌ๋ฐ๊ธ ๊ณผ์ ๋ ์ ์์ณค๋ค๊ณ ๊ฐ์ ํ์.
์ฆ ์์ 1,2,3,4,5 ๊ณผ์ ์ ํ ํฐ ํ์ทจ๋ฒ์ด ๋จผ์ ์งํํ ์ดํ, ์ ์ ์ ์ A๊ฐ ์ฌ๋ฐ๊ธ ๋ฐ๋ ๊ณผ์ ์ ์ดํด๋ณด์.
1. ์ ์์ ์ ์ RT์์ user ์ด๋ฉ์ผ์ ๊บผ๋ธ๋ค.
2. user Email์ key๋ก Redis๋ฅผ ์กฐํํ๋ฉด ์ด์ ๋์๋๋ RT`๊ฐ ๋ฆฌํด๋๋ค.
3. Redis์์ ์กฐํ๋ RT`๋ ํด์ปค์ ์ํด ๋จผ์ ์ฌ๋ฐ๊ธ๋ Refresh Token์ผ๋ก, ์ฆ ์ ์ ์ ์ ์ Refresh Token๊ณผ ์์ดํ ๊ฐ์ด๋ค. ์ฆ ๋งค์นญ๋์ง ์๋๋ค.
4. RT๊ฐ ๋งค์นญ์ด ๋์ง ์๊ธฐ ๋๋ฌธ์ ์๋ฒ๋ ํด๋น ์ ์ ์ ๋ํ ์ ์์ ์ธ ์นจํฌ๋ฅผ ์ธ์งํ ์ ์๋ค.
5. Redis์์ ํด๋น ์ ์ ์ด๋ฉ์ผ key ๋ฅผ ์ญ์ ํ๊ณ ์ฌ๋ก๊ทธ์ธ ํ๋๋ก ํด๋ผ์ด์ธํธ๋ฅผ ๋ฆฌํดํ๋ค.
์ด์ ๊น์ง์ ๋ฐฉ๋ฒ๊ณผ ๋ค๋ฅธ์ ์ Redis์ ์ ์ฅ๋ ํค๋ฅผ RT๊ฐ ์๋ userPK(email) ๋ก ํ๋ค๋ ์ ์ด๋ค.
์ด์ ๋ฌ๋ฆฌ RT๋ฅผ ํค๋ก ์ผ์ ๊ฒฝ์ฐ๋ฅผ ์๊ฐํด๋ณด์. ์ฌ์ฉ์์ ํด์ปค ๋ชจ๋ RT ์ฌ๋ฐ๊ธ์ ๋ฐ์ผ๋ฉด Redis ๋ ํ ๋ช ์ ์ ์ ์ ๋ณด์ ๋ํด ๋ค์์ key ๋ฅผ ๊ฐ์ง๋ฉฐ ์ด๋ค key(refresh token)๊ฐ ์ ์์ ์ ์ ๊ฒ์ธ์ง ๋ถ๊ฐํ ์ ์๋ค. ์ค์๊ฐ์์ผ๋ก ๋ ์ด์์ ํ์ทจ๋ฒ์๊ฒ ํ ํฐ์ด ํธ๋ฆฌ๋ฉด, Redis์ ํ๋ช ์ผ๋ก ๋ถํฐ ๋ฐ๊ธ๋๋ ์ฌ๋ฌ๊ฐ์ RT๊ฐ ์ ์ฅ๋๋ค.
III. ๊ฒฐ๋ก
์ ๋ฆฌ
์ฒ์์ ์ค์ ํ ๋ฌธ์ ๋ฅผ ๋ค์ ์ ๋ฆฌํด๋ณด์.
1. ์ ํจ๊ธฐ๊ฐ์ด ๊ธด Refresh Token์ด ํ์ทจ๋ ๊ฒฝ์ฐ
2. ํ์ทจํ Refresh Token์ผ๋ก ์ ์ ์ ์ ๋ณด๋ค ๋จผ์ Access Token์ ์ฌ๋ฐ๊ธ ๋ฐ๋ ๊ฒฝ์ฐ
3. (ํ ํฐ ํ์ทจ๋ ๊ฒฝ์ฐ) ํ ๋ช ์ ์ฌ์ฉ์์ ์ฌ๋ฌ refresh token ๊ฐ์ด ์ ์ฅ๋๋ ๊ฒฝ์ฐ
1) Refresh token rotation(RTR) ์ ์ฌ์ฉํด 1๋ฒ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์๋ค. RT๊ฐ ํ์ทจ๋๋๋ผ๋ AT๋ฅผ ์ฌ๋ฐ๊ธ ๋ฐ์ ๋๋ง๋ค RT๋ฅผ ๊ฐฑ์ ํด ๊ธฐ์กด RT๋ฅผ ๋ฌดํจํ ํ ์ ์์๋ค.
2) 3) ํ์ง๋ง RTR ๋ง์ผ๋ก๋ 2๋ฒ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ง ๋ชปํ๋ค. ํ์ทจ๋ฒ์ด AT๋ฅผ ๋จผ์ ์ฌ๋ฐ๊ธ ๋ฐ์๋ฒ๋ฆฌ๋ฉด, ์คํ๋ ค ์ ์ ์ ์ ์ RT๊ฐ ๋ฌดํจํ ๋๋ ๊ผด์ด ๋๋ค. ์ ์ ์ ์ ์ผ ๋ค์ ๋ก๊ทธ์ธํด์ refresh token์ ๋ฐ๊ธ๋ฐ์ผ๋ฉด ๋์ง๋ง, ํด์ปค๋ ๊ธฐ์กด์ ํ์ทจํ refresh token ์ ์ง์์ ์ผ๋ก ์ฌ๋ฐ๊ธ ๋ฐ์ ์ ์๋ ๊ฐ๋ฅ์ฑ์ด ์กด์ฌํ๋ค. ๋ํ ์ด๋ ๊ฒ ๋๋ฉด ํ ๋ช ์ ์ฌ์ฉ์์ ๋ํด ์ฌ๋ฌ๊ฐ์ refresh token ์ด ์์ฑ๋๋ ๊ผด์ด๋ค.
์ 2) 3) ๋ฌธ์ ๋ Redis์ ์ ์ฅ๋ key๋ฅผ refresh token ์ด ์๋ userPk๋ก ์ค์ ํด ํด๊ฒฐํ ์ ์์๋ค. Redis ์๋ฒ๋ ํ๋ช ์ ์ฌ์ฉ์์ ๋ํด ํ๋์ ํ ํฐ๋ง ์กด์ฌํจ์ ๊ฑธ ๊ฐ์ ํ ์ ์์ด ํ ํฐ์ด ํ์ทจ๋ ๊ฒฝ์ฐ ์ด๋ฅผ ์ธ์งํ๊ณ ๋์ฒ(๋ก๊ทธ์์ ์ฒ๋ฆฌ ๋ฑ)ํ ์ ์๋ค.
์๊ฐํด๋ณผ ์ ์๋ ๋ฌธ์
์์ ๊ฐ๋จํ๊ฒ ์ธ์ ๊ธฐ๋ฐ ์ธ์ฆ์ ๋ํด ์๊ธฐํ๋ค. ์๋ฒ ๋ฉ๋ชจ๋ฆฌ์ ์ธ์ ์ ์ฅ์๋ฅผ ๋๊ณ ์ฌ์ฉ์๋ฅผ ์ธ์ฆํ๋ ๋ฐฉ์์ธ๋ฐ, Redis์ ์ฌ์ฉ์ ์ ๋ณด์ refresh token์ ์ ์ฅํ๋ ๊ฒ์ด ์ธ์ ๊ธฐ๋ฐ ๋ฐฉ์๊ณผ ๋น์ทํ๋ค๊ณ ๋๊ผ๋ค. ์ปจ์ ์ ๋น์ทํ ์ ์์ง๋ง ๊ฒฐ์ ์ ์ผ๋ก redis๋ฅผ ์ฌ์ฉํ ํ ํฐ ์ธ์ฆ๋ฐฉ์์ ์ฌ์ฉ์๊ฐ ๋์ด๋๋ค๊ณ ํด์ (๋ฉ์ธ)์๋ฒ ๋ถํ๊ฐ ๋์ง ์๊ณ , ์๋ฒ ํ์ฅ์ฑ ๋ฌธ์ ๋ก๋ถํฐ๋ ์์ ๋กญ๋ค. ๋ฌผ๋ก redis์ ๊ณ ๊ฐ์ฉ์ฑ์ ์ค์ ํด์ผ ํ์ง๋ง ๋ง์ด๋ค.
๋ Refresh Token ์ด ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ๋ด๊ณ ์๋ค๋ ์ ์์ accesss token ๋์ refresh token ์ ๋ณด๋ด๋ฉด ๋๋ ๊ฒ ์๋๋๊ณ ์๊ฐํ ์ ์๋ค. ์ ํจ๊ธฐ๊ฐ์ด ์งง์ access token ๋์ ์ ํจ๊ธฐ๊ฐ์ด ๊ธด refresh token์ ๋ณด๋ด๋ฉด ์ฌ๋ฐ๊ธ ๊ณผ์ ๋ ํ์์๊ฒ ๋ค ๋ณด์์ด ์ญ์ญ ๋ซ๋ฆฌ์ง ์๊ฒ ๋๋ ์๊ฒฌ์ด์๋๋ฐ, ๋คํํ ๊ฐ๊ฐ์ ํ ํฐ์ ์์ฑํ๋ secret key ๋ฅผ ๋ณ๋๋ก ์์ฑํ๊ธฐ ๋๋ฌธ์ refresh token์ access token ๋์ ๋ณด๋ธ๋ค๊ณ ํด์ ํด๋น ํ ํฐ์ด resolve ๋ ์ผ์ ์๋ค.
ํ์ง๋ง ์ด ๋ฐฉ๋ฒ๋ ์ํํ์ ๋ ์ ์๋ค.
๋ง์ฝ ์ ์ ์ ์ A๊ฐ ์๋น์ค์ ์ค๋ซ๋์ ์ ์ํ์ง ์์ ์ํฉ์์ R-T๊ฐ ํ์ทจ๋๋ค๊ณ ํ์. ์๋ฒ๋ ํด์ปค์ R-T๋ง ์ง์์ ์ผ๋ก ์ฌ๋ฐ๊ธํ๊ณ Redis์์ R-T๋น๊ต ๊ณผ์ ์์ ์์ธ๋ฅผ ๋์ง ์ผ ๋ ์์ด์ง๋ค. ๊ทผ๋ฐ ์ด๊ฑด RTR์ ๋ฌธ์ ๋ผ๊ธฐ ๋ณด๋ค ํ ํฐ ๊ธฐ๋ฐ ์ธ์ฆ๋ฐฉ์์ด ๊ฐ์ง๋ ํ์ฐ์ ์ธ ๋ฌธ์ ์ผ ์ ๋ฐ์ ์๋ ๊ฒ ๊ฐ๋ค.
๊ฒฐ๊ตญ ์ํํ์ ์๋ค๋ ์ฐ์ฐํ ๊ฒฐ๋ก ๋ง ๋ด๊ฒ ๋๋ค. ์ด ๋ชจ๋ ๋ฌธ์ ๋ ํ ํฐ์ ํ์ทจ ๋นํ์ง ์์ผ๋ฉด ์ด๋์ ๋ ํด๊ฒฐ๋๊ธฐ ๋๋ฌธ์ ํด๋ผ์ด์ธํธ ์ชฝ์์๋ ํ์ํ ์ค๋น๋ฅผ ํ๋ ์์ผ๋ก ๊ฐ์ด ์ค๋น๋ฅผ ํด์ผํ๋ค.
ํผ๋๋ฐฑ ํ์๐
'๐ Web' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Java] ๋ฌธ์ ์ด์ค์ผ์ด์ค ์ฒ๋ฆฌํ๊ธฐ (feat.html) (0) | 2023.12.29 |
---|---|
Web Server ์ WAS ๋ฅผ ์์๋ณด์ (1) | 2022.12.24 |
REST API ๋์์ธ 15๊ฐ์ง ํ (0) | 2022.05.13 |
ํฌ์๋ ํ๋ก์ ์ ๋ฆฌ๋ฒ์ค ํ๋ก์ (forward proxy, reverse proxy) (1) | 2021.08.24 |
HTTP 401(Unauthorized), 403(Forbidden) ์ฐจ์ด (0) | 2021.06.20 |