
APM 구축이 완료되었으므로 html, php 를 활용하여 페이지를 만들어보려고 합니다. MySQL 에는 users, users_pw 테이블을 생성하여 id 와 pw 를 따로 분리하여 저장하도록 구성했습니다. pw 는 password_hash 를 사용하여 만들었습니다.
프로젝트 구조
/var/www/html/
├── assets/ # 정적 리소스
│ ├── img/ # 이미지 파일
│ └── style.css # 전역 스타일시트
│
├── inc/ # 공통 include 파일 (모듈)
│ ├── auth.php # 로그인 세션 체크 및 접근 제어
│ ├── config.php # DB 환경 설정 (비공개)
│ ├── db.php # PDO 연결용 DB 핸들러
│ ├── header.php # 공통 헤더 (HTML head, nav 등)
│ └── footer.php # 공통 푸터
│
└── public/ # 실제 접근 가능한 웹 루트
├── index.php # 메인 페이지 (로그인 후 접근)
├── login.php # 로그인 폼 및 처리
└── logout.php # 로그아웃 처리
소스코드
config.php (db 정보)
- db 정보를 저장할 변수 정의
<?php
define('DB_NAME', 'apmdb');
define('DB_USER', 'apmdb');
define('DB_PASS', 'password');
define('DB_DSN', 'mysql:unix_socket=/var/run/mysqld/mysqld.sock;dbname=' . DB_NAME . ';charset=utf8mb4');
db.php (db 연결)
- config.php 에서 db 정보 불러옴
- new PDO 클래스를 생성하여 MtSQL 서버와 연결
- Options
- ERRMODE_EXCEPTION : SQL 에러가 나면 예외(throw) 발생 -> 에러 디버깅
- FETCH_ASSOC : fetch() 시 결과를 연관 배열로 반환 -> $row['userid'] 형태
- EMULATE_PREPARES => false : MySQL 의 실제 prepared statement 사용 -> SQL 인젝션 방지
<?php
require_once __DIR__ . '/config.php';
try {
$pdo = new PDO(DB_DSN, DB_USER, DB_PASS, [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false,
]);
} catch (PDOException $e) {
error_log('DB Connection failed: ' . $e->getMessage());
http_response_code(500);
exit('Internal Server Error');
}
login.php (로그인 로직 및 페이지 html)
로직 : post 요청으로 id/pw 전송 -> users 테이블에 계정 존재 여부 확인 -> db에 저장된 pw 와 입력한 pw 를 password_verify 를 사용하여 비교 -> 맞으면 session 시작 및 저장 -> 틀리면 error 에 저장 후 로그인 페이지에서 에러문구 표기
- db 와 연결
- session_start() 로 세션 관리
- $_SESSION 에 userid 저장
<?php
require_once __DIR__ . '/../inc/auth.php';
require_once __DIR__ . '/../inc/db.php';
if($_SERVER['REQUEST_METHOD'] === 'POST') {
$id = $_POST['id'] ?? '';
$pw = $_POST['pw'] ?? '';
$stmt = $pdo->prepare('SELECT * FROM users WHERE userid = ? LIMIT 1');
$stmt->execute([$id]);
$user = $stmt->fetch();
if ($user) {
$stmt = $pdo->prepare('SELECT password_hash FROM users_pw WHERE userid = ? LIMIT 1');
$stmt->execute([$id]);
$pwRow = $stmt->fetch();
if ($pwRow && password_verify($pw, $pwRow['password_hash'])) {
$_SESSION['user'] = $id;
header('Location: /');
exit;
} else {
$error = '아이디 또는 비밀번호가 잘못되었습니다';
}
} else {
$error = '아이디 또는 비밀번호가 잘못되었습니다';
}
}
Index.php (로그인 후 접속하는 홈페이지)
- auth.php 에서 생성한 require_login() 함수를 통해 세션 체크
<?php
require_once __DIR__ . '/../inc/auth.php';
require_login(); // 로그인 안 된 상태면 login.php로 리다이렉트
include __DIR__ . '/../inc/header.php';
?>
<!doctype html>
<html lang="ko">
<head><meta charset="utf-8"><title>메인 페이지</title></head>
<body>
<h1>환영합니다, <?=htmlspecialchars($_SESSION['user'])?>님!</h1>
</body>
</html>
auth.php (세션 체크)
- session_status() 를 통해 상태 체크
- PHP_SESSION_DISABLED : 세션이 비활성화된 경우
- PHP_SESSION_NONE : 세션이 존재하지만 비활성 상태인 경우. 즉 세션이 있지만 session_start() 가 호출되지 않은 상태
- PHP_SESSION_ACTIVE : 세션이 활성 상태인 경우
- $_SESSION['user'] 가 비어 있으면 login.php 페이지로 이동
<?php
if (session_status() === PHP_SESSION_NONE) {
session_start();
}
function require_login() {
if (empty($_SESSION['user'])) {
header('Location: login.php');
exit;
}
}
'모의해킹' 카테고리의 다른 글
| [APM-AWS-2] MySQL 설치 / Lightsail (Ubuntu) (0) | 2025.10.20 |
|---|---|
| [APM-AWS-1] Apache2-PHP 설치 / Lightsail Ubuntu 24.04 (0) | 2025.10.16 |