로그인 후 세션 ID 미재발급

로그인 후 세션 ID 미재발급

설명

로그인 함수나 컨트롤러 메서드에서 로그인 성공 후 기존 세션 ID를 그대로 사용하면 공격자가 미리 고정한 세션 ID를 피해자 인증 세션으로 승격시킬 수 있습니다. 인증 상태를 세션에 기록하기 전에 새 세션 ID를 발급해야 합니다.

잠재적 영향

  • 세션 고정 공격을 통한 계정 탈취
  • 인증 전 세션 ID의 인증 세션 재사용
  • 공유 브라우저 또는 링크 유도 공격에서 세션 오용

해결 방법

  • 인증 성공 직후 세션 ID를 재발급하고 성공 여부를 확인하세요. 예시의 session_regenerate_id(true)는 이전 세션 데이터를 삭제합니다. 동시 요청이나 불안정한 연결이 있는 환경에서는 이전 ID의 접근 제한과 전환 처리를 별도로 설계하세요.
  • 재발급 후에만 사용자 ID, 권한, 인증 플래그를 $_SESSION에 저장합니다.
  • 로그아웃 시 세션 데이터를 삭제하고 세션 쿠키도 만료시킵니다.

예시

세션을 이미 시작하고 사용자 인증에 성공한 뒤 실행하는 일부 코드입니다. $user는 인증을 마친 사용자 정보입니다.

변경 전

php
<?php
class AuthController {
    public function login($user) {
        $_SESSION['user_id'] = $user['id'];
    }
}

변경 후

php
<?php
class AuthController {
    public function login($user) {
        if (!session_regenerate_id(true)) {
            throw new RuntimeException('Session ID regeneration failed');
        }
        $_SESSION['user_id'] = $user['id'];
    }
}

설명:

  • 변경 전: 로그인 또는 인증 성공 후 기존 세션 ID를 그대로 사용하면 공격자가 미리 고정한 세션 ID를 피해자 인증 세션으로 승격시킬 수 있습니다.
  • 변경 후: 세션 ID 재발급이 성공한 뒤에만 인증된 사용자 ID를 저장합니다.

참조