๐พ pre ์คํ์ค๋ฒํ๋ก์ฐ ํด๋ก / JWT, ์ด๋์ ์ ์ฅํ ๊น?(feat. Axios interceptor)
๐ ์๋ฒ-ํด๋ผ์ด์ธํธ ํ ํฐ ์ธ์ฆ ๊ธฐ๋ณธ ๋ก์ง
- ์์ฒญ ์ ์๋ฒ์์ ํค๋์ access, refresh ํ ํฐ์ ๋ด์ ์๋ตํ๋ค.
(ex. set-cookie ํค๋์ refresh ํ ํฐ์, payload์ access ํ ํฐ์ ๋ด์ ์๋ตํ๋ค) - ํด๋ผ์ด์ธํธ๋ ์ด ํ ํฐ๋ค์ ์ ์ฅํด๋์๋ค๊ฐ ์์ฒญ์ ๋ณด๋ผ ๋ access ํ ํฐ์ ๋ณด๋ธ๋ค.
- access ํ ํฐ์ด ๋ง๋ฃ๋๋ฉด ์๋ฒ์์ ๋ง๋ฃ ์ฌ์ธ(401์๋ฌ์ ๋ง๋ฃ๋ฅผ ์๋ฆฌ๋ ๋ฉ์ธ์ง)์ ๋ณด๋ด๊ณ
- ํด๋ผ์ด์ธํธ๋ ์ ์ฅํด๋ refresh ํ ํฐ์ ํฌํจ์์ผ ์๋ฒ์ ๋ณด๋ธ๋ค.
- ์๋ฒ๋ refresh ํ ํฐ์ ํ์ธํ๊ณ , ์ธ์ฆ๋๋ฉด ์๋ก์ด access, refresh ํ ํฐ์ ์๋ต์ผ๋ก ๋ณด๋ธ๋ค.
- ํด๋ผ์ด์ธํธ๋ ์๋ก ๋ฐ์ ํ ํฐ๋ค๋ก ๊ธฐ์กด ํ ํฐ์ ๊ฐฑ์ ํ๋ค.
- ์ดํ ์์ฒญ์ ๊ฐฑ์ ํ ํ ํฐ์ ์ฌ์ฉํ๋ค.
๐ ํ ํฐ ์ ์ฅ๊ณผ ๊ด๋ จ๋ ๋ณด์์ ๋ํ ์งง์ ์ง์
XSS(Cross Site Scripting)
์ ์์ ์ธ js ์ฝ๋๋ฅผ ๊ณต๊ฒฉ ๋นํ ํด๋ผ์ด์ธํธ์ ๋ธ๋ผ์ฐ์ ์์ ์คํ์ํค๋ ๊ฒ์ผ๋ก, ๋ธ๋ผ์ฐ์ ์ ์ ์ฅ๋ ์ค์ํ ์ ๋ณด๋ฅผ ํ์ทจํ ์ ์๋ค.
์น ์์์ ๊ฐ์ฅ ๊ธฐ์ด์ ์ธ ์ทจ์ฝ์ ๊ณต๊ฒฉ ๋ฐฉ๋ฒ์ ์ผ์ข ์ด๋ค.
CSRF(Cross Site Request Forgery)
request๋ฅผ ๊ฐ๋ก์ฑ์ ๋ฐฑ์๋ ์๋ฒ์ ๋ณ์กฐ๋ request๋ฅผ ๋ณด๋ด ์ ์์ ์ธ ๋์์ ์ํํ๋ ๊ณต๊ฒฉ(ํด๋ผ์ด์ธํธ ์ ๋ณด ์์ , ์ด๋)
๊ณต๊ฒฉ ๊ณผ์ ์์: ima, link๋ฅผ ํด๋ฆญํ๋ค -> ๊ณต๊ฒฉ์๊ฐ ์๋ํ http request๊ฐ ์ ์ก๋๋ค
๐ localStorage vs cookie
localStorage
์ฅ์ : CSRF ๊ณต๊ฒฉ์ ์์
์ฟ ํค๋ ์๋์ผ๋ก request์ ๋ด๊ธฐ๋ ๋ฐ๋ฉด localStorage์ ํ ํฐ์ js ์ฝ๋์ ์ํด ํค๋์ ๋ด๊ธด๋ค.
๋๋ฌธ์ XSS์ ์ทจ์ฝํ์ง ์์ ์ด์ ๊ณต๊ฒฉ์๊ฐ ํด๋ผ์ด์ธํธ์ธ ์ฒ request๋ฅผ ๋ณด๋ด๊ธฐ ์ด๋ ต๋ค.
๋จ์ : XSS์ ์ทจ์ฝ
๊ณต๊ฒฉ์๊ฐ localStorage์ ์ ๊ทผํ๋ ์ฝ๋๋ง ์ฃผ์ ํ๋ฉด ํ์ทจ๊ฐ ๊ฐ๋ฅํ๋ค.
cookie
์ฅ์ 1: localStorage์ ๋นํด XSS ๊ณต๊ฒฉ์ ์์
์ฟ ํค์ httpOnly ์ต์ ์ ์ฌ์ฉํ๋ฉด JS์์ ์ฟ ํค์ ์ ๊ทผํ ์ ์๋ค.
์์ ํ ์์ ํ ๊ฒ์ ์๋๋ค. ์๋์ผ๋ก request์ ์ฟ ํค๊ฐ ์ค๋ฆฌ๋ ์ฌ์ฉ์์ ์ปดํจํฐ์์ ์์ฒญ์ ์์กฐํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
XSS๊ฐ ์ฑ๊ณตํ๋ฉด httpOnly cookie๋ ์์ ํ์ง ์๋ค.
๋จ์ : CSRF์ ์ทจ์ฝ
์๋์ผ๋ก http request์ ๋ด๊ฒจ์ง๊ธฐ ๋๋ฌธ์ ๊ณต๊ฒฉ์๊ฐ request url์ ์๋ค๋ฉด ์ฌ์ฉ์๊ฐ link, img๋ฅผ ํด๋ฆญํ๋๋ก ์ ๋ํ์ฌ request๋ฅผ ์์กฐํ ์ ์๋ค. ์ต๊ทผ์๋ ์ฟ ํค์ CSRF ์ทจ์ฝ์ ์ ๋ง๊ธฐ ์ํด request์ ์๋์ผ๋ก ์ฟ ํค๊ฐ ์ค๋ฆฌ์ง ์๋ ๊ฒฝ์ฐ๋ ์๋ค.
request์ ์ฟ ํค๊ฐ ์ค๋ฆฌ์ง ์๋ ๊ฒฝ์ฐ์ ๋ํด ์ ๋ฆฌํ ๊ธ
๐ ๊ทธ๋์, ํ๋ก ํธ์๋์์ ํ ํฐ์ ์ด๋์ ์ ์ฅํ์ง?
MDN์ Modern APIs์ ์ข ๋ฅ์ธ ์น ์คํ ๋ฆฌ์ง API (localStorage์ sessionStorage) ์ IndexedDB๋ฅผ ์ฌ์ฉํ ๊ฒ์ ๊ถ์ฅํ๋ค.
๊ณผ๊ฑฐ์ ํด๋ผ์ด์ธํธ ์ธก์ ์ ๋ณด๋ฅผ ์ ์ฅํ ๋ ์ฟ ํค๋ฅผ ์ฃผ๋ก ์ฌ์ฉํ๊ณค ํ์ต๋๋ค. ์ฟ ํค๋ฅผ ์ฌ์ฉํ๋ ๊ฒ ๋ฐ์ดํฐ๋ฅผ ํด๋ผ์ด์ธํธ ์ธก์ ์ ์ฅํ ์ ์๋ ์ ์ผํ ๋ฐฉ๋ฒ์ด์์ ๋๋ ์ด ๋ฐฉ๋ฒ์ด ํ๋นํ์ง๋ง, ์ง๊ธ์ modern storage APIs๋ฅผ ์ฌ์ฉํด ์ ๋ณด๋ฅผ ์ ์ฅํ๋ ๊ฑธ ๊ถ์ฅํฉ๋๋ค. ๋ชจ๋ ์์ฒญ๋ง๋ค ์ฟ ํค๊ฐ ํจ๊ป ์ ์ก๋๊ธฐ ๋๋ฌธ์, (ํนํ mobile data connections์์) ์ฑ๋ฅ์ด ๋จ์ด์ง๋ ์์ธ์ด ๋ ์ ์์ต๋๋ค. ์ ๋ณด๋ฅผ ํด๋ผ์ด์ธํธ ์ธก์ ์ ์ฅํ๋ ค๋ฉด Modern APIs์ ์ข ๋ฅ์ธ ์น ์คํ ๋ฆฌ์ง API (localStorage์ sessionStorage) ์ IndexedDB๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค.
์ถ์ฒ: MDN HTTP ์ฟ ํค
+ IndexedDB: ์น ๋ธ๋ผ์ฐ์ ์์ ์ ๊ณตํ๋ ์น ์ ํ๋ฆฌ์ผ์ด์
์ ํด๋ผ์ด์ธํธ ์ธก ๋ฐ์ดํฐ๋ฒ ์ด์ค
localStorage๋ XSS์ ์ทจ์ฝํ์ง๋ง CSRF์ ์์ ํ๋ค.
๋ฐ๋ฉด cookie๋ localStorage์ ๋นํด XSS ๊ณต๊ฒฉ์ ์์ ํ์ง๋ง '์์ ํ' ์์ ํ์ง๋ ์๊ณ , CSRF์ ์ทจ์ฝํ๋ค.
์ด๋ฌํ ์ด์ ์์ localStorage๋ฅผ ์ฌ์ฉํ๊ธฐ๋ก ํ๋ค.
์๋๋ ๋ด๊ฐ ํ ํฐ์ ์ ์ฅํ๊ธฐ ์ํด ์ฝ์๋ ๋ธ๋ก๊ทธ ๊ธ๋ค์ด๋ค.
Axios๋ฅผ ์ด์ฉํด์ Access ํ ํฐ๊ณผ Refresh ํ ํฐ์ ๊ฐฑ์ ํ๋ ๋ฐฉ๋ฒ
๐ช ํ๋ก ํธ์์ ์์ ํ๊ฒ ๋ก๊ทธ์ธ ์ฒ๋ฆฌํ๊ธฐ (ft. React)
6) React - JWT๋ฅผ ์ด์ฉํ ๋ก๊ทธ์ธ ์ธ์ฆ - 2๋ถ
์กฐ์ฌ ์ค์ ๋ณด์์ ์ํด์๋ refresh token์ ์ฌ์ฉํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ข๋ค๋ ๊ฒฐ๋ก ์ ์ป์๋ค.
ํ์ง๋ง... ๊ฒฐ๋ก ๋ถํฐ ๋งํ์๋ฉด ์ฐ๋ฆฌ ํ์ ๋ฐฑ์๋ ์ธก์์ refresh token -> access token ๊ฐฑ์ ์ค๋ฅ๋ฅผ ํด๊ฒฐํ์ง ๋ชปํ๋ค.
์ด์ฉ ๋๋ ํ ํฐ ๊ฐฑ์ ์ด ์ฑ๊ณตํ๊ณ , ์ด์ฉ ๋๋ ์๋๋ ์ํฉ์ ์ฐ์์ด์๋ค.
๋ฐฑ์๋ ๊ฐ๋ฐ์ ๋ถ์ด ํ ๋ช ์ด๋ค ๋ณด๋ ๋ค๋ฅธ ๊ตฌํ ์ฌํญ๋ ๋ง์ด ๋จ์ ์ํฉ์์ ํ์ ๊ตฌํ์ด ์๋ ํ ํฐ์๋ง ์ง์คํ ์๊ฐ ์์ด์
refresh ํ ํฐ์ main ํ๋ก์ ํธ์์ ๊ตฌํ๊ธฐ๋ก ํ๋ค.
+ main ํ๋ก์ ํธ์์ ๋ง๋ ๋ฉํ ๋์ refresh token์ ํ์๊ฐ ์๋๋ access token ๋ง์ผ๋ก๋ ์ถฉ๋ถํ๋ค๊ณ ํ์ จ๋ค.
๋น์์๋ refresh token ์ ๊ตฌํํ๊ธฐ ์ํด ์ฒ์์ผ๋ก axios interceptor๋ฅผ ์ฌ์ฉํ๋ค.
๐ axios interceptor
ํ ํฐ์ด ๋ง๋ฃ๋ ๊ฒฝ์ฐ์ ์ด๋ค ์ผ์ด ์ผ์ด๋๋์ง, ํ๋ก ํธ๋ก ์ด๋ค ์๋ต์ด ์ค๋์ง,
๊ทธ๋ผ ํ๋ก ํธ์์๋ ์ด๋ค ํํ๋ก refreshํ ํฐ์ ์ ๋ฌํด์ผํ๋์ง ๋ฐฑ์๋๋ถ๋ค๋ ์ฐ๋ฆฌ๋ ์๋ชฐ๋ผ์ ์ ํํ ๋ชจ๋ฅด๋ ์ํ์ฌ์ ํ๋ค์๋ค.
๊ทธ๋์ ์๋ฒ์์ header์ ๋ ํ ํฐ์ ๋๊ฒจ์ค๋ค๋ ๊ฒ, ๋ง๋ฃ ์ ๋ค์ ์์ฒญ์ ๋ณด๋ธ๋ค๋ ๊ฒ๋ง ์ ์ ๋ก ์กฐ์ฌ ํ๊ณ ,
ํด๋ผ์ด์ธํธ์์ ์ต๋ํ ํด๊ฒฐ์ ํ๋ ค๊ณ ๋ ธ๋ ฅ ํ๋ค๋ณด๋,
"๋ง๋ฃ ์๋ต(์๋ฌ)๊ฐ ์ค๋ฉด catch ์์์ refresh ํ ํฐ์ ๋ค์ ๋ณด๋ด๋" ์ฝ๋๋ฅผ ์ง๋ ค๊ณ ํ๋ค.
ํ์ง๋ง catch ์์์ ๋ค์ http ์์ฒญ์ด ๊ฐ๋ฅํ์ง ํ์ธํ ์๊ฐ ์์๋ค.
๊ทธ๋๋ ๊ทธ err์ ๋ด๊ธด ๋ง๋ฃ ์ฌ๋ถ๋ฅผ ์ฝ์ด์ผ๋ง refresh ํ ํฐ์ ๋ณด๋ผ ์ ์์ผ๋,
์ฌ๋ฌ ๋ฐฉ๋ฒ์ ํ์ํ๋ ์ค, axios์ interceptor ๋ผ๋ ๊ฒ์ ๋ฐ๊ฒฌํ๋ค.
interceptor๋ axios์ ๊ธฐ๋ฅ ์ค ํ๋๋ค. ์์ฒญ๊ณผ ์๋ต์ ์ค๊ฐ์ ์ธํฐ์ ํธ~
๊ฐ๋ก์ฑ์ ๋ฌด์ธ๊ฐ ์ด์ ๋ถ์ธ ๋ค์์ ๋ณด๋ธ๋ค๊ณ ์๊ฐํ๋ฉด ์ฝ๋ค.
๋ฌผ๋ก ์ฐ๋ฆฌ๊ฐ ์ํ๋, http ์์ฒญ๋ ๊ฐ๋ฅํ๋ค! ์ค์ ์ด ๊ทธ๋ฆฌ ์ด๋ ต์ง ์๋ค.
ํ์ง๋ง ์ฐ๋ฆฌ๋ axios ์ธ์คํด์ค์ ๊ธฐ๋ณธ ์ค์ ํ ํ์๋ฅผ ๋ชป๋๊ปด์ ์ธ์คํด์ค๋ฅผ ๋ง๋ค๊ณ ์ถ์ง ์์๊ณ ,
์์ฒญํ ๋๋ interceptor ๊ธฐ๋ฅ์ด ํ์ํ์ง ์์๋ค. ์ฐ๋ฆฌ๊ฐ ํ์ํ ๊ฑด ๋ฑ ํ๋.
"์๋ต ์ ํ ํฐ ๋ง๋ฃ ์๋ฌ๊ฐ ์๊ธฐ๋ฉด intercept ํด์ ํ ํฐ์ ๊ฐฑ์ ํ๊ณ , ์๋ก์ด ํ ํฐ์ผ๋ก ์ด์ ์ ์์ฒญ์ ๋ค์ ๋ณด๋ธ๋ค" ์ด๊ฑฐ์๋ค.
๊ทธ๋์ ์ด๋ฐ ๋ก์ง์ผ๋ก ๊ตฌํ ํ๋ค.
๊ตฌํ ์ค๊ฐ์ ๊ธฐ๋กํ๋ ๊ฒ๋ค.
์๋ฒ์ ํด๋ผ์ด์ธํธ, ์๋ก์ ์ฌ์ ์ ๋ชจ๋ฅด๋ ํ๋๋ผ๋ ๊ณ์ ๊ณต์ ํ๋ ค๊ณ ๋ ธ๋ ฅํ๋ค.
๐ axios์ ๊ธฐ๋ฅ๋ค
- ์์์ JSON ๋ฐ์ดํฐ๋ก ๋ณํ ํด์ค๋ค.
- ํค๋, ์์ฒญ ์ฃผ์ ๋ฑ ๊ธฐ๋ณธ ์ค์ ์ ํ ์ธ์คํด์ค๋ฅผ ๋ง๋ค ์ ์๋ค.
- ์์ฒญ ํค๋์ ๊ธฐ๋ณธ ๊ฐ์ ์ค์ ํ ์ ์๋ค.