Computer >> 컴퓨터 >  >> 프로그래밍 >> PHP

PHP에서 폼 제출 시 중복 데이터 삽입을 방지하는 방법

PHP 세션을 활용한 중복 제출 방지 개요

PHP에서는 세션(Session)을 활용하면 폼 제출 시 발생하는 중복 데이터 삽입을 효과적으로 방지할 수 있습니다. 핵심 원리는 다음과 같습니다.

먼저 세션 변수(예: $_SESSION['posttimer'])에 POST 요청이 발생한 현재 타임스탬프(timestamp)를 저장합니다. 그다음 PHP에서 폼 데이터를 실제로 처리하기 전에 해당 세션 변수가 존재하는지 확인하고, 마지막 POST와의 시간 차이가 특정 기준(예: 2~3초) 이내인지 검사합니다. 이렇게 하면 사실상 중복에 해당하는 삽입 요청을 식별하고 걸러낼 수 있습니다.

기본 폼 작성하기

간단한 HTML 폼 예시입니다.

// form.html
<form action="my_session_file.php" method="post">
    <input type="text" name="bar" />
    <input type="submit" value="저장">
</form>

위 폼의 action 속성에서 참조하는 'my_session_file.php' 파일에는 아래와 같은 코드를 작성합니다.

세션 타이머 검증 코드 예제

if (isset($_POST) && !empty($_POST)) {
    if (isset($_SESSION['posttimer'])) {
        if ((time() - $_SESSION['posttimer']) <= 2) {
            // 마지막 POST로부터 2초 이내 → 중복 제출로 판단
        } else {
            // 마지막 POST로부터 2초 초과 → 정상적인 새 요청
        }
    }
    $_SESSION['posttimer'] = time();
}

실행 결과

위 코드를 실행하면 다음과 같은 결과를 얻을 수 있습니다.

중복 없이 고유한 폼 데이터만 저장됩니다.

동작 원리 정리

이 방식의 흐름을 정리하면 다음과 같습니다.

POST 요청이 들어오면 posttimer 세션 변수가 설정되어 있는지 먼저 확인합니다. 만약 마지막 POST 작업으로부터 2초 이내의 요청이라면 중복 제출로 간주하여 데이터 저장을 건너뜁니다. 반대로 2초보다 긴 시간이 경과한 요청이라면 정상적인 새 데이터로 처리하여 저장합니다. 이후 time() 함수를 호출해 현재 시각 값을 다시 posttimer 세션 변수에 할당함으로써, 다음 요청부터 같은 검증 로직이 적용될 수 있도록 합니다.

이처럼 세션 기반 타임스탬프 검증은 별도의 데이터베이스 구조 변경 없이도 사용자의 새로고침이나 더블 클릭으로 인한 중복 삽입 문제를 손쉽게 해결할 수 있는 실용적인 방법입니다.