old/Cyber Security

APM(Apache2, Php, Mysql) 기반 로그인 인증 웹사이트 만들기

은색거북이 2023. 4. 17. 13:32
반응형

목적

PHP에서 기본적으로 제공하는 세션을 이용하여 로그인하는 방식으로 APM(Apache2, Php, Mysql)로 로그인인증을 하는 웹싸이트를 제작합니다.

  1. 로그인 기능 구현
  2. 메인 페이지 구현
    • 로그인 되어야만 들어갈 수 있는 화면.
    • 현재 누구로 로그인 되어있는지 알려주기.
  3. 로그아웃 기능 구현
  4. 회원가입 기능 구현
    • ID 중복 검사 기능
    • ID, PWD 빈칸 검사

세션아이디는 임의로 유저 아이디를 사용합니다.

*참고:

우분투에 APM: Apache, PHP, MySQL 환경 셋팅

데이터베이스 (MySQL) 셋팅

서버이름 = "localhost"

데이터베이스 이름 = "test"

데이터베이스 User name = "root"

데이터베이스 Password= "1234"

테이블 이름 = “users”

admin 아이디= “admin”

admin 비밀번호= “admin”

steps

  • mysql 사용자로 db생성
mysqladmin -u root create test -p
  • mysql 사용자 접속
mysql -u root -p
  • root 계정 비번 설정: 이미 설정했다면 그 비밀번호 삽입.
use mysql; 
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '1234';
  • 사용 디비 설정
use test;
  • 테이블 생성
create table users( 
	id int primary key auto_increment, 
	user_id varchar(255), 
	user_pwd varchar(255) 
);
  • 테이블에 기본 admin 계정 넣기
insert into users (user_id, user_pwd) values ('admin','admin');
  • 테이블 데이터 확인
select * from users;
  • db설정 종료
quit;
  • mysql 서버 실행
service mysql start
  • 아파치 서버도 실행
# 아파치 서버 시작 
sudo service apache2 start 
# 아파치 서버 중지 
sudo service apache2 stop 
# 아파치 서버 재시작 
sudo service apache2 restart

code

Main.php

<?php
session_start(); // 세션 시작
 
if(!isset($_SESSION['user_id'])) // 로그인되어있지 않다면
{
    header ('Location: ./login.html'); // 로그인 페이지로 이동
}
 
echo "<h2>로그인 성공</h2><br><h2>";
echo $_SESSION['user_id'];
echo " 님 안녕하세요</h2><br><br>"; // 로그인한 사용자의 이름 출력
echo "<a href=logout.php>로그아웃</a>"; // 로그아웃 링크 출력
 
?>

login.html

<html>
<head>
    <title>login page</title>
    <meta charset="utf-8">
</head>
<body>
    <form method="post" action="/login_chk.php">
        <div>
            <label for="user_id">ID </label>
            <input type="text" name="user_id"/>
        </div>
        <div>
            <label for="user_pwd">Password </label>
            <input type="text" name="user_pwd"/>
        </div>
        
        <div class="button">
            <button type="submit"> login </button>
        </div>
    </form>
    <button onclick="location.href='sign_up.html'"> sign up </button>
</body>
</html>

login_chk.php

<?php
session_start(); // 세션 시작

$id = $_POST['user_id']; // 사용자가 제출한 ID
$pw = $_POST['user_pwd']; // 사용자가 제출한 비밀번호

$servername = "localhost"; // 서버 이름
$username = "root"; // 사용자 이름
$password = "1234"; // 비밀번호
$dbname = "test"; // 데이터베이스 이름

// 데이터베이스 연결
$conn = new mysqli($servername, $username, $password, $dbname);

// 데이터베이스 연결 확인
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}

// 입력한 ID를 가진 사용자 정보를 가져옴
$sql = "SELECT * FROM users WHERE user_id='$id'";
$result = $conn->query($sql);

// 사용자 정보가 존재하는 경우
if($result->num_rows == 1){
    $row = $result->fetch_array(MYSQLI_ASSOC); 
    // 입력한 비밀번호가 맞는 경우
    if($row['user_pwd'] == $pw){  
        $_SESSION['user_id'] = $id;           
        // 세션 저장 성공한 경우
        if(isset($_SESSION['user_id'])){    
            header('Location: ./Main.php');   
        }
        else{
            echo "세션 저장 실패";
        }            
    }
    // 입력한 비밀번호가 틀린 경우
    else{
        echo "잘못된 아이디 또는 비밀번호입니다.";
        header('Location: ./login.html');
    }
}
// 사용자 정보가 존재하지 않는 경우
else{
    echo "잘못된 아이디 또는 비밀번호입니다.";
    header('Location: ./login.html');
}

$conn->close(); // 데이터베이스 연결 종료
?>

sign_up.html

<html>
<head>
    <title> Sign Up </title>
    <meta charset="utf-8">
</head>
<body>
    <form action = "./sign_up.php" method="post">
        <div>
            <label for="user_id"> ID </label>
            <input type="text" name="user_id"/>
        </div>
        <div>
            <label for="user_pwd"> PW </label>
            <input type="text" name="user_pwd"/>
        </div>

        <div class="button">
            <input type="submit" value="submit">
        </div>
    </form>
</body>
</html>

sign_up.php

<?php
$id = $_POST['user_id']; // 사용자가 입력한 ID
$pw = $_POST['user_pwd']; // 사용자가 입력한 비밀번호
 
if($id==NULL || $pw==NULL) // 입력한 값이 빈칸인 경우
{
    echo "빈 칸을 모두 채워주세요";
    echo "<a href=sign_up.html>back page</a>";
    exit();
}

$servername = "localhost"; // 서버 이름
$username = "root"; // 사용자 이름
$password = "1234"; // 비밀번호
$dbname = "test"; // 데이터베이스 이름

// 데이터베이스 연결
$conn = new mysqli($servername, $username, $password, $dbname);

// 데이터베이스 연결 확인
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}

// 입력한 ID가 이미 존재하는 경우
$sql = "SELECT * FROM users WHERE user_id='$id'";
$result = $conn->query($sql);

if($result->num_rows == 1)
{
    echo "중복된 ID입니다.";
    echo "<a href=sign_up.html>back page</a>";
    exit();
}

// 새로운 사용자 정보를 데이터베이스에 추가
$sql = "INSERT INTO users (user_id, user_pwd) VALUES ('$id', '$pw')";
$signup = mysqli_query($conn, $sql);

// 회원가입이 성공적으로 처리된 경우
if($signup)
{
    echo "회원가입이 완료되었습니다.";
}
 
$conn->close(); // 데이터베이스 연결 종료
?>

logout.php

<?php
session_start(); // 세션 시작

$res = session_destroy(); // 모든 세션 변수 지우기

if($res)
{
    header('Location: ./Main.php'); // 로그아웃 성공 시 로그인 페이지로 이동
}
?>
반응형