prepare( "SELECT * FROM edu_users WHERE member_id = ? AND sys_comp_code = ? LIMIT 1" ); $stmt->execute([$memberIdInput, $sysCompCode]); $user = $stmt->fetch(PDO::FETCH_ASSOC) ?: null; $storedPw = trim((string) ($user['intra_pw'] ?? '')); $verified = $user && ($storedPw !== '') && hash_equals($storedPw, $passwordInput); if (!$verified) { $back = '/skin/login.php?error=' . rawurlencode('ID 또는 비밀번호가 올바르지 않습니다.') . '&redirect=' . rawurlencode($redirect) . '&member_id=' . rawurlencode($memberIdInput) . '&sys_comp_code=' . rawurlencode($sysCompCode); header('Location: ' . $back); exit; } // 세션 초기화 후 세션 지정 $_SESSION = []; // 기존 세션 데이터 전체 초기화 session_regenerate_id(true); // 새 세션 ID 발급 (세션 고정 공격 방지) $_SESSION['member_id'] = (string) $user['member_id']; $_SESSION['sys_comp_code'] = (string) ($user['sys_comp_code'] ?? ''); $_SESSION['belong_comp'] = (string) ($user['belong_comp'] ?? ''); $_SESSION['working_comp'] = (string) ($user['working_comp'] ?? ''); $_SESSION['member_name'] = (string) ($user['name'] ?? ''); $_SESSION['auth_level'] = (string) ($user['auth_level'] ?? 0); // Keep the full edu_users row in session for cross-page use (password excluded). unset($user['intra_pw']); $_SESSION['edu_user'] = $user; $_SESSION['edu_user_all'] = $user; foreach ($user as $field => $value) { $_SESSION['edu_user_' . $field] = $value; } $_SESSION['edu_login'] = '1'; $_SESSION['edu_login_at'] = date('Y-m-d H:i:s'); // 2026-04-02 권오재 추가.--- [추가: 접속 이력 프로시저 호출] --- // 1. 정보 수집 $ip_address = $_SERVER['REMOTE_ADDR']; $user_agent = $_SERVER['HTTP_USER_AGENT']; // OS 및 디바이스 판별 (간단한 예시) $os_name = 'Unknown OS'; if (preg_match('/windows|win32/i', $user_agent)) $os_name = 'Windows'; else if (preg_match('/macintosh|mac os x/i', $user_agent)) $os_name = 'Mac OS'; else if (preg_match('/android/i', $user_agent)) $os_name = 'Android'; else if (preg_match('/iphone/i', $user_agent)) $os_name = 'iOS'; $device_type = (preg_match('/mobile|android|iphone|ipad/i', $user_agent)) ? 'Mobile' : 'PC'; // 브라우저명 추출 $browser_name = 'Unknown Browser'; if (strpos($user_agent, 'MSIE') !== FALSE || strpos($user_agent, 'Trident') !== FALSE) $browser_name = 'IE'; else if (strpos($user_agent, 'Edge') !== FALSE) $browser_name = 'Edge'; else if (strpos($user_agent, 'Chrome') !== FALSE) $browser_name = 'Chrome'; else if (strpos($user_agent, 'Firefox') !== FALSE) $browser_name = 'Firefox'; else if (strpos($user_agent, 'Safari') !== FALSE) $browser_name = 'Safari'; // 2. 프로시저 실행 $stmtLog = $pdo->prepare("CALL proc_insert_edu_access_log(?, ?, ?, ?, ?, ?)"); $stmtLog->execute([ $_SESSION['member_id'], $_SESSION['sys_comp_code'], $ip_address, $os_name, $device_type, $browser_name ]); header('Location: ' . $redirect); exit; } catch (Throwable $e) { $back = '/skin/login.php?error=' . rawurlencode('로그인 처리 중 오류가 발생했습니다.') . '&redirect=' . rawurlencode($redirect) . '&member_id=' . rawurlencode($memberIdInput); header('Location: ' . $back); exit; }