로그인 이후 페이지가 처음 렌더링될 때 로그인 여부를 검증하는 과정은 다음과 같습니다:
javascript코드 복사
// 예시: 페이지가 처음 렌더링될 때
async function checkLoginStatus() {
const accessToken = useAuthStore.getState().accessToken;
const response = await fetch('/api/check-auth', {
headers: { 'Authorization': `Bearer ${accessToken}` },
});
if (response.status === 200) {
// 로그인 상태 유지
} else if (response.status === 401) {
// 토큰이 만료되었을 경우
await refreshAccessToken();
// 새 액세스 토큰을 얻은 후 다시 로그인 상태를 확인
await checkLoginStatus();
} else {
// 기타 오류 처리
}
}
javascript코드 복사
// 백엔드 예시: 토큰 검증 미들웨어
function authenticateToken(req, res, next) {
const authHeader = req.headers['authorization'];
const token = authHeader && authHeader.split(' ')[1];
if (!token) return res.sendStatus(401);
jwt.verify(token, process.env.ACCESS_TOKEN_SECRET, (err, user) => {
if (err) return res.sendStatus(403);
req.user = user;
next();
});
}
javascript코드 복사
async function refreshAccessToken() {
const refreshToken = localStorage.getItem('refreshToken');
const response = await fetch('/api/token', {
method: 'POST',
body: JSON.stringify({ token: refreshToken }),
headers: { 'Content-Type': 'application/json' },
});
const data = await response.json();
if (response.status === 200) {
const { accessToken } = data;
useAuthStore.getState().setAccessToken(accessToken);
} else {
// 리프레시 토큰도 유효하지 않은 경우 로그아웃 처리
logout();
}
}
javascript코드 복사
// 백엔드 예시: 리프레시 토큰을 사용한 액세스 토큰 재발급
app.post('/api/token', (req, res) => {
const { token } = req.body;
if (!token) return res.sendStatus(401);
jwt.verify(token, process.env.REFRESH_TOKEN_SECRET, (err, user) => {
if (err) return res.sendStatus(403);
const accessToken = generateAccessToken({ name: user.name });
res.json({ accessToken });
});
});