ํ์ฌ ๋ก๊ทธ์ธ / ํ์๊ฐ์
ํ ํฐ์ ๋ก์ปฌ์คํ ๋ฆฌ์ง์ ์ ์ฅ๋์ด์๋ค.
App.jsx์์ ํ ํฐ์ ๊ฐ์ ธ์์ useState๋ก ๊ด๋ฆฌํ๋ฉด๋จ
import { useState } from "react";
import "./App.css";
import Navbar from "./components/Navbar/Navbar";
import Routing from "./components/Routing/Routing";
function App() {
const [user, setUser] = useState(null);
//์คํ ์ ๋ก์ปฌ ์คํ ๋ฆฌ์ง์์ ํ ํฐ ๊ฐ์ ธ์จ๋ค
useEffect(() => {
const jwt = localStorage.getItem("token");
}, []);
return (
<div className="app">
<Navbar />
<main>
<Routing />
</main>
</div>
);
}
export default App;
๊ทธ๋ฆฌ๊ณ ์ํธํ ๋์ด์๋ ํ ํฐ์ ํ๊ธฐ ์ํด์
npm i jwt-decode๋ฅผ ์ค์นํ๋ค.
import { jwtDecode } from "jwt-decode";
function App() {
const [user, setUser] = useState(null);
//์คํ ์ ๋ก์ปฌ ์คํ ๋ฆฌ์ง์์ ํ ํฐ ๊ฐ์ ธ์จ๋ค
useEffect(() => {
const jwt = localStorage.getItem("token");//๋ก์ปฌ์คํ ๋ฆฌ์ง์์ ํ ํฐ๊ฐ์ ธ์ด
const jwtUser = jwtDecode(jwt);//jwtDecode๋ฅผ ์ฌ์ฉํด์ ๊ฐ์ ธ์จ ํ ํฐ์ ํผ๋ค.
console.log(jwtUser);//์ ์ ์ ๋ณด๋ฅผ ์ฝ์์ ์ถ๋ ฅํ๋ค.
}, []);
์ฝ์์ ํ์ธํด๋ดค๋ค.
์ ์ ์ ๋ณด๊ฐ ์ฝ์๋ก ์ถ๋ ฅ๋จ์ ํ์ธ ๊ฐ๋ฅํ๋ค.
๊ทธ๋ฆฌ๊ณ ํ ํฐ์ด ์์ ๊ฒฝ์ฐ๋ฅผ ๋๋นํด์ try catch๋ฌธ์ผ๋ก ์๋ฌ๋ฅผ ์ฒ๋ฆฌํ๋ค.
//์คํ ์ ๋ก์ปฌ ์คํ ๋ฆฌ์ง์์ ํ ํฐ ๊ฐ์ ธ์จ๋ค
useEffect(() => {
try {
const jwt = localStorage.getItem("token"); //๋ก์ปฌ์คํ ๋ฆฌ์ง์์ ํ ํฐ๊ฐ์ ธ์ด
const jwtUser = jwtDecode(jwt); //jwtDecode๋ฅผ ์ฌ์ฉํด์ ๊ฐ์ ธ์จ ํ ํฐ์ ํผ๋ค.
console.log(jwtUser); //์ ์ ์ ๋ณด๋ฅผ ์ฝ์์ ์ถ๋ ฅํ๋ค.
} catch (error) {}
}, []);
์ํ๋ฆฌํฐ ๋ฌธ์ ๋ก jwt ํ ํฐ์ ์ ํจ๊ฐ๋ฅ ์๊ฐ์ด ์ค์ ๋์ด ์๋ค.
์ฌ๊ธฐ์๋ 1์๊ฐ์ธ๋ฐ ์ค์ ์๋น์ค์์๋ ๋ ์งง๊ฒ ์ก์ ์ ์๋ค.
์ ํจ๊ธฐ๊ฐ์ด ์ง๋ ํ ํฐ์ ์ ๋ณด๋ ์ญ์ ํ์.
//์คํ ์ ๋ก์ปฌ ์คํ ๋ฆฌ์ง์์ ํ ํฐ ๊ฐ์ ธ์จ๋ค
useEffect(() => {
try {
const jwt = localStorage.getItem("token"); //๋ก์ปฌ์คํ ๋ฆฌ์ง์์ ํ ํฐ๊ฐ์ ธ์ด
const jwtUser = jwtDecode(jwt); //jwtDecode๋ฅผ ์ฌ์ฉํด์ ๊ฐ์ ธ์จ ํ ํฐ์ ํผ๋ค.
//console.log(jwtUser); //์ ์ ์ ๋ณด๋ฅผ ์ฝ์์ ์ถ๋ ฅํ๋ค.
if (Date.now() >= jwtUser.exp * 1000) {
localStorage.removeItem("token"); //๋จ์ฝ ์ ํจ๊ธฐ๊ฐ ์ง๋๋ฉด ์ญ์
location.reload();
} else {
setUser(jwtUser); // ์ ์ ์ ๋ณด User์ ์ ์ฅ
}
} catch (error) {}
}, []);
๊ทธ๋ฆฌ๊ณ ์ ์ ์ ๋ณด๋ Navbar์ ๋ณด๋ธ๋ค.
return (
<div className="app">
<Navbar user={user} />
์ ์ ๊ฐ ์์ผ๋ฉด ๋ด์ฃผ๋ฌธ/๋ก๊ทธ์์ /์ฅ๋ฐ๊ตฌ๋ ์ถ๋ ฅ
์์ผ๋ฉด ๋ก๊ทธ์ธ/๊ฐ์
์ถ๋ ฅ
const Navbar = ({ user }) => {
<div className="align_center navbar_links">
<LinkWithIcon title="ํํ์ด์ง" link="." emoji={rocket} />
<LinkWithIcon title="์ํ๋ค" link="/products" emoji={star} />
{!user && (
<>
<LinkWithIcon title="๋ก๊ทธ์ธ" link="/login" emoji={idButton} />
<LinkWithIcon title="๊ฐ์
" link="/signup" emoji={memo} />
</>
)}
{user && (
<>
<LinkWithIcon title="๋ด์ฃผ๋ฌธ" link="/myorders" emoji={order} />
<LinkWithIcon title="๋ก๊ทธ์์" link="/logout" emoji={lock} />
<NavLink to="/cart" className="align_center">
์ฅ๋ฐ๊ตฌ๋ <p className="align_center cart_counts">0</p>
</NavLink>
</>
)}
</div>
์ ์ ์ ๋ณด ์์ ๊ฒฝ์ฐ
์ ์ ์ ๋ณด ์์ ๊ฒฝ์ฐ
๋ก๊ทธ์์
const Logout = () => {
localStorage.removeItem("token");
window.location = "/";
return null;
};
export default Logout;
๋ผ์ฐํ
์ ๋ก๊ทธ์์ ์ถ๊ฐ
const Routing = () => {
return (
<Routes>
<Route path="/" element={<HomePage />} />
<Route path="/products" element={<ProductsPage />} />
<Route path="/product/:id" element={<SingleProductPage />} />
<Route path="/signup" element={<SignupPage />} />
<Route path="/login" element={<LoginPage />} />
<Route path="/cart" element={<CartPage />} />
<Route path="/myorders" element={<MyOrderPage />} />
<Route path="/logout" element={<Logout />} />
</Routes>
);
};