세션

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으로 암호화되므로, 대부분의 경우 추가 지정은 불필요합니다.