๐ฏ ํ์ต ๋ชฉํ
- JWT ํ ํฐ์ ์ค์ ๋
exp
(๋ง๋ฃ์๊ฐ)๋ฅผ ํ์ฑํ์ฌ ํ์ธ - ํ ํฐ์ด ๋ง๋ฃ๋์์ผ๋ฉด ์๋์ผ๋ก ๋ก๊ทธ์์ ์ฒ๋ฆฌ ๋ฐ ์๋ฆผ
- ์ฑ์ด ์์๋๊ฑฐ๋ ํ์ด์ง ์ด๋ ์๋ง๋ค ๋ง๋ฃ ์ฌ๋ถ ๊ฒ์ฌ
โ
1. JWT ํ ํฐ์์ ๋ง๋ฃ์๊ฐ(exp
) ์ฝ๋ ํจ์ ์์ฑ
๐ src/utils/jwt.js
์์ฑ
export function getTokenPayload(token) {
try {
const payload = token.split('.')[1];
const decoded = atob(payload);
return JSON.parse(decoded); // { exp, username, ... }
} catch {
return null;
}
}
export function isTokenExpired(token) {
const payload = getTokenPayload(token);
if (!payload || !payload.exp) return true; // ์ ํจํ์ง ์์ ํ ํฐ์ ๋ง๋ฃ ์ฒ๋ฆฌ
const now = Math.floor(Date.now() / 1000); // ํ์ฌ ์๊ฐ (์ด ๋จ์)
return payload.exp < now; // true๋ฉด ๋ง๋ฃ๋จ
}
โ
2. Vuex
์คํ ์ด์์ ๋ง๋ฃ ํ์ธ ๋ฐ ์๋ ๋ก๊ทธ์์ ์ถ๊ฐ
๐ง store/index.js
์์
import Vue from 'vue';
import Vuex from 'vuex';
import { isTokenExpired } from '../utils/jwt';
Vue.use(Vuex);
export default new Vuex.Store({
state: {
isDark: localStorage.getItem('theme') === 'dark',
isLoggedIn: false,
},
mutations: {
toggleDark(state) {
state.isDark = !state.isDark;
localStorage.setItem('theme', state.isDark ? 'dark' : 'light');
},
login(state, token) {
localStorage.setItem('token', token);
state.isLoggedIn = true;
},
logout(state) {
localStorage.removeItem('token');
state.isLoggedIn = false;
},
syncLoginState(state) {
const token = localStorage.getItem('token');
if (!token || isTokenExpired(token)) {
localStorage.removeItem('token');
state.isLoggedIn = false;
} else {
state.isLoggedIn = true;
}
},
},
});
syncLoginState() ๋ด๋ถ์์ ํ ํฐ ๋ง๋ฃ ์ฌ๋ถ๋ฅผ ๊ฒ์ฌํ๊ณ , ๋ง๋ฃ๋์์ผ๋ฉด ์๋ ๋ก๊ทธ์์ ์ฒ๋ฆฌํฉ๋๋ค.
โ
3. App.vue
์์ ์ฑ ์์ ์ ๋๊ธฐํ ํธ์ถ
created() {
this.syncLoginState();
}
โ 4. ๋ผ์ฐํฐ ์ด๋ ์ ํ ํฐ ๋ง๋ฃ๋ ์ฒดํฌ
๐ง router.js
import store from './store';
router.beforeEach((to, from, next) => {
store.commit('syncLoginState'); // โ
์ด๋ ์ ๋ง๋ค ๋ก๊ทธ์ธ ์ํ ๋๊ธฐํ
if (to.matched.some((record) => record.meta.requiresAuth)) {
if (!store.state.isLoggedIn) {
alert('์ธ์
์ด ๋ง๋ฃ๋์๊ฑฐ๋ ๋ก๊ทธ์ธ๋์ง ์์์ต๋๋ค.');
next('/login');
} else {
next();
}
} else {
next();
}
});
๐ฆ ์์ฝ
์ด ๊ฐ์์์๋ JWT์ exp ๊ฐ์ ๊ฒ์ฌํด ํ ํฐ ๋ง๋ฃ ์ฌ๋ถ๋ฅผ ํ์ธํ๊ณ , ๋ง๋ฃ๋ ๊ฒฝ์ฐ ์๋ ๋ก๊ทธ์์ ์ฒ๋ฆฌ ๊ธฐ๋ฅ์ ์ถ๊ฐํ์์ต๋๋ค. ์ด๋ฅผ ํตํด ๋ณด์๊ณผ ์ฌ์ฉ์ ๊ฒฝํ์ ๋์์ ๊ฐ์ ํ์ต๋๋ค.
๐ฌ ๋๊ธ
โป ๋ก๊ทธ์ธ ํ ๋๊ธ์ ์์ฑํ ์ ์์ต๋๋ค.