설명
로그인 함수나 컨트롤러 메서드에서 로그인 성공 후 기존 세션 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를 저장합니다.