-
Notifications
You must be signed in to change notification settings - Fork 7
/
Copy pathtokenValidator.tsx
85 lines (71 loc) · 2.43 KB
/
tokenValidator.tsx
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
'use client';
import { useEffect } from 'react';
import { jwtDecode } from 'jwt-decode';
import Cookies from 'js-cookie';
import { useRecoilState } from 'recoil';
import { isLoggedInState } from '@/atoms/authAtom';
import { cookies } from 'next/headers';
// JWT Payload 타입 정의
interface JwtPayload {
exp?: number;
}
// 토큰 유효성 확인 함수
function checkTokenValidity(): boolean {
const token = Cookies.get('access_token');
if (token) {
try {
const decoded = jwtDecode<JwtPayload>(token);
const currentTime = Date.now() / 1000;
// 토큰 만료 확인
if (decoded.exp && decoded.exp > currentTime) {
return true;
}
} catch (error) {
console.error('Invalid token:', error);
}
}
// 토큰이 없거나 만료되었거나 유효하지 않은 경우
return false;
}
// 상태 관리 및 자동 로그아웃 처리
export function useTokenValidator() {
const [, setLoggedIn] = useRecoilState(isLoggedInState);
useEffect(() => {
const token = Cookies.get('access_token');
if (token) {
try {
const decoded = jwtDecode<JwtPayload>(token);
const currentTime = Date.now() / 1000;
if (decoded.exp && decoded.exp > currentTime) {
// 만료 시간까지 남은 시간을 계산
const expirationTime = decoded.exp - currentTime;
// 만료 시간 이후 로그아웃 처리
const timeoutId = setTimeout(() => {
Cookies.remove('access_token');
setLoggedIn(false);
}, expirationTime * 1000);
// 컴포넌트 언마운트 시 타이머 해제
return () => clearTimeout(timeoutId);
} else {
// 토큰이 만료된 경우 즉시 로그아웃 처리
Cookies.remove('access_token');
setLoggedIn(false);
}
} catch (error) {
console.error('Invalid token:', error);
Cookies.remove('access_token');
setLoggedIn(false);
}
} else {
// 토큰이 없는 경우
setLoggedIn(false);
}
}, [setLoggedIn]); // setLoggedIn 의존성
useEffect(() => {
// 강제 렌더링 유도 (의도적으로 상태 변경)
const intervalId = setInterval(() => {
setLoggedIn((prev) => prev); // 상태 갱신 없이 useEffect 트리거
}, 1000); // 브라우저 접속을 체크하기 위한 주기적 실행
return () => clearInterval(intervalId);
}, [setLoggedIn]);
}