ํฐ์คํ ๋ฆฌ ๋ทฐ
redux ์ฌ์ฉ ์, ๋ฐ๊ธ ๋ฐ์ JWT ํ ํฐ localstorage์ ์ ์ฅํ๊ธฐ
choi95 2022. 3. 26. 15:03Issue
ํ์ฌ ํ๋ก์ ํธ ๋์ค, ์ฌ์ฉ์์ ์ธ์ฆ/์ธ๊ฐ๋ฅผ ํตํด ์๋น์ค๋ฅผ ๊ตฌ์ถํ๊ธฐ ์ํด ์๋ฒ๋ก๋ถํฐ ๋ฐ๊ธ ๋ฐ์ JWT ํ ํฐ์ ์ด๋์ ์ ์ฅํด์ผ ๋ ์ง ๋ง์ ๊ณ ๋ฏผ์ด ์์๋ค.
์ฒ์์๋ store์ ๋ฐ๊ธ ๋ฐ์ JWT ํ ํฐ์ ์ ์ฅํด์ฃผ๋ ๋ฐฉ์์ผ๋ก ์งํํ์๋๋ฐ, JWT ํ ํฐ์ด ํ์ํ ์ํฉ๋ง๋ค ๋งค๋ฒ store์ ์ ์ฅ๋์ด ์๋ ๊ฐ์ useSelector()๋ฅผ ํตํด ๊ฐ์ ธ์ค๋ ๊ฒ์ ์ ์ฒด ์ฝ๋๋ฅผ ๋ฒ์กํ๊ฒ ๋ง๋๋ ๋ฌธ์ ๊ฐ ์์๋ค.
๋ณด์์์ ์ด์๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ๋ฐฑ์๋ ์ธก๊ณผ ์ํตํ์ฌ refresh token์ ์ฌ์ฉํ๋ ๋ฐฉ์์ด ๊ฐ์ฅ ์ข์๊ฒ ์ง๋ง ๋น์ ๋ฐฑ์๋ ๊ฐ๋ฐ์์ ์ํฉ์ด ์ฌ์์น ์์๊ธฐ ๋๋ฌธ์ ํด๋ผ์ด์ธํธ ์ธก์์ ํ ์ ์๋ ์ต์ ์ ๋ฐฉ๋ฒ์ ์ ํํ๊ธฐ๋ก ํ์๋ค.
์ด์ ๋ฐ๊ธ ๋ฐ์ JWT ํ ํฐ์ localstorage์ ์ ์ฅํ๋ ๋ฐฉ์์ ํ๋ก์ ํธ์ ์ ๋ชฉํ๊ธฐ๋ก ํ์๋ค.
Code
์ฐ์ , ๋ก๊ทธ์ธํ์ฌ ๋ฐ๊ธ ๋ฐ์ JWT ํ ํฐ์ store์ token ์ด๋ผ๋ ํค ๊ฐ์ ์ ์ฅํ์ฌ ์ฃผ์๋ค.
const initialState = {
( ... )
token: ""
};
token ํค ๊ฐ์ด ๋ณ๊ฒฝ๋์ด ์ํ ํธ๋ฆฌ๊ฐ ๋ณ๊ฒฝ์ด ๋๋ฉด, ์ด๋ฅผ ๊ฐ์งํ๊ธฐ ์ํด index.js์์ store ์ธ์คํด์ค์ getState()์ subscribe()์ ๋ค์๊ณผ ๊ฐ์ด ์ฌ์ฉํ์๋ค.
( ... )
import { loadState, saveState } from "./localStorage";
const sagaMiddleware = createSagaMiddleware();
const persistedState = loadState();
const store = createStore(
rootReducer,
composeWithDevTools(applyMiddleware(sagaMiddleware))
);
store.subscribe(() => {
saveState({ ...persistedState, access_token: store.getState().auth.token });
});
( ... )
subscribe() ์ ๋ฌ ์ธ์์ ์ํ ํธ๋ฆฌ๊ฐ ๋ฐ๋๊ฒ ๋ ๋๋ง๋ค ํธ์ถํ ์ฝ๋ฐฑ ํจ์๋ฅผ ๋ฃ์ด์ฃผ์๊ณ , ํด๋น ์ฝ๋ฐฑ ํจ์ ๋ด์์ localstorage์ JWT ํ ํฐ์ ์ ์ฅํด์ฃผ๋ ์ญํ ์ ํ๋ saveState() ์ ํธ ํจ์๋ฅผ ํธ์ถํ์๋ค.
saveState ์ ํธ ํจ์๋ access_token์ ํค ๊ฐ์ผ๋ก ๊ฐ๋ ์ต๋ช ๊ฐ์ฒด๋ฅผ ์ธ์๋ก ๋ฐ๋๋ฐ, JWT ํ ํฐ์ด ์ฌ๋ฐ๊ธ๋ ๋์ ๊ฐ์ด ํ์ฅ์ฑ์ ๊ณ ๋ คํ์ฌ ๋ ๋ค๋ฅธ ์ ํธ ํจ์์ธ loadState()๊ฐ ๋ฐํ ํ ์ด์ ํ ํฐ ์ ๋ณด๋ฅผ ์คํ๋ ๋ ๋ฌธ๋ฒ์ ์ฌ์ฉํ์ฌ access_token ๊ฐ์ ๋งค๋ฒ ์ฌํ ๋นํด์ฃผ์๋ค.
๊ทธ๋ฆฌ๊ณ loadsState()์ saveState() ์ ํธ ํจ์๋ ๋ค์๊ณผ ๊ฐ์ด ์ ์ํ์๋ค.
export const loadState = () => {
try {
const serializedState = localStorage.getItem("state");
if (serializedState === null) {
return undefined;
}
return JSON.parse(serializedState);
} catch (error) {
return undefined;
}
};
export const saveState = state => {
try {
const serializedState = JSON.stringify(state);
localStorage.setItem("state", serializedState);
} catch (error) {
// Ignore write errors.
}
};
LocalStorage์ getItem()๊ณผ setItem()์ ์ฌ์ฉํ์ฌ serialize ํ JWT ํ ํฐ ์ ๋ณด๋ฅผ ์ ์ฅํด์ฃผ๋๋ก ๋ก์ง์ ๊ตฌ์ฑํ์๊ณ , ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธ์ ํ ๋๋ง๋ค ๋ฐ๊ธ ๋ฐ์ JWT ํ ํฐ์ localstorage์ ์ ์ฅํ ์ ์์๋ค.
Reference
https://lunit.gitbook.io/redux-in-korean/api/store