๐ Access Token & Refresh Token ์๋ฆฌ
Access Token & Refresh Token
์ด๋ฒ ํฌ์คํ ์์๋ ๊ธฐ๋ณธ JWT ๋ฐฉ์์ ์ธ์ฆ(๋ณด์) ๊ฐํ ๋ฐฉ์์ธ Access Token & Refresh Token ์ธ์ฆ ๋ฐฉ์์ ๋ํด ์์๋ณด๊ฒ ๋ค.
๋จผ์ JWT(Json Web Token) ์ ๋ํด ์ ๋ชจ๋ฅด๋ ๋ ์๋ค์ ๋ค์ ํฌ์คํ ์ ์ฐธ๊ณ ํ๊ธธ ๋ฐ๋๋ค.
[WEB] ๐ JWT(Json Web Token )๋? ๐ฏ ์ ๋ฆฌ
Cookie & Session [WEB] ๐ ์ธ์ / ์ฟ ํค ๐ช ์ ๋ฆฌ ๋น์ฐ๊ฒฐ์ฑ(Connectionless)๊ณผ ๋น์ํ์ฑ(Stateless) HTTP ํ๋กํ ์ฝ์๋ ๋น์ฐ๊ฒฐ์ฑ(Connectionless)๊ณผ ๋น์ํ์ฑ(Stateless)์ด๋ผ๋ ํน์ง์ด ์์ต๋๋ค. ์ด๋ ์๋ฒ์ ์์..
inpa.tistory.com
Refresh token์ด ์ ํ์ํ๊ฐ
Access Token ๋ง์ ํตํ ์ธ์ฆ ๋ฐฉ์์ ๋ฌธ์ ๋ ๋ง์ผ ์ 3์์๊ฒ ํ์ทจ๋นํ ๊ฒฝ์ฐ ๋ณด์์ ์ทจ์ฝํ๋ค๋ ์ ์ด๋ค.
Access Token์ ๋ฐ๊ธ๋ ์ดํ, ์๋ฒ์ ์ ์ฅ๋์ง ์๊ณ ํ ํฐ ์์ฒด๋ก ๊ฒ์ฆ์ ํ๋ฉฐ ์ฌ์ฉ์ ๊ถํ์ ์ธ์ฆํ๊ธฐ ๋๋ฌธ์, Access Token์ด ํ์ทจ๋๋ฉด ํ ํฐ์ด ๋ง๋ฃ๋๊ธฐ ์ ๊น์ง, ํ ํฐ์ ํ๋ํ ์ฌ๋์ ๋๊ตฌ๋ ๊ถํ ์ ๊ทผ์ด ๊ฐ๋ฅํด ์ง๊ธฐ ๋๋ฌธ์ด๋ค.
JWT๋ ๋ฐ๊ธํ ํ ์ญ์ ๊ฐ ๋ถ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์, ์ ๊ทผ์ ๊ด์ฌํ๋ ํ ํฐ์ ์ ํจ์๊ฐ์ ๋ถ์ฌํ๋ ์์ผ๋ก ํ์ทจ ๋ฌธ์ ์ ๋ํด ๋์์ ํ์ฌ์ผ ํ๋ค.
์ด์ฒ๋ผ ํ ํฐ ์ ํจ๊ธฐ๊ฐ์ ์งง๊ฒํ๋ฉด ํ ํฐ ๋จ์ฉ์ ๋ฐฉ์งํ๋ ๊ฒ์ด ํด๊ฒฐ์ฑ ์ด ๋ ์ ์์ง๋ง, ์ ํจ๊ธฐ๊ฐ์ด ์งง์ Token์ ๊ฒฝ์ฐ ๊ทธ๋งํผ ์ฌ์ฉ์๋ ๋ก๊ทธ์ธ์ ์์ฃผ ํด์ ์๋กญ๊ฒ Token์ ๋ฐ๊ธ๋ฐ์์ผ ํ๋ฏ๋ก ๋ถํธํ๋ค๋ ๋จ์ ์ด ์๋ค. ๊ทธ๋ ๋ค๊ณ ๋ฌดํฑ๋๊ณ ์ ํจ๊ธฐ๊ฐ์ ๋๋ฆฌ์๋ฉด, ํ ํฐ์ ํ์ทจ๋นํ์ ๋ ๋ณด์์ ๋ ์ทจ์ฝํด์ง๊ฒ ๋๋ค.
์ด๋ “๊ทธ๋ฌ๋ฉด ์ ํจ๊ธฐ๊ฐ์ ์งง๊ฒ ํ๋ฉด์ ์ข์ ๋ฐฉ๋ฒ์ด ์์ง๋ ์์๊น?”๋ผ๋ ์ง๋ฌธ์ ๋ต์ด ๋ฐ๋ก Refresh Token์ด๋ค.
์ด๋ฆ์ด ๋ค๋ฅด์ง๋ง ํํ ์์ฒด๋ Refresh Token์ Access Token๊ณผ ๋๊ฐ์ JWT๋ค. ๋จ์ง Access Token์ ์ ๊ทผ์ ๊ด์ฌํ๋ ํ ํฐ์ด๊ณ , Refresh Token์ ์ฌ๋ฐ๊ธ์ ๊ด์ฌํ๋ ํ ํฐ ์ด๋ฏ๋ก ํํ๋ ์ญํ ์ด ๋ค๋ฅด๋ค๊ณ ๋ณด๋ฉด ๋๋ค.
์๋ฅผ ๋ค๋ฉด ์ฒ์์ ๋ก๊ทธ์ธ์ ํ์ ๋, ์๋ฒ๋ ๋ก๊ทธ์ธ์ ์ฑ๊ณต์ํค๋ฉด์ ํด๋ผ์ด์ธํธ์๊ฒ Access Token๊ณผ Refresh Token์ ๋์์ ๋ฐ๊ธํ๋ค. ์๋ฒ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ Refresh Token์ ์ ์ฅํ๊ณ , ํด๋ผ์ด์ธํธ๋ Access Token๊ณผ Refresh Token์ ์ฟ ํค, ์ธ์ ํน์ ์น์คํ ๋ฆฌ์ง์ ์ ์ฅํ๊ณ ์์ฒญ์ด ์์๋๋ง๋ค ์ด ๋์ ํค๋์ ๋ด์์ ๋ณด๋ธ๋ค.
์ด Refresh Token์ ๊ธด ์ ํจ๊ธฐ๊ฐ์ ๊ฐ์ง๋ฉด์, Access Token์ด ๋ง๋ฃ๋์ ๋ ์๋ก ์ฌ๋ฐ๊ธํด์ฃผ๋ ์ด์ ๊ฐ ๋๋ค. ๋ฐ๋ผ์ ๋ง์ผ ๋ง๋ฃ๋ Access Token์ ์๋ฒ์ ๋ณด๋ด๋ฉด, ์๋ฒ๋ ๊ฐ์ด ๋ณด๋ด์ง Refresh Token์ DB์ ์๋ ๊ฒ๊ณผ ๋น๊ตํด์ ์ผ์นํ๋ฉด ๋ค์ Access Token์ ์ฌ๋ฐ๊ธํ๋ ๊ฐ๋จํ ์๋ฆฌ์ด๋ค. ๊ทธ๋ฆฌ๊ณ ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์์์ ํ๋ฉด ์ ์ฅ์์์ Refresh Token์ ์ญ์ ํ์ฌ ์ฌ์ฉ์ด ๋ถ๊ฐ๋ฅํ๋๋ก ํ๊ณ ์๋ก ๋ก๊ทธ์ธํ๋ฉด ์๋ฒ์์ ๋ค์ ์ฌ๋ฐ๊ธํด์ DB์ ์ ์ฅํ๋ค.
์ฌ์ฉ ์๋ฅผ ๊ฐ๋จํ ๋ค์ด๋ณด์. Refresh Token์ ์ ํจ๊ธฐ๊ฐ์ 2์ฃผ, Access Token์ ์ ํจ๊ธฐ๊ฐ์ 1์๊ฐ์ด๋ผ ๊ฐ์ ํ๊ฒ ๋ค.
์ฌ์ฉ์๋ API ์์ฒญ์ ํ๋ค๊ฐ 1์๊ฐ์ด ์ง๋๊ฒ ๋๋ฉด, ๊ฐ์ง๊ณ ์๋ Access Token์ ๋ง๋ฃ ๋๊ฒ ๋๋ค. ๊ทธ๋ฌ๋ฉด Refresh Token์ ์ ํจ๊ธฐ๊ฐ ์ ๊น์ง๋ Access Token์ ์๋กญ๊ฒ ๋ฐ๊ธ๋ฐ์ ์ ์๊ฒ ๋๋ค. ์ฆ, Refresh Token ์ ๊ทผ์ ๋ํ ๊ถํ์ ์ฃผ๋ ๊ฒ์ด ์๋๋ผ Access Token ์ฌ๋ฐ๊ธ์๋ง ๊ด์ฌํ๋ ๊ฒ์ด๋ค.
๋ง์ผ Refresh Token์ ์ ํจ๊ธฐ๊ฐ(2์ฃผ)์ด ๋ง๋ฃ๋๋ค๋ฉด, ์ฌ์ฉ์๋ ์๋ก ๋ก๊ทธ์ธํด์ผ ํ๋ค. Refresh Token๋ ํ์ทจ๋ ๊ฐ๋ฅ์ฑ์ด ์๊ธฐ ๋๋ฌธ์ ์ด ์ญ์ ์ ์ ํ ์ ํจ๊ธฐ๊ฐ ์ค์ ์ด ํ์ํ๋ค (๋ณดํต 2์ฃผ๋ก ๋ง์ด ์ก๋ ํธ์ด๋ค)
Access / Refresh Token ์ฌ๋ฐ๊ธ ์๋ฆฌ
1. ๊ธฐ๋ณธ์ ์ผ๋ก ๋ก๊ทธ์ธ ๊ฐ์ ๊ณผ์ ์ ํ๋ฉด Access Token๊ณผ Refresh Token์ ๋ชจ๋ ๋ฐ๊ธํ๋ค.
์ด๋, Refresh Token๋ง ์๋ฒ์ธก์ DB์ ์ ์ฅํ๋ฉฐ, Refresh Token๊ณผ Access Token์ ์ฟ ํค ํน์ ์น์คํ ๋ฆฌ์ง์ ์ ์ฅํ๋ค.
2. ์ฌ์ฉ์๊ฐ ์ธ์ฆ์ด ํ์ํ API์ ์ ๊ทผํ๊ณ ์ ํ๋ฉด, ๊ฐ์ฅ ๋จผ์ ํ ํฐ์ ๊ฒ์ฌํ๋ค.
์ด๋, ํ ํฐ์ ๊ฒ์ฌํจ๊ณผ ๋์์ ๊ฐ ๊ฒฝ์ฐ์ ๋ํด์ ํ ํฐ์ ์ ํจ๊ธฐ๊ฐ์ ํ์ธํ์ฌ ์ฌ๋ฐ๊ธ ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ๋ค.
- case1 : access token๊ณผ refresh token ๋ชจ๋๊ฐ ๋ง๋ฃ๋ ๊ฒฝ์ฐ → ์๋ฌ ๋ฐ์ (์ฌ ๋ก๊ทธ์ธํ์ฌ ๋๋ค ์๋ก ๋ฐ๊ธ)
- case2 : access token์ ๋ง๋ฃ๋์ง๋ง, refresh token์ ์ ํจํ ๊ฒฝ์ฐ → refresh token์ ๊ฒ์ฆํ์ฌ access token ์ฌ๋ฐ๊ธ
- case3 : access token์ ์ ํจํ์ง๋ง, refresh token์ ๋ง๋ฃ๋ ๊ฒฝ์ฐ → access token์ ๊ฒ์ฆํ์ฌ refresh token ์ฌ๋ฐ๊ธ
- case4 : access token๊ณผ refresh token ๋ชจ๋๊ฐ ์ ํจํ ๊ฒฝ์ฐ → ์ ์ ์ฒ๋ฆฌ
[refresh token์ ๊ฒ์ฆํ์ฌ access token ์ฌ๋ฐ๊ธ]
ํด๋ผ์ด์ธํธ(์ฟ ํค, ์น์คํ ๋ฆฌ์ง)์ ์ ์ฅ๋์ด์๋ refresh token๊ณผ ์๋ฒ DB์ ์ ์ฅ๋์ด์๋ refresh token ์ผ์น์ฑ์ ํ์ธํ ๋ค access token ์ฌ๋ฐ๊ธํ๋ค.
[access token์ ๊ฒ์ฆํ์ฌ refresh token ์ฌ๋ฐ๊ธ]
access token์ด ์ ํจํ๋ค๋ผ๋ ๊ฒ์ ์ด๋ฏธ ์ธ์ฆ๋ ๊ฒ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ ๋ฐ๋ก refresh token ์ฌ๋ฐ๊ธํ๋ค.
3. ๋ก๊ทธ์์์ ํ๋ฉด Access Token๊ณผ Refresh Token์ ๋ชจ๋ ๋ง๋ฃ์ํจ๋ค.
Refresh Token ์ธ์ฆ ๊ณผ์
1. ์ฌ์ฉ์๊ฐ ID , PW๋ฅผ ํตํด ๋ก๊ทธ์ธ.
2. ์๋ฒ์์๋ ํ์ DB์์ ๊ฐ์ ๋น๊ต
3~4. ๋ก๊ทธ์ธ์ด ์๋ฃ๋๋ฉด Access Token, Refresh Token์ ๋ฐ๊ธํ๋ค. ์ด๋ ํ์DB์๋ Refresh Token์ ์ ์ฅํด๋๋ค.
5. ์ฌ์ฉ์๋ Refresh Token์ ์์ ํ ์ ์ฅ์์ ์ ์ฅ ํ, Access Token์ ํค๋์ ์ค์ด ์์ฒญ์ ๋ณด๋ธ๋ค.
6~7. Access Token์ ๊ฒ์ฆํ์ฌ ์ด์ ๋ง๋ ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ธ๋ค.
8. ์๊ฐ์ด ์ง๋ Access Token์ด ๋ง๋ฃ๋๋ค.
9. ์ฌ์ฉ์๋ ์ด์ ๊ณผ ๋์ผํ๊ฒ Access Token์ ํค๋์ ์ค์ด ์์ฒญ์ ๋ณด๋ธ๋ค.
10~11. ์๋ฒ๋ Access Token์ด ๋ง๋ฃ๋จ์ ํ์ธํ๊ณ ๊ถํ์์์ ์ ํธ๋ก ๋ณด๋ธ๋ค.
Access Token ๋ง๋ฃ๊ฐ ๋ ๋๋ง๋ค ๊ณ์ ๊ณผ์ 9~11์ ๊ฑฐ์น ํ์๋ ์๋ค.
์ฌ์ฉ์(ํ๋ก ํธ์๋)์์ Access Token์ Payload๋ฅผ ํตํด ์ ํจ๊ธฐ๊ฐ์ ์ ์ ์๋ค.
๋ฐ๋ผ์ ํ๋ก ํธ์๋ ๋จ์์ API ์์ฒญ ์ ์ ํ ํฐ์ด ๋ง๋ฃ๋๋ค๋ฉด ๊ณง๋ฐ๋ก ์ฌ๋ฐ๊ธ ์์ฒญ์ ํ ์๋ ์๋ค.
12. ์ฌ์ฉ์๋ Refresh Token๊ณผ Access Token์ ํจ๊ป ์๋ฒ๋ก ๋ณด๋ธ๋ค.
13. ์๋ฒ๋ ๋ฐ์ Access Token์ด ์กฐ์๋์ง ์์๋์ง ํ์ธํํ, Refresh Token๊ณผ ์ฌ์ฉ์์ DB์ ์ ์ฅ๋์ด ์๋ Refresh Token์ ๋น๊ตํ๋ค. Token์ด ๋์ผํ๊ณ ์ ํจ๊ธฐ๊ฐ๋ ์ง๋์ง ์์๋ค๋ฉด ์๋ก์ด Access Token์ ๋ฐ๊ธํด์ค๋ค.
14. ์๋ฒ๋ ์๋ก์ด Access Token์ ํค๋์ ์ค์ด ๋ค์ API ์์ฒญ ์๋ต์ ์งํํ๋ค.
# ์ฐธ๊ณ ์๋ฃ
https://tansfil.tistory.com/59