자동로그인, 아이디 패스워드 찾기 적용1

This commit is contained in:
2025-11-26 20:38:03 +09:00
parent 6434c580fe
commit 47eedf6837
2 changed files with 272 additions and 25 deletions

View File

@@ -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);
// 토큰이 없어도 로그인은 성공했으므로 진행