ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

Issue

ํšŒ์‚ฌ ํ”„๋กœ์ ํŠธ ๋„์ค‘, ์‚ฌ์šฉ์ž์˜ ์ธ์ฆ/์ธ๊ฐ€๋ฅผ ํ†ตํ•ด ์„œ๋น„์Šค๋ฅผ ๊ตฌ์ถ•ํ•˜๊ธฐ ์œ„ํ•ด ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐœ๊ธ‰ ๋ฐ›์€ 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

 

Store - Redux

console.log('Some deep nested property changed from', previousValue, 'to', currentValue)

lunit.gitbook.io

 

๋Œ“๊ธ€
๊ณต์ง€์‚ฌํ•ญ
์ตœ๊ทผ์— ์˜ฌ๋ผ์˜จ ๊ธ€
์ตœ๊ทผ์— ๋‹ฌ๋ฆฐ ๋Œ“๊ธ€
Total
Today
Yesterday
๋งํฌ
TAG
more
ยซ   2024/10   ยป
์ผ ์›” ํ™” ์ˆ˜ ๋ชฉ ๊ธˆ ํ† 
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
๊ธ€ ๋ณด๊ด€ํ•จ