[APM-AWS-3] PHP를 통한 웹서버 구축 (로그인/홈페이지 접속) - 코드포함

2025. 10. 20. 16:30·모의해킹

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
'모의해킹' 카테고리의 다른 글
  • [APM-AWS-2] MySQL 설치 / Lightsail (Ubuntu)
  • [APM-AWS-1] Apache2-PHP 설치 / Lightsail Ubuntu 24.04
coder_
coder_
어차피 할거 즐기자
  • coder_
    Good coder
    coder_
  • 전체
    오늘
    어제
    • 분류 전체보기 (41)
      • 인공지능 [AI] (3)
      • 모의해킹 (3)
      • Git (2)
      • Cloud (4)
      • 컴퓨터 과학 [CS] (3)
      • 데이터베이스 [DB] (2)
      • Nojde.js (4)
      • Javascript (3)
      • Django (4)
      • Code up (11)
        • 코드업 기초 100제 (9)
        • 단순 반복문 (2)
      • 백준 baek_joon (1)
        • 단계별 문제풀이 (1)
      • Web Scraping (1)
  • 블로그 메뉴

    • 글쓰기
    • 관리
  • 링크

    • 포트폴리오
    • GitHub
  • 공지사항

  • 인기 글

  • 태그

    Python
    파이썬
    llama3.1
    Linux
    기초 100제
    ubuntu 24.04
    code up
    기초100제
    코드업
    hugging face
    모의해킹
    ubuntu
    MariaDB
    Bastion host
    node.js
    Coding Test
    nodejs
    GCP
    Lightsail
    php
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
coder_
[APM-AWS-3] PHP를 통한 웹서버 구축 (로그인/홈페이지 접속) - 코드포함
상단으로

티스토리툴바