최초 작성일 : 2023-07-07 | 수정일 : 2023-07-07 | 조회수 : |
PHP 세션을 이용해 한 PC에서만 로그인이 되도록 하는 방법은 여러가지가 있다.
간단하게는 클라이언트의 IP 주소를 세션에 저장하고 이를 사용자가 로그인할 때마다 확인하는 방법이 있다.
그러나 이 방법은 네트워크 변경, VPN 사용 등의 이유로 IP 주소가 변경될 수 있어 완벽하지 않다.
더 안정적인 방법은 로그인할 때마다 사용자의 세션 ID를 변경하고, 이를 데이터베이스에 저장하는 방법이다.
그런 다음, 사용자가 페이지를 방문할 때마다 세션 ID를 확인한다.
만약 세션 ID가 데이터베이스에 저장된 ID와 일치하지 않으면, 그것은 또 다른 PC에서 로그인이 시도되었음을 의미한다.
이 때, 이전 세션을 무효화하고 새로운 세션을 시작할 수 있다.
아래는 이에 대한 대략적인 코드이다.
php<?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;
}
}
?>
이 코드는 암호가 이미 검증되었고, 세션 시작 부분과 검증 부분이 적절히 배치되었다는 가정 하에 작성된 것이다.
실제로 이 코드를 사용하려면 자신의 애플리케이션에 맞게 수정해야 한다.
Tags #php