보안
프레임워크가 막아 주는 것과 애플리케이션이 책임지는 것이 분명히 나뉩니다. 보안 취약점을 발견하면 공개 이슈로 등록하지 말고 [email protected] 로 알려 주세요(제목에 [SECURITY]).
프레임워크가 제공하는 것
| 항목 | 내용 |
|---|---|
| SQL 인젝션 | 모든 DAO 쿼리가 PDO prepared statement로 실행 |
| 경로 조작 | 라우터 include 경로가 public/ 밖으로 나갈 수 없음 |
| 세션 무결성 | AES-256-CBC + HMAC-SHA256, 만료를 서버가 검증 |
| 세션 쿠키 | HttpOnly·SameSite 기본 적용, HTTPS에서 Secure 자동 |
| 컬럼 암호화 | @encrypt — 합성 IV(완전 일치 검색 가능), HMAC 검증, HKDF 키 유도 |
| 강제 로그아웃 | $SESSION_NOT_BEFORE로 전 세션 무효화 (무상태) |
애플리케이션이 책임지는 것
의도적으로 제공하지 않는 기능들입니다. 프레임워크가 막아 준다고 가정하지 마세요.
// CSRF — 토큰 기능이 없습니다. 상태를 바꾸는 요청은 직접 검증하세요.
// 출력 이스케이프 — 템플릿에 자동 이스케이프가 없습니다.
echo htmlspecialchars($user->getName(), ENT_QUOTES, 'UTF-8');
// 대량 할당 — $_POST 를 그대로 넘기면 id·role 까지 덮입니다.
$user->setByArray(array_intersect_key($_POST, array_flip(['name', 'email'])));
// 직렬화 — getArray()/getJson() 은 기본적으로 모든 게터를 포함합니다.
/** @exclude_from_get_array */
public function getPasswordHash(): string { ... }
이 밖에 리다이렉트 대상 검증, SSRF 차단, HTML 새니타이징, 보안 헤더도 애플리케이션 몫입니다.
HtmlUtil::stripSpecificTag()계열은 정규식 기반이라 XSS 필터가 아닙니다. 태그 정리를 위한 편의 함수일 뿐입니다.