2023-07-07 598 View 공개 |
PHP 세션을 이용해 한 PC에서만 로그인이 되도록 하는 방법은 여러가지가 있다. 간단하게는 클라이언트의 IP 주소를 세션에 저장하고 이를 사용자가 로그인할 때마다 확인하는 방법이 있다. 그러나 이 방법은 네트워크 변경, VPN 사용 등의 이유로 IP 주소가 변경될 수 있어 완벽하지 않다. 더 안정적인 방법은 로그인할 때마다 사용자의 세션 ID를 변경하고, 이를 데이터베이스에 저장하는 방법이다. 그런 다음, 사용자가 페이지를 방문할 때마다 세션 ID를 확인한다. 만약 세션 ID가 데이터베이스에 저장된 ID와 일치하지 않으면, 그것은 또 다른 PC에서 로그인이 시도되었음을 의미한다. 이 때, 이전 세션을 무효화하고 새로운 세션을 시작할 수 있다. 아래는 이에 대한 대략적인 코드이다.
<?php session_start(); // DB에 연결 $db = new PDO('mysql:host=localhost;dbname=testdb;charset=utf8', 'username', 'password'); // 사용자를 검증하는 당신의 로그인 스크립트가 있다고 가정 if (authenticate_user($username, $password)) { // 사용자가 인증되면 새로운 세션 ID를 생성하고 저장 session_regenerate_id(); $_SESSION['username'] = $username; // 사용자의 세션 ID를 DB에 저장 $stmt = $db->prepare('UPDATE users SET session_id = ? WHERE username = ?'); $stmt->execute([session_id(), $username]); } // 사용자가 페이지를 방문할 때마다 세션 ID를 확인 else { $stmt = $db->prepare('SELECT session_id FROM users WHERE username = ?'); $stmt->execute([$_SESSION['username']]); $result = $stmt->fetch(); if (session_id() != $result['session_id']) { // 다른 PC에서 로그인이 감지되면 현재 세션을 무효화 session_unset(); session_destroy(); // 로그인 페이지로 리다이렉트 header('Location: /login.php'); exit; } } ?>
이 코드는 암호가 이미 검증되었고, 세션 시작 부분과 검증 부분이 적절히 배치되었다는 가정 하에 작성된 것이다. 실제로 이 코드를 사용하려면 자신의 애플리케이션에 맞게 수정해야 한다.