세션
Flexagon의 세션은 서버 파일이 아니라 암호화된 쿠키에 모델 객체를 직렬화해 담습니다. 세션 스토리지를 공유할 필요가 없으므로 여러 대의 웹 서버로 수평 확장할 때 별도 구성이 필요 없습니다.
설정
// application/_Config.php
_Global::$SESSION_AUTO_START = true;
_Global::$SESSION_ENCRYPTION_STRING = Env::required('SESSION_ENCRYPTION_STRING'); // .env.php 에서
_Global::$SESSION_DOMAIN = '.example.com';
_Global::$SESSION_TIMEOUT_SECONDS = 86400;
// 쿠키 보안 속성 — 기본값이 이미 안전하므로 보통 건드릴 필요가 없습니다.
_Global::$SESSION_COOKIE_SECURE = null; // null = HTTPS 요청이면 자동으로 켬
_Global::$SESSION_COOKIE_HTTPONLY = true; // JS 에서 세션 쿠키를 읽지 못하게
_Global::$SESSION_COOKIE_SAMESITE = 'Lax';
세션 쿠키는 로그인 상태를 담으므로 기본적으로 HttpOnly와 SameSite=Lax가 붙고, HTTPS 요청에서는 Secure까지 자동으로 붙습니다. Secure 판정은 $_SERVER['HTTPS'], 포트 443, X-Forwarded-Proto 순으로 확인합니다.
세션 모델과 DAO
<?php
namespace Session;
use _Flexagon\Base\BaseModel;
class SessionUserModel extends BaseModel {
private string $role = 'USER';
private ?string $username = '';
private ?string $email = '';
// 게터 / 세터 ...
}
<?php
namespace Session;
use _Flexagon\Base\BaseSessionDAO;
class SessionDAO extends BaseSessionDAO {}
사용
// 로그인
$sessionUser = new SessionUserModel();
$sessionUser->setUsername($user->getUsername());
$sessionUser->setRole('ADMIN');
$sessionDAO = new SessionDAO();
$sessionDAO->makeSession($sessionUser);
// 로그아웃
$sessionDAO->cleanSession();
$SESSION_AUTO_START가 켜져 있으면 부팅 시 세션이 복원되어 두 곳에 담깁니다.
_Global::$SESSION_MODEL; // 항상 여기에 들어감
_Global::$SESSION_USER_MODEL; // 클래스명 기반 전역 (아래 참조)
두 번째 형태는 모델 클래스명을 UPPER_SNAKE_CASE로 변환한 이름입니다 (SessionUserModel → SESSION_USER_MODEL). 타입 힌트가 붙은 채로 접근하려면 _Global에 해당 정적 프로퍼티를 미리 선언해 두어야 합니다.
class _Global extends BaseGlobal {
public static ?\Session\SessionUserModel $SESSION_USER_MODEL = null;
}
_prepare.php에서 인가 검사를 하는 것이 일반적인 패턴입니다.
<?php
// public/_prepare.php
if (str_starts_with(_Global::$URL_PARAM->filePath, 'admin/')) {
if (_Global::$SESSION_USER_MODEL?->getRole() !== 'ADMIN') {
\_Flexagon\Libs\HtmlUtil::redirectPage('/login');
}
}
주의
@encrypt가 붙은 세션 모델 프로퍼티는 쿠키 안에서 이중 암호화됩니다. 세션 쿠키 전체가 이미$SESSION_ENCRYPTION_STRING으로 암호화되므로, 대부분의 경우 추가 지정은 불필요합니다.