PHP와 쿠키를 사용하여 안전한 '기억하기' 기능을 구현하려면 어떻게 해야 합니까?

Susan Sarandon
풀어 주다: 2024-11-11 00:26:02
원래의
587명이 탐색했습니다.

How can I implement a secure

PHP 로그인 시스템: Remember Me(영구 쿠키)

소개

"remember me" 기능을 구현하면 사용자는 브라우저를 닫은 후에도 로그인 상태를 유지합니다. 이 기능은 사용자 편의성을 향상시키고 전반적인 사용자 경험을 향상시킵니다. 이 글에서는 지속적인 로그인 메커니즘을 위해 사용자의 브라우저에서 쿠키를 저장하고 확인하는 안전한 방법을 살펴보겠습니다.

쿠키를 안전하게 저장

안전하게 쿠키를 저장하면 데이터베이스에서 별도의 테이블을 활용합니다.

CREATE TABLE `auth_tokens` (
    `id` integer(11) not null UNSIGNED AUTO_INCREMENT,
    `selector` char(12),
    `token` char(64),
    `userid` integer(11) not null UNSIGNED,
    `expires` datetime,
    PRIMARY KEY (`id`)
);
로그인 후 복사

로그인 후 처리

"기억하기" 옵션이 활성화된 상태로 로그인에 성공하면:

  • 12자 선택기를 생성합니다(예: base64_encode(random_bytes(9)) 사용).
  • 33바이트 인증자를 생성합니다(예: random_bytes(33) 사용).
  • 다음 값으로 쿠키를 설정합니다.

    'remember': $selector.':'.base64_encode($authenticator)
    로그인 후 복사
  • 선택기, 해시된 인증자, 사용자 ID 및 만료 날짜를 auth_tokens 데이터베이스 테이블에 저장합니다.

페이지 로드 시 재인증

사용자를 재인증하려면:

if (empty($_SESSION['userid']) && !empty($_COOKIE['remember'])) {
    list($selector, $authenticator) = explode(':', $_COOKIE['remember']);

    $row = $database->selectRow(
        "SELECT * FROM auth_tokens WHERE selector = ?",
        [
            $selector
        ]
    );

    if (hash_equals($row['token'], hash('sha256', base64_decode($authenticator)))) {
        $_SESSION['userid'] = $row['userid'];
        // Regenerate login token and update database
    }
}
로그인 후 복사

접근 방법 세부 정보

  • 충돌 방지: 선택기에 9바이트를 사용하면 72비트의 키스페이스가 제공되어 충분한 충돌 방지가 보장됩니다.
  • 가장 보호: 해시된 인증자를 데이터베이스에 저장하면 명의 도용 위험이 완화됩니다.
  • 타이밍 공격 대책: 비교하기 전에 인증자 값을 해싱하고 선택자와 인증자를 분리하여 타이밍 유출을 방지합니다.
  • 데이터베이스 보안: auth_tokens 테이블을 사용하면 만료된 토큰을 쉽게 삭제하고 만료하여 데이터베이스 무결성을 유지할 수 있습니다.

위 내용은 PHP와 쿠키를 사용하여 안전한 '기억하기' 기능을 구현하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿