자동로그인, 아이디 패스워드 찾기 적용1
This commit is contained in:
@@ -22,14 +22,49 @@ export default function LoginPage() {
|
||||
const [idError, setIdError] = useState("");
|
||||
const [passwordError, setPasswordError] = useState("");
|
||||
|
||||
// 컴포넌트 마운트 시 저장된 아이디 불러오기
|
||||
// 컴포넌트 마운트 시 저장된 아이디 불러오기 및 자동 로그인 확인
|
||||
useEffect(() => {
|
||||
const savedId = localStorage.getItem('savedUserId');
|
||||
if (savedId) {
|
||||
setUserId(savedId);
|
||||
setRememberId(true);
|
||||
}
|
||||
}, []);
|
||||
|
||||
// 자동 로그인 확인: localStorage에 토큰이 있고 쿠키에도 토큰이 있으면 자동 로그인
|
||||
const savedToken = localStorage.getItem('token');
|
||||
const cookieToken = document.cookie
|
||||
.split('; ')
|
||||
.find(row => row.startsWith('token='))
|
||||
?.split('=')[1];
|
||||
|
||||
if (savedToken && cookieToken && savedToken === cookieToken) {
|
||||
// 토큰이 유효한지 확인
|
||||
fetch('https://hrdi.coconutmeet.net/auth/me', {
|
||||
method: 'GET',
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
Authorization: `Bearer ${savedToken}`,
|
||||
},
|
||||
})
|
||||
.then(response => {
|
||||
if (response.ok) {
|
||||
// 토큰이 유효하면 메인 페이지로 리다이렉트
|
||||
const searchParams = new URLSearchParams(window.location.search);
|
||||
const redirectPath = searchParams.get('redirect') || '/';
|
||||
router.push(redirectPath);
|
||||
} else {
|
||||
// 토큰이 유효하지 않으면 삭제
|
||||
localStorage.removeItem('token');
|
||||
document.cookie = 'token=; path=/; max-age=0';
|
||||
}
|
||||
})
|
||||
.catch(() => {
|
||||
// 에러 발생 시 토큰 삭제
|
||||
localStorage.removeItem('token');
|
||||
document.cookie = 'token=; path=/; max-age=0';
|
||||
});
|
||||
}
|
||||
}, [router]);
|
||||
|
||||
// 아이디 기억하기 상태나 아이디가 변경될 때마다 저장 처리
|
||||
useEffect(() => {
|
||||
@@ -99,10 +134,17 @@ export default function LoginPage() {
|
||||
// 로그인 성공 시 토큰 저장 (다양한 필드명 지원)
|
||||
const token = data.token || data.accessToken || data.access_token;
|
||||
if (token) {
|
||||
localStorage.setItem('token', token);
|
||||
// 쿠키에도 토큰 저장 (middleware에서 사용)
|
||||
document.cookie = `token=${token}; path=/; max-age=${30 * 24 * 60 * 60}; SameSite=Lax`;
|
||||
console.log("토큰 저장 완료");
|
||||
if (autoLogin) {
|
||||
// 자동 로그인이 체크되어 있으면 localStorage와 쿠키에 장기 저장 (30일)
|
||||
localStorage.setItem('token', token);
|
||||
document.cookie = `token=${token}; path=/; max-age=${30 * 24 * 60 * 60}; SameSite=Lax`;
|
||||
console.log("자동 로그인 토큰 저장 완료 (30일 유지)");
|
||||
} else {
|
||||
// 자동 로그인이 체크되어 있지 않으면 쿠키에만 세션 쿠키로 저장 (브라우저 종료 시 삭제)
|
||||
// localStorage에는 저장하지 않음
|
||||
document.cookie = `token=${token}; path=/; SameSite=Lax`;
|
||||
console.log("세션 토큰 저장 완료 (브라우저 종료 시 삭제)");
|
||||
}
|
||||
} else {
|
||||
console.warn("토큰이 응답에 없습니다. 응답 데이터:", data);
|
||||
// 토큰이 없어도 로그인은 성공했으므로 진행
|
||||
|
||||
Reference in New Issue
Block a user